pax_global_header00006660000000000000000000000064124542465570014530gustar00rootroot0000000000000052 comment=29fa1e552a612627fc347119925567f2f923ac71 DarkRadiant-2.0.2/000077500000000000000000000000001245424655700137155ustar00rootroot00000000000000DarkRadiant-2.0.2/.gitattributes000066400000000000000000000007431245424655700166140ustar00rootroot00000000000000# Auto detect text files and perform LF normalization * text=auto # Custom for Visual Studio *.cs diff=csharp *.sln merge=union *.csproj merge=union *.vbproj merge=union *.fsproj merge=union *.dbproj merge=union # Standard to msysgit *.doc diff=astextplain *.DOC diff=astextplain *.docx diff=astextplain *.DOCX diff=astextplain *.dot diff=astextplain *.DOT diff=astextplain *.pdf diff=astextplain *.PDF diff=astextplain *.rtf diff=astextplain *.RTF diff=astextplain DarkRadiant-2.0.2/.gitignore000066400000000000000000000006761245424655700157160ustar00rootroot00000000000000# Linux build files *.o *.lo *.la Makefile .libs .deps # Editor temporary files *.swp # Windows directories w32deps w64deps build # Windows build files *.dll *.pdb *.exe *.exp *.lib # Windows Visual Studio stuff *.user DarkRadiant.opensdf DarkRadiant.sdf gtkrc testsuite.ilk # VS 2012 /winbuild /tools\msvc2012/ipch /tools\msvc2012/Debug *.psess *.suo /tools\msvc2010/ipch /tools\msvc2012/ipch *.ipch *.dirstamp /tools/innosetup/*.7z *.vspx DarkRadiant-2.0.2/AUTHORS000066400000000000000000000032261245424655700147700ustar00rootroot00000000000000 OrbWeaver greebo STiFU mohij angua Crispy Gildoran Jesps (Bulge patch algorithm) GtkRadiant CONTRIBUTORS and CREDITS last update: 09/12/2004 ======================= Loki ---- Leonardo Zide leo@lokigames.com Mike Phillips (Loki QA) Bernd Kreimeier (overall coordination) QER.com ------- TTimo timo@idsoftware.com ^Fishman (Pablo Zurita) fish@gamedesign.net RR2DO2 rr2do2@q3f.com SmallPileofGibs spog@planetquake.com Curry plugin ------------ Mike "mickey" Jackman Tim "Maj" Rennie PrtView plugin, various bug fixes and q3map guru ------------------------------------------------ Geoffrey DeWan Gensurf plugin -------------- David Hyde PicoModel --------- seaw0lf with assist by ydnar Q3Map2 ------ Randy 'ydnar' Reddig Updated shader files, textures, entities.def, keyboard shortcut list overall testing and feedback ---------------------------- Jean-Francois "Eutectic" Groleau Improvements and bug fixing --------------------------- Jan Paul "MrElusive" van Waveren Robert Duffy Forest "LordHavoc" Wroncy-Hale Nurail AcidDeath Chronos Michael Schlueter Jamie Wilkinson Robert "Tr3B" Beckebans Web --- Dave "Bargle" Koenig Jason "Wolfen" Spencer Shawn "EvilTypeGuy" Walker Thanks to John Hutton, AstroCreep and W2k for web help FAQ --- Equim and Wex Testing/Feedback --- Black_Dog, d0nkey, Fjoggis, Jago, jetscreamer, gibbie, Godmil, Gom Jabbar, Mindlink, mslaf, necros, Promit, Ravo, RPG, scampie, sock, sponge, thiste, voodoochopsticks, Zwiffle Misc ---- Thanks to everyone on the beta mailing list and irc.telefragged.com #qeradiant for testing and feedback. Updated icons by AstroCreep! Bitch-slapping by RaYGunn! Last minute bugs by SPoG! (SPoG--) DarkRadiant-2.0.2/ChangeLog000066400000000000000000011536431245424655700155040ustar00rootroot0000000000000028/06/2008 greebo - Rewrote Namespace module to allow for more intelligent behaviour when updating entity names. All spawnargs pointing to a certain name are properly updated when that name changes. 05/04/2008 greebo - Added support for layers. All items in the scenegraph can be assigned to one or more layers now and the information gets saved along with the map (into a .darkradiant file). 19/03/2008 greebo - Refactored scenegraph elements: removed scene::Instances, all the objects are scene::INodes now. 03/02/2008 greebo - Added Difficulty Editor plugin (specific to Dark Mod). 23/11/2007 greebo - Added plugin for communication with the Doom3/DarkMod engine. DarkRadiant can now send dmap/runaas commands to the engine and display the dmapping output in its own console. 03/10/2007 greebo - Revamped the entire module system based on OrbWeaver's design. 10/07/2007 mohij - Added "Add Monsterclip brush" option to ModelSelector and the context menu of the orthoviews. 14/06/2007 greebo - Added vertex editing support for curves (NURBS, CatmullRom). 13/06/2007 mohij - Improved support for MapExpressions. All Doom3-related keywords like addnormals(), makeIntensity(), etc. are correctly recognised and processed (recursively). 24/05/2007 greebo - Added sound playback ability to SoundManager module, sounds can be previewed via the SoundChooser GUI. 12/05/2007 greebo - Removed templated TypeCast system in favour of dynamic_cast<>. 01/05/2007 greebo - Fixed insert/delete patch rows and columns command and added "Append rows/columns" feature (extrapolation). ** RELEASE 0.9.0 29/04/2007 OrbWeaver - Property editors for Sound, Model, Skin and Texture selection no longer require explicit Apply button. - Static models use GL Display Lists for improved rendering performance. 16/04/2007 greebo - Added Stim/Response Editor plugin (The Dark Mod-specific) 12/04/2007 greebo - Added support for DXT5 RxGB DDS files. 08/04/2007 OrbWeaver - Added SoundSelector to choose sound shaders via the Entity Inspector 23/03/2007 greebo - Removed old preference system completely in favour of the XMLRegistry. - Game Selection at startup is hopefully handled more userfriendly. 15/03/2007 greebo - Added "Jump to Object" mouse command (Alt-RMB) to jump to the clicked object in the camview. 14/03/2007 greebo - Removed old TextureClipboard in favour of the new ShaderClipboard. Added Copy/Paste Shader commands to the menu / removed the old ones. 13/03/2007 OrbWeaver - Added axis rotation to model preview so that models are displayed front-on rather than top-down. - Per-instance model skinning allows instances of the same model to have a different skin. 12/03/2007 greebo - Added Load/Save Prefab commands and fixed their handling of entity child brushes. 09/03/2007 greebo - Replaced ArbitraryRotation and ArbitraryScale dialogs with new TransformationDialog. 08/03/2007 greebo - Rewrote broken "Find & Replace Shader" dialog. 06/03/2007 greebo - Added "Export CollisionModel" feature to create .cm files from brushes. 04/03/2007 greebo - Added Select Complete Tall feature. 03/03/2007 OrbWeaver - Fixed entity class inheritance, entities now list custom properties in the Entity Inspector's "Add property" dialog. 03/03/2007 greebo - Added support for manipulation of func_static-style entities - Added "Revert To Worldspawn" method to the orthocontext menu. - Added feature allowing Map Position saving (10 slots) 28/02/2007 greebo - Holding down SHIFT during manipulations constrains the operation to the axes - Added GroupCycle commands that allow cycling through child primitives of entities like func_static. 26/02/2007 greebo - Rewrote Patch Inspector - Disabled Scale Manipulator 23/02/2007 greebo - Added "Normalise Texture" command that translates textures towards the origin without changing their appearance. - Rewrote Texture Tool (supports various manipulations of patches and brush faces). 19/02/2007 OrbWeaver - Entity Inspector allows sorting by key or value. 18/02/2007 OrbWeaver - Light Inspector uses white as a default colour (rather than black) for lights with no explicit colour key. greebo - Rewrote Surface Inspector (handles both brushes and patches now). 16/02/2007 OrbWeaver - Filter system now affects static models in the camera view. - Static models in camera view display with their correct skins. greebo - Added "Stitch Patch Textures" feature to snap texture coords of adjacent patches. 15/02/2007 OrbWeaver - Save and load dialogs now activate on Enter key. - ".map" extension appended to saved map files if not specified in dialog. - Fixed crash when Colours dialog is closed with X button. 13/02/2007 greebo - Added "Patch Thicken" feature. 12/02/2007 greebo - Added Entity Selection Mode Toggle to limit mouse operations to entities. - Added Flip X / Flip Y texture commands. - Fixed Scale Manipulator for brushes. - Entity List Selection now focuses the camera and orthoviews on the selected entity. 11/02/2007 greebo - Added ability to cancel transformation operations by hitting ESC. 08/02/1007 OrbWeaver - Added GUI to edit background image, accessed from View menu - Fixed crash when loading a .BAK copy of a map file - Changing an entity keyvalue now correctly sets the "map modified" flag 29/01/2007 greebo - Added option to show a background image in orthoviews. - Camera position is saved and restored upon map load. ** RELEASE 0.8.1 28/01/2007 OrbWeaver - Fixed crash when SkinChooser displayed for an AI rather than a static model. - Fixed assertion failure when shutting down after browsing some textures in the Media Browser. greebo - Fixed assertion failure when switching render modes while freelook mode was active. - Fixed inability to display Entity Inspector due to double-binding of the shortcut. ** RELEASE 0.8.0 26/01/2007 OrbWeaver - Fixed leaks in saved maps caused by use of "_emptyname" instead of "_default" 20/01/2007 greebo - Added shortcut editor / refactored command & event system 06/01/2007 OrbWeaver - Added skin chooser dialog for entity inspector, allows selection of arbitrary skins for a model. 05/01/2007 OrbWeaver - Fixed bug causing parse failure of .mtr files with recursive map expressions. greebo - Multiple orthogonal views can now be created. 15/12/2006 OrbWeaver - Added Light Inspector. 07/12/2006 greebo - Added draggable projected lights. - Improve patch texturing, allows "natural" projection to match the surface of the patch 25/11/2006 OrbWeaver - Entity chooser now uses a key in the DEF to specify a container folder, for full hierarchical organisation of entities. ** RELEASE 0.7.1 24/11/2006 OrbWeaver - Entity inspector can show inherited properties from entity class. - Map loading now shows progress indicator. - Entity usage information now displayed in Entity Browser. greebo - Moved "Export to OBJ" functionality into main Edit menu. 17/11/2006 OrbWeaver - Fixed problem with objects from DarkRadiant maps disappearing in DoomEdit (DoomEdit requires dummy brushes in brushless entities). - Entity class manager moved into separate module (eclassmgr). 13/11/2006 OrbWeaver - Fixed segfault when InvertSelection called on an empty map (or any other situation where the root node became selected). - Fixed segfault when a light with a rendered light_center is selected and the showAllLightRadii option is active. ** RELEASE 0.7.0 01/11/2006 greebo - Moved colour schemes to user.xml, added Colour Scheme Editor dialog. 27/10/2006 OrbWeaver - Simplified/enhanced Entity Inspector. 24/10/2006 OrbWeaver - Added new XML-based filter system. - Fixed incorrect polycounts for LWO models. - Added Media Browser. greebo - Added application-wide XML registry. 15/10/2006 greebo - Added toolbar button to display all light volumes. - Toolbars use XML config file rather than hard-coding. 13/10/2006 OrbWeaver - Fixed assertion failure when loading a map with a "name" key set on the worldspawn (due to incorrect identification as a model entity). 08/10/2006 OrbWeaver - Merged upstream revisions 99 and 101 - Merged upstream brushexport plugin (exports to OBJ) - Merged upstream revision 113 (select inside and select touching) greebo - Refactored parsing code in shaders plugin, DefTokeniser accepts list of delimiters in constructor. ** RELEASE 0.6.0 29/09/2006 OrbWeaver - Added Model Selector dialog with preview - func_static entities created from brushes have "origin" key set correctly - Fixed segfault in picomodel ASE loading code when a subset of submeshes had vertex colours. 03/09/2006 Crispy - Added texture window toolbar and button to clamp textures to constant size OrbWeaver - Fixed problems with material names using mixed case not being displayed on brushes - textures/common/collision now filtered out by Filter->Clips 27/08/2006 Crispy - Removal of OpenGLBinding in favour of standard GLEW library for extension processing ** RELEASE 0.5.3 - Bugfix: selected brushes now parented to func_static and other entities - Light texture selector highlights current shader ** RELEASE 0.5.2 16/08/2006 - Fixed lighting renderer for surfaces missing bump/specular maps 15/08/2006 - Load DDS textures from correct path ("dds/") 14/08/2006 - Ambient lighting implemented in renderer 13/08/2006 - Added light scale parameter to renderer and .game file 06/08/2006 - Added light texture selection PropertyEditor and chooser dialog ** RELEASE 0.5.1 23/07/2006 - Added new context menu with options to add light, model or entity, along with new dialog for selecting an entity class to create. 22/07/2006 - Merged GtkRadiant fix for func_static dragging issue 21/07/2006 - Fixed missing shaders on ASE models 17/07/2006 - Entity keyval changes now undoable and correctly set "map changed" flag to allow saving. 16/07/2006 - Removed .xlink processing code which causes crashes on Windows 2000 ** RELEASE 0.5.0 16/07/2006 - Fixed save function silently failing when .map cannot be renamed to .bak before save - Changed EntityInspector from a GtkPaned to a GtkVBox, adjusted size requests to allow for shrinkage on low-res displays. ** RELEASE 0.5pre3 15/07/2006 - Added ColourPropertyEditor for selection of entity colours using a GtkColorButton ** RELEASE 0.5pre2 14/07/2006 OrbWeaver - Removed EntityAttributes for light, all attributes now explicit keyvals 11/06/2006 SPoG - Fixed arbitrary rotation X and Y axes appearing to be transposed. 04/06/2006 SPoG - Fixed crash when deleting items from Build menu. 03/06/2006 SPoG - Changed doom3 entity creation to add model key for brush-entities. - Fixed crash in Save Region. - Fixed detail brushes being turned structural when texture is set. 29/05/2006 SPoG - Changed default doom3 light_radius to be taken from the entity-definition. - Fixed error when entering and exiting camera freemove with LMB pressed. http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=1090 13/05/2006 LordHavoc - Added -fPIC for Linux builds to support x86_64. - Removed static-linked libstdc++ hack for non-final builds. - Removed gcc explicit linking hack for non-final builds. - Added workaround for gcc static-member-pointer-as-template-argument bug. - Fixed bobtoolz linux compile errors. - Added Nexuiz and Darkplaces support. SPoG - Changed 'inconsistent vertex count' assert to be non-fatal. - Changed 'failed to remove accelerator' assert to be non-fatal. - Fixed crash due to broken module dependencies. - Fixed default settings for Build Monitoring. - Fixed nudge-selection when using the drag tool mode. - Added support for patches in texture-painting tool. 30/04/2006 SPoG - Fixed memory leak in signals library. - Ported bobtoolz to use new module APIs. 01/04/2006 SPoG - Added key-observer interface to entity module API. - Rewrote callback library to add support for return-values. - Added minimal API to support bobtoolz plugin. - Refactored brush for-each functions to take Functor instead of Visitor. - Added signals library. 31/03/2006 SPoG - Changed doom3 light creation to use size of selected brushes. 20/03/2006 SPoG - Fixed crash when resetting preferences after startup failure. - Fixed crash on next-leak-spot with build-monitoring enabled. - Fixed doom3/quake4 blended-decal rendering when toggling lighting mode. - Fixed fit-texture with rotated texture transforms. 20/03/2006 SPoG - Changed Copy/Paste to work on face textures if any faces are selected. - Fixed GTK_WIDGET_REALIZED assert when selecting entities (linux). 28/02/2006 namespace, SPoG - Added drag-resizing for doom3/quake4 light_radius boxes. 25/02/2006 SPoG - Fixed objects sometimes dissappearing when at high zoom level in Ortho views. 24/02/2006 SPoG - Added GPL text to win32 installer. - Fixed gtk wimp theme not working after using gtkthemeselector. 21/02/2006 namespace - Added command to toggle lighting/textured modes, shortcut F3. 20/02/2006 SPoG - Fixed crash when disabling lighting for a second time. 19/02/2006 SPoG - Fixed crash when loading invalid ASE models. 11/02/2006 SPoG - Added install.py script. - Updated COMPILING instructions. - Fixed transparency rendering on quake3 shaders. - Fixed hint/caulk filtering for Jedi Academy shaders. 04/02/2006 SPoG - Added Radiant Manual shortcut to win32 installation. - Added 'use alternative texture projection' option to prefs. - Fixed caching bug causing import-map to not reload modified maps. - Added blended-decal rendering for doom3 and quake4. 30/01/2006 SPoG - Added expand-selection-to-entities with default shortcut ctrl+alt+e. - Fixed crash in gtk file-chooser with some versions of GTK+. 29/01/2006 SPoG - Changed create-group-entity to re-select brushes after creation. 26/01/2006 SPoG - Changed far-clip-plane setting to increase exponentially with distance. - Fixed selected entities moving when drag-resizing brushes. - Changed patches to be selectable from the back in wireframe views. - Speed improvements for transform-selection code. 25/01/2006 SPoG - Added default-texture-scale option to preferences. - Added default-grid-spacing option to preferences. 23/01/2006 Shamus - Fixed editing of doom3/quake4 faces with negative texture scale factors. 22/01/2006 SPoG - Fixed shortcut for toggle-far-clip. - Fixed broken link in 1.5 user docs. 10/01/2006 SPoG - Changed script parser to ignore comments that start in the middle of tokens. - Added support for editor_int/editor_string keys in doom3 entity definitions. - Changed doom3/quake4 .mtr and .guide searching to look in subfolders. - Added experimental support for doom3/quake4 projected lights. 20/12/2005 SPoG - Added support for quake4 .guide material templates. - Fixed GCC4 compile errors with anonymous enums. - Added light_radius and light_center GUI to doom3 entity inspector. 10/12/2005 SPoG - Added support for loading and saving Quake4 map format. - Added support for built-in shader images such as _noFalloff. - Added experimental code to render projected lights. - Added support for loading quake4 entity definitions. - Fixed picomodel bug loading .lwo files with texture names >64 in length. 22/10/2005 SPoG - Fixed minor memory leak in zip-archive reader. 21/10/2005 SPoG - Fixed model rotation using free-rotation tool. - Fixed behaviour of angle/rotation keys for Doom3 entities. - Added entity angle-editing for entities that display a model. - Stopped size-info being drawn if selection has zero size. - Added support for 'angle' key on doom3 entities. 20/10/2005 SPoG - Fixed minor one-time memory leak in build-shader-list. - Added functional free-scale tool. - Improved precision preservation for free-rotation and free-scale tools. - Fixed misc_model rotation using free-rotation tool. 09/10/2005 SPoG - Added entity angle-editing using rotate-tool or rotation toolbar buttons. - Fixed start-on-primary-monitor (win32). - Fixed camera-view freelook when window is on secondary monitor (win32). 05/10/2005 paxed - Added texture-lock toolbar button. SPoG - Added stack-trace output to all debug popup messages (win32). - Fixed vertex/edge selection behaviour on undoing brush edits. - Changed doom3 light centre rendering to use a point instead of a box. - Changed map and shader parsers to gracefully handle bad data. 24/09/2005 SPoG - Fixed crash when importing a file after deleting the world entity. - Changed copy/paste/import to select world brushes instead of world entity. - Added win32-specific stack-trace logging support. 31/08/2005 SPoG - Fixed clipper removing brushes on incorrect side of clip-plane when flipped. 21/08/2005 SPoG - Optimised light-dragging. - Changed connect-entities to not break existing connections where possible. 24/07/2005 SPoG - Fixed q3 entity definition for item_health_small. 02/07/2005 SPoG - Fixed build menu becoming empty if editing of default menu is cancelled. 01/07/2005 SPoG - Fixed snap-planes-to-integer preference not being saved. 26/06/2005 SPoG - Changed doom3 light_radius box to draw flat-shaded translucent in camera view. - Fixed progress window not being shown when loading maps. - Refactored shortcut handling to make focussed widgets override global shortcuts. Allows using ctrl+c to copy console text, undo/redo without main-window focus. 23/06/2005 SPoG - Fixed crash when handling assert/error before gtk_init. - Changed Help menu to display only the help menu relevant to the current game. 21/06/2005 SPoG - Fixed double-maps-directory when using non-native file open dialog on win32. - Changed find/replace-textures window to update when selecting textures with MMB. - Fixed handling of non-UTF-8 wad-names in textures menu. 20/06/2005 SPoG - Changed home-path prefix to be optional on linux/osx for q1/q2. - Changed OpenGL module to work correctly with GL_VERSION 2.0.0. - Fixed spawnflags in Enemy Territory entity definitions. - Added missing Enemy Territory entity types. 19/06/2005 SPoG - Changed clipper-point selection/rendering to behave the same at all zoom levels. - Changed clipper-point selection to always pick the closest point to the cursor. - Fixed clipper colour not being updated until after restarting. - Fixed QE tool not deselecting edges when left-clicking on a vertex without shift. - Fixed grid rendering with grid settings other than 8-unit. - Fixed textures menu always behaving as if show-shaderlist-only is enabled. 18/06/2005 SPoG - Added saving of camera render mode preference. - Changed default camera render mode to Textured for Doom3. - Changed default texture render mode to Trilinear. 17/06/2005 SPoG - Ported Team Arena entity definitions to xml format. - Added xml q3 entity-definitions to win32 and linux setups. 14/06/2005 SPoG - Fixed QE-tool component-drag selecting components of unselected brushes. 13/06/2005 SPoG - Changed clipper mode and component-editing modes to be mutually exclusive. - Changed camera A/Z/D/C keys to obey "discrete movement" checkbox. - Added support for up/down movement in freelook mode. - Fixed clipper-tool-uses-caulk option. - Added prompt for engine path at startup if not found. 12/06/2005 SPoG - Added entity-inspector GUI support for func_button/func_door direction attribute. - Added angle/model/sound GUI to entity-inspector for old-style entity-definitions. - Added clipper-plane rendering using stippled back-face-culled polygon. - Fixed entity-inspector failing to handle non-ascii characters in entity keys. 11/06/2005 SPoG - Fixed entity-inspector window position changing while hidden. 09/06/2005 SPoG - Fixed region-set-selected for model entities. 08/06/2005 SPoG - Added option to enable or disable snapping brush planes to integer on map load/save. - Added 0.125 grid. - Changed grid rendering to always show major/minor grid colours whatever the zoom level. - Increased maximum zoom level for XY views. 06/06/2005 SPoG - Added 'File > Refresh models' - reloads models that have changed outside Radiant. 05/06/2005 SPoG - Fixed model files not being closed after being read. - Fixed build menu dialog not saving changes to build commands. - Changed build menu to save xml only if changed by user. - Fixed CSG-merge. - Reduced CSG-merge tolerance for misaligned brushes. Michael Kluskens - Updated STVEF default build menu to version 2 format. - Updated STVEF game configuration file and removed synapse.config. 02/04/2005 SPoG - Changed HashTable insert/remove operations to not invalidate iterators. - Changed ReferenceCache realise/unrealise to take advantage of new HashTable behaviour. - Refactored containers to use std::swap. - Refactored bitfield.h. Tr3B - Fixed endianness for .lwo loading on linux. - Extended q3map2 mathlib functionality. 28/03/2005 SPoG - Specialised filters list for doom3 entity/material types. - Added ASE-loader support for shader names specified as a bitmap absolute-path. - Fixed monitored-compile debug-feedback display. - Added TGA-loader support for vertical and horizontal flipping. - Enabled auto-generation of smooth normals for all LWO models. 27/03/2005 Tr3B - Fixed map-xml module. - Added support for qer_trans keyword in doom3 materials. 08/03/2005 SPoG - Added GUI updates during map load and engine-path/game-dir changes. - Fixed main window being hidden behind another application on closing a floating window. 07/03/2005 SPoG - Fixed crash when selecting the root node in the entity-list window. - Fixed detail flag saving for quake3 map format. 06/03/2005 SPoG - Optimised type-casts for scene-graph type system. - Disabled substitution of 'unspecified' for entity key values that match the default. - Refactored module-system api - added globalModuleServer(). - Fixed rotation origin for doom3 func_static models. 05/03/2005 SPoG - Added support for doom3 model-entity 'skin' key. - Added noshadows/nospecular/nodiffuse/falloff doom3 light keys to entity-inspector. 04/03/2005 SPoG - Added camera move up/down one floor. - Added support for 'unspecified' contents/flags/value for Quake2 brush faces. 26/02/2005 SPoG - Added auto-complete for shader attributes in entity inspector. - Added support for doom3-material heightmap to normalmap conversion. 22/02/2005 SPoG - Fixed missing prefix attribute in quake game configuration file. - Added auto-completion for find/replace-textures texture-name entries. - Removed redundant buttons and options in find/replace-textures window. 21/02/2005 SPoG - Added auto-completion for surface-inspector texture-name entry. 20/02/2005 SPoG - Fixed failure to load shaders containing '.' such as Heretic II model skins. - Removed unused legacy cmdlib functions. - Added support for fractional repeat values to brush-fit-texture. 19/02/2005 SPoG - Changed entity-connect-selected to use the parent entity of a selected brush. - Added q2map and bspc to installation packages. Jamie Wilkinson - Fixed path to q2map in quake2 build-menu. 13/02/2005 SPoG - Fixed crash in 'Misc > Find Brush' when searching for a non-existent brush. http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=1059 - Limited the maximum number of sides of a prefab brush-cone to 32. 11/02/2005 SPoG - Changed display of angled box-entities to show un-rotated bounding boxes. 10/02/2005 SPoG - Disabled rotation of light entities for games other than Doom 3. 09/02/2005 David Constanzo - Fixed episode flag names on Quake item_sigil and func_episodegate entities. http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=1056 - Added detailed description of Quake item_sigil and func_episodegate entities. SPoG - Fixed position of light-entity names. - Fixed q3map2 feedback xml streams containing non-UTF-8 text. - Optimised Locale<->UTF-8 text conversion. 08/02/2005 SPoG - Fixed selecting a texture not resetting the current selected texture-projection. - Added handling of OpenGL drivers that don't implement all reported extensions. 07/02/2005 SPoG - Added support for multi-byte UTF-8 characters in xml content (not markup). - Added UTF-8 support in entity-inspector, prefs dialog, recent-files menu, console. - Fixed potentially misaligned objects. 05/02/2005 SPoG - Added rendering of entity names for non-group entities. - Removed context-dependent opengl calls before opengl context is created. 04/02/2005 SPoG - Fixed crash when printing extended-ascii text in the console. - Added conversion of extended-ascii text to utf8 for gtk text-buffer widgets. 03/02/2005 David Constanzo - Fixed typo in Quake entity-definitions. SPoG - Fixed undo of brush-set-structural and brush-make-structural. - Refactored image-loader module api. - Added full support for Quake II and Heretic II surface-flags in surface-inspector. - Fixed crash in patch-inspector for games other than doom3. 01/02/2005 SPoG - Changed shader-list and entity-definition searching to also search base-dir. 29/01/2005 SPoG - Fixed title of floating entities/console/textures window. - Fixed destruction of floating windows on shutdown. - Added shortcut handling when entity-inspector/texture-browser are active. David Constanzo - Fixed crash while auto-saving snapshots. http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=1049 28/01/2005 SPoG - Added rendering of fixed S/T tesselation on doom3 patches. - Changed creation of doom3 func_static entities to prompt for a model. - Fixed zero-sized primitives being rendered for culled entity-connection-lines. 25/01/2005 SPoG - Added support for setting fixed S/T tesselation on doom3 patches. - Changed patch inspector to be completely non-modal. 24/01/2005 SPoG - Added support for rotating lights using the rotation tool. 23/01/2005 SPoG - Fixed crash on startup with texture-subsets enabled. http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=1045 - Added support for doom3 lights combined with brushes and patches. - Added support for doom3 light_origin on lights. - Added support for doom3 light_rotation and rotation key on lights. 22/01/2005 SPoG - Fixed crash when accessing links from help menu. - Fixed broken links in help menu. - Added game-specific docs to win32 setup. - Changed q3 connect-entities to preserve existing targetname key. - Changed q3 connect-entities to generate targetname key based on target classname. 21/01/2005 SPoG - Moved information in synapse.config into .game files. - Added api versioning for module-system. 20/01/2005 SPoG - Fixed keys/values for brush entities not being editable unless parent is selected. - Fixed brush-entities not being deleted when the last child brush is deleted. - Fixed scenarios where worldspawn is not the first entity in the map. 19/01/2005 SPoG - Fixed numerical instability in brush winding-generation. 16/01/2005 SPoG - Added Jedi Academy support to linux installer. - Fixed main-window jumping to front during autosave. - Fixed saving of empty brushes. Jame Wilkinson - Fixed build errors when compiling for big-endian target. 15/01/2005 SPoG - Fixed launching q3map2 from build-menu on linux/osx. - Added version checking of generated config files. - Fixed key-up events being missed while holding ctrl/shift/alt. - Fixed texture-compression support. Jago - Changed q1 trigger_relay and trigger_counter to be point entities. 11/01/2005 SPoG - Changed brush-save to not write non-contributing faces. - Fixed rendering artifacts on outlines of selected box-entities. 10/01/2005 SPoG - Added patch-cap-cylinder. 09/01/2005 SPoG - Fixed texture-browser scroll-to-selected-texture. - Added brush face texture painting. 08/01/2005 SPoG - Fixed ungroup-selected-entities. - Added 'Entity' menu. - Removed items unrelated to entity-creation from xy-window right-click menu. - Fixed minor memory leaks in core. - Removed code that ignores empty alpha-channel in tga loader. - Fixed memory leak in model module. - Fixed memory leaks in picomodel library: ase and lwo loaders. - Changed default tool to 'QE' tool. 04/01/2005 SPoG - Changed start-on-primary-screen default to 'true' with multiple screens. - Added enter/escape as shortcuts for OK/Cancel buttons on modal dialogs. - Disabled mouse-chase scrolling in XY window when drag-selecting. - Fixed xlink I/O warnings on linux. - Removed light-creation 'intensity' dialog in doom3 config. - Changed the default vertical size of the shortcut-list window to 400. - Fixed patch-creation with zero-sized workzone. - Fixed crash when rendering doom3 light_radius box. 03/01/2005 SPoG - Added arbfp1/arbvp1 vertex/fragment program lighting support. - Fixed colour-selection dialog not going away after OK/Cancel. - Fixed tangent/bitangent calculation on degenerate patches. - Added resizing of patches with QE tool. 02/01/2005 SPoG - Added stippled hidden-line rendering for rotate/translate manipulators. - Refactored high-level camera/orthographic rendering functions. - Fixed failure to load models with back-slashes in path. - Improved peformance of doom3 lighting with large models. 01/01/2005 SPoG - Changed entity renderering to draw connections for culled entities. - Fixed runtime errors on shutdown after cycling between lighting/textured. - Fixed 'Cancel' button in modal dialogs behaving like 'OK' button. - Changed 'clip' brush filtering to use shader parameters instead of names. - Added rendering of origin-point for selected model entities. - Fixed doom3 light-interaction updates for model entities. 31/12/2004 SPoG - Removed menu-splitting functionality. - Refactored entity-class menu construction. - Replaced const_reference with ConstReference. - Renamed string_t to CopiedString. - Changed code using Str::Format and Str::operator+= to use StringOutputStream. - Refactored shortcut command parsing code. - Changed light entity rendering to show light_radius box only in doom3 config. - Added 2x overbrightening for doom3 lighting preview. 16/12/2004 SPoG - Changed default doom3 light_radius to 300. - Fixed initial value of doom3 light_center. - Reduced frequency of gui updates during map load. 13/12/2004 SPoG - Fixed crash in monitored-compile feedback dialog. 12/12/2004 SPoG - Added visualisation of halflife texture-projection format. - Added texture-lock for halflife texture-projection format. - Changed brush-texture-lock default to enabled for doom3 and halflife. 11/12/2004 SPoG - Refactored script-tokeniser. - Fixed doom3 lighting on ATI cards. - Added support for list attributes in entity definitions. - Added utf8-normalisation on text printed to console. - Fixed missing default_build_menu.xml in halflife game config. 10/12/2004 SPoG - Fixed missing commas in entity-inspector comments. - Added support for default values in entity-definitions. 09/12/2004 SPoG - Enabled doom3 realtime lighting preview. 05/12/2004 SPoG - Fixed gcc compile warnings in patch.cpp. - Added q1 and q2 support to linux installer. 02/12/2004 SPoG - Added highlighting of entity-list nodes that have selected descendants. 29/11/2004 SPoG - Fixed xy-window failing to update after map-load. 28/11/2004 SPoG - Fixed error on shutdown when game-select dialog is disabled. - Added surface/light-interaction debugging mode. - Added per-plane light-culling for brush faces. - Added support for bump shaders using 'blend' layer keyword. - Added support for light-shaders. - Fixed edge/border clamping on light-attenuation textures. - Added 'Lighting' camera render-mode for doom3 config. 25/11/2004 SPoG - Fixed right-click-menu on linux. 13/11/2004 SPoG - Changed light-entity to draw radii only when selected. 07/11/2004 SPoG - Fixed shortcuts for creating n-sided brush-prisms. 19/10/2003 SPoG - Fixed user-customisable shortcuts support. 16/10/2003 SPoG - Added restore-main-window call when a modal-dialog dialog-box is shown. 13/10/2003 Jamie Wilkinson - Fixed SConstruct cpu detection on Power Macintosh. - Added more verbose warning settings for gcc builds. SPoG - Changed buffered-text-input-stream API to not use magic EOF value. 06/10/2004 Jamie Wilkinson - Fixed debug-break on non-x86 platforms. 05/10/2004 SPoG - Fixed new doom3 entities not being given unique names. 02/10/2004 SPoG - Fixed autosave causing the main-window to jump to the front. - Fixed window-title when changing view direction in floating-windows layout. - Added status information to wait dialogs. - Changed map-save to overwrite/refresh files modified/deleted outside radiant. - Changed component selection in QE tool to treat near-equal points as one. - Added texture browser window to View menu. - Changed white overlay in camera-window to draw hidden lines in 75% grey. - Reduced point-size for vertex/edge/face handles by 2/3. 25/09/2004 SPoG - Added component-editing for curves on doom3 entities. - Added normalisation of translation for texture-lock on doom3 brushes. - Added update of surface inspector for texdef changes caused by texture-lock. - Changed floating-windows layout to centre all ortho views on center-xy-views. - Stopped autosave from saving unmodified maps after first-time load. Shamus - Textool improvements. 21/09/2004 Michael Schlueter - Changed file-chooser dialogs to use GtkFileChooser. 20/09/2004 SPoG - Added basic rendering for 'curve_CatmullRomSpline' on doom3 entities. 19/09/2004 SPoG - Added basic rendering for 'curve_Nurbs' on doom3 entities. 18/09/2004 SPoG - Added doom3 entity-definition editor_usage* key support. - Added doom3 entity-definition editor_* key info to entity-inspector comments. - Added specialised attribute-entry in entity-inspector for boolean attributes. - Fixed crash in find-brush when entering the index of a fixed-size entity. - Added support for rendering doom3 'targetN' -> 'name' entity connections. - Changed connect-entities to use 'targetN' and 'name' keys on doom3 entities. - Improved handling of brushes with near-duplicate planes. - Fixed crash in snap-to-grid on brushes with non-contributing faces. 17/09/2004 Michael Schlueter - Fixed gcc build errors. SPoG - Fixed stability problems with doom3 brush-entities. 16/09/2004 SPoG - Added automatic renaming of entity target/name keys for paste and import-map. 13/09/2004 SPoG - Fixed rotation/mirror toolbar buttons using wrong axes in certain situations. - Fixed incorrect filter settings display in filters menu. - Added automatic renaming of entity target/name keys when cloned. - Fixed quake2 support. 12/09/2004 SPoG - Added shortcut support for all menu commands and toolbar buttons. - Fixed patch shader-name saving for doom3 patches created by user. 10/09/2004 SPoG - Fixed patch-cap-endcap and patch-cap-reverse-endcap. 09/09/2004 SPoG - Fixed status-bar labels showing 'Label' at startup. - Fixed textures-menu grouping bug. - Fixed mirroring on brushes with doom3 plane-defs. 08/09/2004 SPoG - Changed patch-cap-selected to prompt for cap type only once. - Fixed infinite-loop in patch-cap-selected. - Changed autosave to only save if the map has changed since the last autosave. - Changed "file exists, overwrite?" to go back to the file-chooser if 'no' is selected. 07/09/2004 Michael Schlueter - Removed unused source files - qsysprintf, gtkfilesel. - Changed linux exectuable-path resolution to use '/proc/self/exe'. - Changed 'file exists, overwrite?' prompt to default to 'no'. 06/09/2004 SPoG - Fixed crash when handling duplicate shader definitions. - Fixed crash on startup after changing game-type (sp/mp). - Changed compute-axis-base to be more stable in degenerate cases. Michael Schlueter - Cleaned up loki_path stuff. Shamus - Added textool rotation manipulator. 01/09/2004 Michael Schlueter - Changed linux installer to copy *.game files from game-packs instead of generating them. 29/08/2004 SPoG - Moved doom3 shader parsing into a separate function. - Fixed saving of visibility of yz-side and xz-front in floating-windows layout. - Added inheritance of doom3 entityDef 'editor_* *' keys. - Added support for doom3 entityDef 'editor_* *' keys other than 'editor_var'. - Changed entity-inspector attributes panel to be scrollable. - Changed shaders module to load *.mtr for doom3 instead of using shaderlist. - Improved doom3 material parsing. - Fixed crash loading maps containing patches with large numbers of control points. - Changed face-selection in camera view to use polygon test. - Changed face-selection-mode rendering in camera view to cull back-faces. - Changed shaders module to use diffusemap on doom3 shaders with no qer_editorimage. 28/08/2004 SPoG - Fixed undefined-behaviour bug causing a crash with gcc optimisation. - Fixed opengl extension support on linux. - Added support for half-life .fgd entity-definitions. - Fixed loading of half-life maps with texture-names containing '{'. 26/08/2004 SPoG - Updated win32 install to use gtk+-2.4.7 and gtk-wimp-0.6.2. - Removed 'unknown model type: ""' and 'Texture load failed: ""' errors. - Changed pivot-point calculation to use entity-origin for fixed-size entities. - Fixed errors drawing selection-rectangle in floating-windows layout. - Fixed shortcuts becoming disabled in floating-windows layout. - Removed snap-to-integer on entity angle/angles/scale keys. - Fixed dragging of doom3 brush-entities. Michael Schlueter - Fixed gcc compiler error and warnings. - linux installer fixes. 25/08/2004 Michael Schlueter - Changed linux build system to copy '$GAME.game/*' for installer. - Changed linux installer to use 1.5's module set. - Removed optimisation from linux build to fix optimiser-related crash. - Added Doom3 support to linux installer. SPoG - Changed texdef export to not snap shift/rotate to integer. 17/08/2004 SPoG - Fixed texture-browser height update bug. - Changed texture-browser to show only the texture-set selected from the menu. - Fixed bug loading quake maps. 16/08/2004 SPoG - Fixed shortcuts for shift/rotate/scale-texture on patches. - Fixed patch-inspector rows/cols combos not being cleared between selections. - Changed entity/brush counts to use counters instead of polling every second. - Changed archivewad module to check lump types and ignore non-miptex files. - Added support for worldcraft/hammer half-life map format. 15/08/2004 SPoG - Added doom3 md5mesh loader. - Added support for doom3 entityDef 'model' key. - Changed textures-menu to show/load only shaders in the form 'textures//*'. - Fixed texture-browser height calculation bug. - Added support for doom3 entityDef 'editor_var *' key. - Fixed support for patchDef3 subdivision settings. 14/08/2004 Chronos - Added doom3 light_radius and light_center rendering. SPoG - Disabled default-shaders for doom3. - Added one-click dragging of vertices/edges/faces on brushes and patches. - Fixed detail flag being lost on brush-clone or save-as. 12/08/2004 SPoG - Fixed workzone being invalidated when a brush is deleted. - Fixed pivot updates when switching from translate-tool to rotate-tool. - Fixed crash in misc_model. - Changed file_dialog to show '*.*' when pattern is not specified. - Added undo support for patch-inspector XYZUV tweaking. - Removed 'Apply'/'Done' buttons from patch-inspector. 11/08/2004 redfella - Converted RTCW entities.def to xml format. SPoG - Added support for "name" key for doom3 entities. 10/08/2004 SPoG - Added support for loading text files from VFS archives. 09/08/2004 SPoG - Changed .map writer to always use decimal notation for floats. - Added filtering of monster_clip/full_clip/player_clip. - Added support for inheritance in doom3 entity-definitions. - Fixed doom3 patchDef2 material-name import/export. 06/08/2004 SPoG - Doom3 support: - Map load/save. - Materials parsing. - entityDef parsing. - Fixed brush-primitives texturing bug. - Added texture-lock for brush-primitives texturing on all transforms. - Added support for model/rotation/origin keys on func_ entities. - Added DDS image module. 03/08/2004 SPoG - Fixed copy/paste copying all brushes of an entity when only one is selected. - Fixed discrete-camera-movement shortcuts becoming disabled after using freemove-camera. 27/07/2004 Shallow - Converted ET entities.def to xml format. 26/07/2004 SPoG - Fixed SI when not in face-selection mode. - Changed patch-create-prefab to use current workzone. - Changed engine attribute to be optional in game-description. 24/07/2004 SPoG - Changed module server to support wildcard modules. - Cleaned up docs/developer, added README. - Removed old TODO. 23/07/2004 Shamus - Initial version of textool. MindLink - Fixed const bug for vs.net 2005 compiler. 22/07/2004 SPoG - Fixed copy/paste and export-selected failing to export stuff. 19/07/2004 SPoG - Updated win32 setup scripts for q1 entity definitions. 18/07/2004 SPoG - Updated win32 setup scripts. - Fixed bug loading 8-bit bmp with <256 palette entries. - Added support for loading textures from arbitrary locations. - Changed shaders module to load notex/shadernotex from bitmaps/ in .bmp format. - Fixed bugs in brush-primitives texdef code. 17/07/2004 SPoG - Added STV:EF support to win32 installer. - Moved hardcoded game-specific configuration stuff into .game files. 16/07/2004 SPoG - Fixed crash bug in brush edge/vertex/face selection. 15/07/2004 SPoG - Moved .def files from //scripts/ to ///. - Changed entity inspector UI to be driven by entities xml. 14/07/2004 SPoG - Fixed map load/save in brusb-primitives mode. - Added files required to run in brush-primitives mode. - Added support for changing engine-path while a map is loaded. 11/07/2004 SPoG - Changed entity inspector to support custom UI for each entity-class. 10/07/2004 SPoG - Added support for experimental xml version of .def format. - Rewrote token parser. - Rewrote .def parser. - Fixed failure to read show-workzone preference. - Refactored quake3 entities module. 03/07/2004 SPoG - Changed QE-style Drag tool to move as well as resize. - Fixed shortcuts becoming disabled. - Fixed loading file types with upper-case extensions. 30/06/2004 AcidDeath - Added support for plugin submenus. 27/06/2004 SPoG - Added build-menu-command editing. - Fixed texture-object reshuffle caused by changing gamma. - Refactored vfs/shaders/renderstates/eclass/texturemenu unrealise/realise systems. 26/06/2004 SPoG - Added printf-formatting support to output streams. - Added error/warning printing to xml parser. - Changed build-menu xml format to allow easier editing. - Added sample plugin. 25/06/2004 SPoG - Changed paste and import-map to select pasted/imported entities and world brushes. 24/06/2004 SPoG - Changed create-entity API to use eclass instead of classname. - Changed nodes with unknown entity types to use a group-entity if the node has children. 18/06/2004 SPoG - Changed image-loaders interface to use a file object instead of VFS. - Changed model-loader interface to support in-place model reloading. - Changed picomodel-loader module to support configuration of suppported model types in synapse.config. - PicoModel: added support for loading models from an abstract input stream. 14/06/2004 SPoG - Refactored texture browser. - Removed GLWindow. - Fixed mousewheel movement in camera window. 13/06/2004 SPoG - Added load-entire-wad from textures menu in Quake/HL mode. - Fixed bug with writing negative integers to .map format. - Fixed texture-browser hide-unused to show only in-use shaders. - Fixed texture-browser scrollbar positioning and origin-clamping. - Fixed prompting to save unchanged new maps. - Changed unsaved-changes message box default to "Yes, save" instead of "OK, don't save". - Changed all message boxes to appear centrally. - Removed minimize/maximize buttons from all message boxes. 12/06/2004 SPoG - Disabled shortcut keys during drags. - Fixed window updates for edge/vertex multi-selection. - Added apply/cancel on enter/escape for texture-browser filter entry. - Changed undo system to use explicit start/finish pair to specify undoable operations. - Changed undo system to print undoable command after command completion instead of before. - Added printing of movement parameters for translate/rotate manipulator drags. - Changed brush-subtract to not delete the selection after subtracting. - Fixed texture browser to not display textures if only in-use by nodes in the undo-queue. - Fixed another workzone-update performance issue causing area-selection to be slow. - Added code to brush build-B-Rep to handle duplicate edges. 10/06/2004 SPoG - Added lazy evaluation of local->world transforms and world-space AABBs. - Added shortcut key for translate mode, default 'W'. - Added toolbar buttons for edge/face/vertex modes. - Changed Escape shortcut to deselect-components if components are selected. 02/06/2004 SPoG - Fixed performance bug with workzone updates not being lazily evaluated. - Fixed brush edge-graph bug by removing degenerate winding edges. 01/06/2004 SPoG - Added mode information to status bar. - Added console feedback describing undoable commands executed. - Fixed assertion failures on updating degenerate edge/vertex selections. - Fixed detail brushes turning structural when clipped. 31/05/2004 SPoG - Added support for more than one edge/vertex selected per brush. 29/05/2004 SPoG - Refactored groupdialog - decoupled notebook from console/textures/entity pages. - Fixed crash in patch tesselator. - Fixed floating windows startup crash. - Fixed null texture name for patches. 28/05/2004 SPoG - Hide arrows on translate manipulator when obscured by square part. - Workaround for main window not being brought to front when a floating window is closed. - Fixed rendering of selected components of degenerate brush faces. - Fixed double typedef in picomodel. - Fixed bug in allocator stuff. - Fixed up clipper tool button state. - Added workzone updates when selection bounds change. - Fixed transient setting on floating inspector windows. 27/05/2004 Tr3b - Fixed gcc build errors. SPoG - Fixed crash bug in game selection dialog. 26/05/2004 SPoG - Cleaned up project settings. - Changed autosave/snapshots to only save modified maps. - Refactored build menu. 23/05/2004 SPoG - Fixed minor picomodel ase loader smoothing-groups bug. 19/05/2004 SPoG - Allocator system improvements, fixed warnings 18/05/2004 SPoG - PicoModel: added support for per-vertex smoothing-group, used in generation of normals. - PicoModel ASE loader: added support for per-face 'MESH_SMOOTHING' id. - PicoModel: changed normal generation code to create smooth normals across texcoord/colour discontinuities. - Fixed cosmetic menu bug. - Fixed file handle leak in tga loader. - Added experimental allocator system. 15/05/2004 Tr3b - Fixed gcc build errors. 11/05/2004 SPoG - Fixed version.h custom build step on win32 - Refactored preferences dialog to eliminate dependencies on other modules. - Redesigned preferences dialog ui layout. 06/05/2004 SPoG - Refactored texture browser. 05/05/2004 SPoG - Upgraded win32 gtk2 version to 2.4.1. - Migrated from GtkCombo to GtkComboBox. - Texture browser improvements. - Fixed malloc/free mismatch bug. 05/05/2004 SPoG - Refactored surface inspector and texture browser. 02/05/2004 Nurail - Added imageq2 module with support for quake2 and heretic2 texture formats: wal, m8, m32. 30/04/2004 SPoG - Changed texture window not to auto-scroll when selecting faces. - Changed surface inspector to apply shader seperately from shift/scale/rotate. - Changed selected face tracking to use separate selection list. 26/04/2004 SPoG - Added per-file change tracking - only modified (unsaved) files are saved by SaveMap(). 18/04/2004 SPoG - Fixed texture-increment-matches-grid. - Changed selecting a texture to only change the shader on the selected brushes. - Changed 'Axial' button in surface inspector to reset the texdef for selected brushes/faces. - Removed MAX_TEXTUREDIRS limit. 11/04/2004 SPoG - OS library module added to wrap calls to rename/unlink/access/stat. - OpenGL-view selection tests constrained to current window. - Cleaned up OpenURL. - Added jk2 and sof2 support to win32 installer. 09/04/2004 TTimo - update the OSX setup / .info generation code 08/04/2004 SPoG - Added integer quantisation for brush edge/vertex drags to fix FP-drift on planes. TTimo - fix for scons 0.95 - re-enable Python >= 2.1 version check - OSX 10.3: remove obsolete dlsym_auto_underscore (bug #920) - OSX: disable q2 tools build (broken thread code) 07/04/2004 SPoG - Moved profile.cpp into a separate static library. 06/04/2004 SPoG - Refactored preferences to be more modular. - Fixed preferences being corrupted if a crash occurs during preference saving. - Refactored window position saving. - Fixed bug in radio button creation in preferences dialog. 24/03/2004 SPoG - Changed surface inspector to unfocus after pressing escape or return, to enable shortcuts. - Added refresh of surface inspector for shift/scale/rotate-texdef shortcuts. - Fixed bug causing some operations to be applied twice. 21/03/2004 SPoG - Added depth-test and normalisation for translate-manipulator rendering. - Added basic clipper-preview rendering. 18/03/2004 SPoG - Added maya-style arrow-heads to translate manipulator. - Changed square part of translate manipulator to be viewplane-oriented. - Changed square part of translate manipulator to take priority for selection. 15/03/2004 SPoG - Added recalculation of pivot-point when grid size changes. - Changed win32 SHGetFolderPath to link with shfolder.lib instead of shell32.lib. - Fixed failure to recover brushes from an invalid state. 14/03/2004 SPoG - Improved event handling to make manipulator-dragging smoother in complex scenes. - Refactored camera window camera-movement handling. 06/03/2004 SPoG - Fixed vertex/edge undo failing to update selected-vertex position. 29/02/2004 SPoG - Re-enabled next-xy-view in floating windows mode. - Reinstated light-radius rendering. - Added Wolfenstein support to win32 setup. 24/02/2004 SPoG - Changed create-brush-prism to use correct dimension for prism radius. - Changed freelook selection to use window-centre position. 22/02/2004 SPoG - Optimised undo for adding/removing scenegraph nodes. - Changed entity-list view to sort the tree by name. 18/02/2004 SPoG - Moved default shaderlist to ///default_shaderlist.txt - Moved user shaderlist to ////shaderlist.txt 11/02/2004 SPoG - Refactored clipboard copy/paste code to allow re-use. 10/02/2004 SPoG - Fixed false-positive-intersection bug in CSG subtract algorithm. 07/02/2004 SPoG - SceneGraph: Refactored per-instance functionality. - Fixed intermittent culling bug caused by bad bounding boxes. - Fixed missing ToggleCubicClip shortcut. - Removed modal buttons from Surface Inspector. - Changed Surface Inspector keys: - Escape: revert not-yet-committed values to previous state. - Enter: commit not-yet-committed values immediatly. - Changed Surface Inspector to update when selection changes. 31/01/2004 SPoG - Cleaned up functional.h template usage with typedefs. - Fixed autosave path. - Added q1 component to installer. - Added radiant_manual component to installer. - Added q3-example-maps package to installer. 29/01/2004 SPoG - Added error reporting for module system initialisation failure. - Added MSI package creation tools in setup/win32. note: requires MSI SDK binaries in http://zerowing.idsoftware.com/radiant-files/msi/msitools.zip - Added initial version of scripts to build basic win32 setup. 26/01/2004 SPoG - Added storing EnginePath for each game in local.pref. - Added EnginePath editing to prefs dialog. - Added vfs shutdown/init when gamename changes. - Added vfs shutdown/init when enginepath changes. 25/01/2004 SPoG - Fixed filtering updates. - Moved default bsp menu to //default_build_menu.xml - Moved user bsp menu to ///build_menu.xml - Moved synapse.config to //synapse.config - Moved game-specific .xlink files to //*.xlink 25/01/2004 SPoG - Redesigned filter system: - Filtered status updated when filterable attributes change. - Supports per-brush-face filtering. - Removed long-dead project-settings stuff: - Moved gamemode and gamename storage into local.pref temporarily. - Moved bsp commands over to a new format, disabled gui editing for now. 20/01/2004 SPoG - Changed win32 Application Data path lookup to use win32 API instead of getenv. 14/01/2004 SPoG - Fixed main menu mnemonics. - Fixed crash on exit after viewing pointfile. 13/01/2004 SPoG - Fixed not always resetting component-mode when selection is cleared. 11/01/2004 Tr3B - Added parse/write support for BrushDef3 and PatchDef3. Requires editing synapse.config to enable. SPoG - Rearranged menus: File = new/open/import/export Edit = manipulate scene hierarchy and selection View = toggle entityinspector/entitylist/surfaceinspector/camera/xy edit camera/xy parameters filters/hideshow/region Modify = transform scene elements Build = bsp menu - Fixed Brush-Primitives support: Requires editing synapse.config to enable. Supports load/save of BP mapfiles, and editing BP texdefs in surface inspector (Not yet possible to convert between formats). 15/12/2003 SPoG - Changed user-prefs to be stored in user-profile directory on win32. 14/12/2003 SPoG - Fixed entitylist window visibility tracking. - Implemented find/replace-shader for patches. - Changed get-texture-from-selected to update find/replace-shader dialog. - Implemented reparent-selected for more than one selected node. - Added checks to stop assignment of invalid texture names. - Fixed uninitialised texture-compression setting. - Fixed bsp menu. ------- spog_branch merged to trunk 10/12/2003 SPoG - Ported imagehl module. - Ported imagepng module. 03/12/2003 SPoG - Changed brush winding generation to use use double precision planes. - Fixed tracking of modifier key state. 29/11/2003 SPoG - Replaced mathlib with c++ vector/matrix library. - Added expression-templates for common vector/matrix operations. 21/11/2003 SPoG - Refactored component-selection stuff. - Ported m4x4_t library to c++ Matrix4. 16/11/2003 SPoG - Changed shortcuts.ini to be written automatically. - Moved more prefs into specific modules. - Changed c++ NULL usage to 0 for maximum portability. 11/11/2003 SPoG - #include cleanup. - Added debug output/assert for module initialisation. 09/11/2003 SPoG - Refactored status bar stuff. - Refactored window updates to use closures. - General cleanup and refactoring. 08/11/2003 SPoG - Increased priority of window redraw events. - Ported model module to new module system. 07/11/2003 SPoG - Refactored window updates. 05/11/2003 SPoG - Changed menubar/toolbars to be non-detachable. - Fixed empty-undos created when left-clicking in XY window. - Refactored camera modelview/projection matrix updates. - Moved application-specific code out of mainframe.cpp. - Reinstated brush/entity count in statusbar. 04/11/2003 SPoG - Reinstated instant status-bar updates. 30/10/2003 SPoG - Fixed crosshair cursor in clipper mode. 29/10/2003 SPoG - Changed camera to maintain valid projection/modelview matrices. - Moved manipulator-transform update from frustum class to selection system. - Removed frame-rate dependency in 3d-window freelook. 27/10/2003 SPoG - Smoothed out xy-window mouse-chasing. - Changed mouse-chasing to occur 16 pixels inside the window edges. - Changed xy-window to maintain valid projection/modelview matrices. - Fixed invalid workzone generated when deselecting with no selection. 26/10/2003 SPoG - Ported changes from trunk between rev 3818 and rev 4036. 25/10/2003 SPoG - Refactored xy-window mouse event handling. 22/10/2003 SPoG - Fixed freelook focus-out event. - Changed selection mouse event handling to use modifiers on button-release. 21/10/2003 SPoG - Refactored all mouse event handling for camera window. - Changed menus/toolbars/accelerators to use anonymous closures. 20/10/2003 SPoG - Fixed get-pointer-in-screen-coordinates on win32. - Changed patch prefs to use preference-system module. - Fixed selection of side-on faces. - Changed brush rendering to avoid glPushClientAttrib - workaround for ATI driver issue. 19/10/2003 SPoG - Changed VFS directory initialisation to occur after module initialisation. - Changed load-preferences to occur after module initialisation. - Added preference-system module. - Changed undo prefs to use preference-system module. - Restored splash screen with non-intrusive behaviour. - Cleaned up main-toolbar creation. - Fixed floating windows behaviour when main window is minimised. - Changed shader-list parsing to use new script tokeniser. - Changed deprecated code using GtkPixmap to use GtkImage. - Removed bitmap-loading from core. - Removed pc-speaker beep on map-save. 17/10/2003 SPoG - Fixed crash when trying to undo on an empty undo queue. - Refactored gtkdlgs, using helper functions to create common widgets. - Changed Dialog class to use std::list for data. 13/10/2003 SPoG - Refactored entity inspector. - Removed miscellaneous unused functions. - Refactored qe3 header. - Moved texture-window preferences into texwindow.cpp. 12/10/2003 SPoG - Moved layout-mode dependant code into main-frame creation. - Replaced prefs system with new import/export system. - Fixed gcc3.3 build errors. 11/10/2003 SPoG - Moved unnecessary methods from MainFrame into free functions. - Removed unsupported toolbar buttons and menu items. - Changed misc->gamma to not require restart. - Fixed unmaximised window-size when loading main window maximised. - Fixed saving of rotate increment preference. 10/10/2003 SPoG - Fixed keyboard shortcuts intercepting input to texture-subsets text-entry. 09/10/2003 SPoG - Fixed gcc3 build errors, compiled and tested on linux. 08/10/2003 SPoG - Fixed brush snap-to-grid creating huge coordinate values. - Fixed minor bug in selection menu. 07/10/2003 SPoG - Cleaned up MainFrame. - Added quantisation of plane pts when dragging. - Fixed create-empty-brush bug. 06/10/2003 SPoG - Moved control of camera keyboard-accelerators into camera window module. 05/10/2003 SPoG - Separated keyboard-accelerators from menu items, using functors. - Completed factoring out HandleCommand. 04/10/2003 SPoG - Changed 4-way-split mode to automatically reposition separators when window size changes. - Fixed gtk error in floating-entity/textures/console window. - Fixed position of console horizontal pane separator. 03/10/2003 SPoG - Work-in-progress factoring out HandleCommand. 02/10/2003 SPoG - Fixed pink icons on main window on win32. - Replaced g_bIgnoreCommands with signal block/unblock. - Refactored MainFrame startup. 01/10/2003 SPoG - Fixed entity-window redraw on selection change. - Moved control over VFS init/shutdown to module system. - Fixed failure to release translucency render-states. - Added support for realise/unrealise of all opengl texture objects. - Refactored startup/shutdown logic. Changed quit commands to do nothing but call gtk_main_quit(). Added code after gtk_main() to destroy stuff. - Changed 25ms timeout-handler to an idle-handler for window updates. (reduces redraw-request response time on fast machines) - Moved gl-shutdown control to glwidget. Textures are realised/unrealised when the shared context is created/destroyed. - Fixed lack of a valid gl context when unrealising gl textures. 30/09/2003 SPoG - Added support for translucent entity rendering. 29/09/2003 SPoG - Changed all global modules to use GlobalModule helper templates. - Ported qgl.c to c++. - Changed win32 project to dynamic-link with opengl32.lib. 28/09/2003 SPoG - Added new experimental xml preference import/export system. - Refactored dialog base class: Moved common dialog-element-creation code into helper functions. Changed UpdateData to use per-element callback functions. - Refactored preferences dialog. 26/09/2003 SPoG - Reversed winding order for circle primitives. 25/09/2003 SPoG - Fixed slow selection response in large maps. 21/09/2003 SPoG - Added sharing of global modules within a client. - Added quake map module and wal image module. - Ported mip image module and hlw image module. - Cleaned up imagehl module. - Fixed crash in pcx image module. - Rewrote md3 model module. - Ported mdl, md2 and mdc model modules. - Added filtering of q1/q2 clip brushes. - Added ati-crash-workaround rendering path. - Upgraded to gtk+-2.2.4 on win32: Fixed capslock affecting shortcut-keys. - Upgraded to gtkglext-1.0.4 on win32. - Fixed copy/paste. - Added shortcut-key support to entity treeview. 17/09/2003 SPoG - Fixed failure to call vfsFreeFile on an empty buffer. - Fixed calling convention for dlls in new module system. - Changed map.cpp to support maps without a worldspawn entity. - Fixed crash on attempting to clone a map root. - Added filter-update calls after loading or cloning stuff. - Fixed reference cache failing to save a file. 16/09/2003 SPoG - Refactored client-side module system code for direct module access. - Changed shaders, vfs, model, brush, patch and entity module interfaces to use abstract base class. - Removed unused functions from shaders and vfs interfaces. 15/09/2003 SPoG - Removed synapse dependencies for win32 makefiles. - Added find-first-module-of-type helper function. 14/09/2003 SPoG - Added new lightweight module system: Initialises each module the first time it is requested. Does not allow configurations with cyclic runtime dependencies. Provides templates for simple type-safe client-side implementation. Requires no client-side linkage. - Split radiant API into multiple APIs: core, textures, scenegraph, selection, renderstate, filters, filetypes. - Ported radiant, core, mapq3, mapxml, md3model, entity, shaders, image, vfspk3, archivewad, archivepak, archivezip to new module system. 11/09/2003 SPoG - Removed edge and vertex integer-snapping during selection. 10/09/2003 SPoG - Replaced map in referencecache.cpp with a hashtable. - Changed ReferenceCache interface to take a path string, which can be either absolute or relative. 08/09/2003 SPoG - Cleaned up qertypes.h - split into multiple files. - Moved texdef stuff into itexdef.h. - Fixed shutdown destruction order bug. 07/09/2003 SPoG - Refactored texwindow.cpp. Moved texture management code into textures.cpp. Added textures api. Replaced globals from texwindow.h with accessor functions. - Cleaned up shaders module. Removed color-shader stuff. Rewrote shader-activation logic to use textures API. Removed appshaders API. - Refactored shutdown logic. Moved non-mainframe shutdown stuff into Radiant_Shutdown(). Added deferred render-state realisation. - Fixed failure to create gl contexts in 16-bit mode for latest nvidia drivers. - Changed hashtable template to use traits parameter for case-insensitive hasher and keyequal functions. - Removed unused functions from qerplugin API. 02/09/2003 SPoG - Refactored code to remove global-object accesses: Passing global objects as parameters to functions. - Refactored texwindow. - Moved synapse server out of pluginmanager. Changed pluginmanager to handle nothing but IPlugin stuff. 01/09/2003 SPoG - Refactored scenelib.h, split into multiple files. - Refactored #includes related to scenelib.h. - Refactored preferences for xywindow and camwindow. - Refactored references to g_pParentWnd in xywindow and camwindow. 30/08/2003 SPoG - Ported changes from trunk since 17/08/2003. - Ported all changes from bug800-spog_branch (vfs rewrite and q1 support). 29/08/2003 SPoG - Refactored component-selection stuff. - Fixed selection-tracking bug in patches. 28/08/2003 SPoG - Added support for line-strips to Selectors. - Fixed selection for entity treeview. - Refactored external-resource loading. 20/08/2003 SPoG - Fixed snap-to-grid in edge and vertex modes. - Added a default model to use when a model load fails. 19/08/2003 SPoG - Changed snap-to-grid to vastly reduce the possibility of creating an invalid plane. 17/08/2003 SPoG - Ported changes from trunk since 01/08/2003. 12/08/2003 SPoG - Changed entity key/value tracking to only track keys already added to the entity. - Fixed bug causing undo system to track scene changes during a queue-flush operation. 12/08/2003 SPoG - Fixed bug in project settings bsp-commands display. - Fixed empty undos being created by rotation buttons. - Fixed rotation pivot for rotation buttons. 09/08/2003 SPoG - Added property svn:eol-style=native to all text files. - Added property evn:eol-style=CRLF to all dsp and dsw files. - Partially ported bobtoolz to use new spog_branch module APIs. - Removed Sys_UpdateScene. - Added Map_Name() for access to currentmap variable. - Added initial drag-n-drop support for graph tree-model. 01/08/2003 SPoG - Fixed uninitialised refcount in entity key class. - Fixed memory leak in shader parsing. - Added reference-counting holder for worldspawn node. - Moved string class and utilities into a new header in libs dir. - Fixed external-file-resource cache to use case-insensitive name compare on win32. - Fixed shaders to use case-insensitive name compare. - Fixed shader module to display SHADER_NOT_FOUND when appropriate. - Changed the default texture name to "NULL" instead of SHADER_NOT_FOUND. - Changed move-into-entity to perform parent-selection-to-last-selected-node. - Added a new implementation of GtkTreeModel operating directly on the scenegraph. - Fixed disable-screen-updates to queue update requests instead of ignoring them. - Merged from trunk (tag head-cvs2svn-2). 22/07/2003 SPoG - Changed scale/flip-selection to use the manipulator as a pivot point. - Added OnShutdown callback for CSynapseClient, used in entity module. - Fixed console updates when loading maps/models. 20/07/2003 SPoG - Added renderer support for qer_alphatest and qer_cull. - Merged 'picomodule' module into 'model' module. - Added rendering of area-selection rectangle. 19/07/2003 SPoG - Merged from trunk. 18/07/2003 SPoG - Disabled deleting classname key in entity inspector window. - Cleaned up some stuff in selection system. - Added basic versions of std::mem_fun and std::bind1st to function-object library. 10/07/2003 SPoG - Implemented connect-entities. 09/07/2003 SPoG - Completed local-space rotation manipulator. - Fixed cloning objects within a misc_model subgraph. - Fixed crash bug in loading certain models. 06/07/2003 SPoG - Added function-object library header, similar to boost::function. - Changed undo system to improve performance. - Refactored entity inspector implementation. 22/06/2003 SPoG - Refactored selection observing stuff. - Changed shader parsing to use new tokeniser. - Changed implementation of entities to use generic container. - Refactored entity wrapper system. - Fixed undo on delete/reset entity keys. 21/06/2003 SPoG - Added rendering of target/targetname connection lines. - Moved entity and eclass stuff out of qertypes.h into ientity and ieclass. - Refactored entity_t to hide it behind Entity interface. - Removed global project settings entity. - Cleaned up bsp-command editing in project settings dialog. 17/06/2003 SPoG - Fixed back-face-culling for selections by working in screen-space. 16/06/2003 SPoG - Added workaround for nvidia driver opengl vertex arrays bug. 15/06/2003 SPoG - Refactored Patch implementation. - Refactored scene graph system to allow multiple graph instances. 13/06/2003 SPoG - Added snap-selected-components-to-grid for faces edges and vertices. 11/06/2003 SPoG - Improved normal-quantisation code. 10/06/2003 SPoG - Changed renderer vertex types to be struct instead of typedef'd array. - Added experimental quantisation of normals. 05/06/2003 SPoG - Fixed intermittent crash in face-fit-texture. - Changed patch rendering to display components only in vertex mode. 02/06/2003 SPoG - Added nameable interface for scene graph nodes. - Fixed undo for set-detail and set-structural. - Added rendering of arrow for angled entities. 01/06/2003 SPoG - Fixed handling of invalid planes during brush b-rep build. - Refactored brush copy-construction/assignment. - Fixed lack of rebuild after removing empty faces. - Added lightjunior entity display. - Fixed display of spawnflags/info for selected entity. - Fixed update of entity window on setting spawnflags. - Fixed botclip filtering. - Fixed uninitialised alpha channel on jpg images by ignoring alpha. 31/05/2003 SPoG - Cleaned up undo calls in brush and patch implementation. - Changed brush implementation to defer rebuilds until needed. - Fixed undo for find/replace shader. - Refactored brush implementation, removed empty-face list. - Fixed crash on loading unrecognised entities containing brushes. - Fixed crashes in renderer caused by state-stack underflow. - Fixed handling of invalid and duplicate planes during brush editing. - Fixed failure to save brush faces during save-as. - Refactored brush data members. 28/05/2003 SPoG - Fixed crash on selecting stuff from entity list window. 27/05/2003 SPoG - Fixed window title after save-as. 22/05/2003 SPoG - Refactored selection system interface slightly. - Removed old brushwrapper stuff. - Fixed clipper-split-selection to keep both parts selected. 21/05/2003 SPoG - Added select-faces-by-shader. - Fixed find/replace-shader. 19/05/2003 SPoG - Fixed rotation on misc_model. 13/05/2003 SPoG - Fixed lack of undo on create-n-sided-brush. 29/04/2003 SPoG - Fixed per-face find/replace and per-face nudge rotation. 25/04/2003 SPoG - Fixed find-brush. - Changed rotation buttons to use perfect precision for 90-degree rotations. 24/04/2003 SPoG - Added find-dir-for-relative-filename and find-dir-for-absolute-filename to vfs. - Changed resource manager to handle per-mod resources using vfs. - Changed resource manager to allow resources with absolute paths. - Fixed selection-test behaving like an ellipse instead of a rectangle. 23/04/2003 SPoG - Changed selection test to choose closest-to-cursor over closest-to-camera. 22/04/2003 SPoG - Fixed reference counting on shaders loaded from a texture directory. - Fixed show-in-use and show-all shaders. - Fixed undo for patch-set-shader. - Changed shaders module to use STL map container instead of CShaderArray. - Fixed SelectAllOfType for entities and patches. - Cleaned up unused functions in shaders API. - Decoupled selecting a texture in texture window from applying a texture to selection. 21/04/2003 SPoG - Fixed memory leaks in image loaders, texdef_t, csg subtract, picomodel module. - Fixed uninitialised memory references in renderer, texdef_t, eclass loader, undo system. - Refactored tga loader. - Cleaned up image module, enabled pcx and bmp loaders. 17/04/2003 SPoG - Fixed shift-texture on selected brush faces. - Changed brush b-rep algorithm to have higher tolerance for similar planes. - Changed brush b-rep algorithm to always produce a valid connectivity graph. - Added setting/getting shader for patches. 16/04/2003 SPoG - Fixed tracking of in-use shaders (though undo queue still keeps shader references). - Changed brush faces to store state in undo-system cleanly. - Fixed flush & reload shaders and sleep/wake. - Ensured that shaders are never leaked. - Fixed bool conversion warnings. 15/04/2003 SPoG - Added clamping of planepts on export to nearest 65536th of 1 unit. - Changed m4x4 rotation functions to use double-precision for angles in radians. - Changed m4x4 quaternion rotation to use double-precision internally. - Changed float printing to use %g instead of %f (strips trailing zeros). 13/04/2003 SPoG - Fixed brush import failing to update bounding boxes. 11/04/2003 SPoG - Refactored Brush class into Brush, BrushInstance and BrushNode. - Fixed various flaws stopping brush b-rep algorithm from being 100% reliable. 02/04/2003 SPoG - Changed manipulator to move to position of selected brush components. 01/04/2003 SPoG - Fixed xml parser failing to resolve predefined entities. 31/03/2003 SPoG - Fixed asserts in brush manipulation when creating invalid brushes. - Removed automatic update of current texdef. - Added Get Texture and Set Texture to textures menu. 29/03/2003 SPoG - Fixed array template failing to free zero-sized allocations. - Changed clipper mode to behave as a component-editing-mode. - Removed right-click-to-drop-clip-point - use X and leftclick instead. 28/03/2003 SPoG - Changed scene graph to sort objects in ascending order of creation time. 27/03/2003 SPoG - Fixed bug in clone-selection causing only first selected brush to be cloned. - Optimised select-all for brush/patch components. - Changed edge/face/vertex toggles to toggle correctly. 26/03/2003 SPoG - Removed win32/x dependencies from gl interface. - Removed win32/glib dependencies from core interface. - Replaced void* in gtk helper functions with forward-declared GtkWidget. - Changed gtk helper functions to return enumerated values instead of win32 IDOK. - Removed WINAPI macro for __stdcall from all interfaces. - Removed unnecessary dependencies from core stdafx/qe3 header. 25/03/2003 SPoG - Changed class-level render states to be static for Brush and Patch. - Refactored brush implementation - breaking it up into smaller parts. - Added refcounted ptr template to track refcounts. - Fixed refcount bug introduced by new clone-selection. - Fixed warnings in brush implementation. - Cleaned up plugin interface header inclusion. 24/03/2003 SPoG - Fixed crash on building unbounded brushes in release build. - Changed assertion failures to be non-fatal in release build. - Moved OS-specific gl headers into separate files. - Moved app-shaders interface into a separate file. - Cleaned up dependencies for brush implementation. 23/03/2003 SPoG - Added per-instance selection of patch vertices. - Fixed per-instance vertex selection rendering on multiple instances. - Refactored patch/brush render code. - Changed manipulator transforms to convert to local space before applying. - Fixed selection test for picomodule meshes. - Fixed selection test winding order for triangles. - Fixed update of window title on new-map and load-map. - Changed selection to work with exactly side-on faces. - Refactored instance implementation to reduce code bloat. - Fixed map export always exporting root. 21/03/2003 SPoG - Fixed external resource tracking to preserve uppercase characters in names. - Changed clone-selection to not use global copy/paste. 20/03/2003 SPoG - Changed map-save to save all saveable files that the map references. 16/03/2003 SPoG - Moved hashtable and hashfunc into libs. - Cleaned up renderer interface and selection interface. - Refactored frustum testing class. 12/03/2003 SPoG - Moved winding-specific stuff from brush obj to winding obj. - Refactored filter subsystem to remove dependency on entity/brush/patch. 07/03/2003 SPoG - Fixed crash when clicking cancel from patch cap-dialog. - Changed selection tests to ignore back-facing faces. 05/03/2003 SPoG - Fixed failure to release cloned scene graph nodes. - Fixed selection manager failing to release render states. - Fixed eclass system failing to release render states. 04/03/2003 SPoG - Fixed writing-past-end of vertex arrays in brush rendering. - Fixed releasing data stored in undo system when deleting undoables. - Fixed crash in misc_model when model fails to load. - Fixed undo for clone/rotate/flip/nudge/set-texture operations. - Cleaned up surface dialog. 01/03/2003 SPoG - Changed clipper split-selection to keep result selected. - Cleaned up and finalised picomodule, adding to cvs. 28/02/2003 SPoG - Cleaned up entity list window. - Fixed crash on freeing a map while entity list node is selected. - Fixed crash on clone/copy of externally referenced brushes. - Added multiple-selection support to entity list. - Added updating entity list selection display on selection changes. 26/02/2003 SPoG - Added stl_warnings include. - Fixed tracking of map-modified-since-last-saved. 24/02/2003 SPoG - Fixed missing map-release when map-load fails. - Changed map-rename (save-as) to flush undo queue. - Fixed bug in exporting selections. 23/02/2003 SPoG - Fixed redo on changing misc_model "model" key. 22/02/2003 SPoG - Changed undo interface to factor out global undo system. 21/02/2003 SPoG - Started cleaning up Map subsystem. 20/02/2003 SPoG - Added 'clone subgraph' feature to core, using direct xml import/export. - Added 'save' feature to reference cache. - Added scope timer object. - Changed scene graph interface to allow setting scene root. - Changed core to use reference cache to track current map. - Removed mapmodel module. - Fixed relative paths for loading maps as misc_model. 19/02/2003 SPoG - Changed model/map modules to register their file types on load. - Added map module manager to support unlimited map loader modules. 18/02/2003 SPoG - Changed vertex buffer template to support resizing. - Changed vertex buffer search algorithm to iterate instead of recurse. 17/02/2003 SPoG - Fixed sorting bug with render-states. - Fixed colour state when disabling gl_color_array. - Fixed unterminated loop in scenegraph traversal. - Fixed freeing project entity twice on shutdown (infinite loop). - Fixed failing to destroy the scene graph on exit (oops). 07/02/2003 SPoG - Added updating current texdef when a face is selected. - Fixed crash when creating a brush with duplicate planes. 06/02/2003 SPoG - Fixed various issues with 'save region'. - Changed default current texdef to use game-specific scale. - Changed brush creation to use current texdef. - Changed clipper to use current texdef. - Fixed bug in selection counting for patch control points. 05/02/2003 SPoG - Fixed reversed solid-selection-outline preference. - Finished factoring out face_t. - Added script token writer interface for map export. - Changed map export interface to use script token writer. 04/02/2003 SPoG - Added depth-buffer-write enable/disable feature to renderer. - Changed Pointfile class to use renderer. - Continued factoring out face_t. 03/02/2003 SPoG - Fixed temporary objects leaving dangling references in the undo system. - Changed import-map to not modify existing selection. 02/02/2003 SPoG - Fixed frustum culling for transformed nodes. - Fixed hide/filter/region to work independently. - Added highlighting of selected brush faces in component mode. - Fixed bug detecting thin area-selection if dragged down or left. - Renamed brush_type to Brush. - Renamed face_type to Face. - Started factoring out face_t. 01/02/2003 SPoG - Improved edge and vertex manipulation. - Removed unnecessary graph traversals for rendering/selection. 31/01/2003 SPoG - Merged changes since last merge from merge-1_2_10-post to spog_branch. - Merged changes since last merge from HEAD to spog_branch. - Tagged HEAD after merging as 'merge-spog_branch-post'. - Added walker to merge sibling worldspawns. - Merged changes to Construct for PPC from trunk. - Fixed over-enthusiastic worldspawn merging. - Fixed misc_model "angle" key setting pitch instead of yaw. - Fixed entity set-key-value changing scene-graph topology. 30/01/2003 SPoG - Added subgraph traversal feature to scenegraph traversal. 29/01/2003 SPoG - Changed scene graph implementation to allow nested traversals. 28/01/2003 SPoG - Fixed angles key order for misc_model. 27/01/2003 SPoG - Fixed typo causing set-texture-of-selection to behave incorrectly. 26/01/2003 SPoG - Replaced all tabs with spaces in CHANGES. - Fixed entity bounds updates for 'light'. - Fixed code that doesn't conform to c++ standard as enforced by gcc. 24/01/2003 SPoG - Added missing file: icharstream.h. - Fixed bug with synchronisation of brush-face instance data. - Added .map format import/export interfaces. - Removed last remnants of IBrush. - Removed IPatch. - Moved walkers defined in in mainframe.cpp to appropriate places. 23/01/2003 SPoG - Changed scenegraph traversals to use a compiled graph. 20/01/2003 SPoG - Changed selection interface to hide per-instance data. - Added streaming tokeniser for .map format. - Changed mapq3 module to use streaming tokeniser. - Added xml stream interface for input and output. - Added xml stream parser based on libxml2 SAX. - Changed mapxml module to use xml stream input. - Changed brush and patch to use xml stream input. - Added xml stream writer. - Changed mapxml module to use stream output. - Changed brush and patch to use xml stream output. 16/01/2003 SPoG - Disabled pivot updates while selection is being manipulated. - Changed pivot calculation to use instanced world-bounding-box. - Fixed crash bug in PositionView. 14/01/2003 SPoG - Merged with branch merge-1_2_10-post at tag spog_merge_merge-1_2_10-post - Removed 10k+ lines of unused #if 0 code. - Removed unused declarations in qe3.h. - Removed brush and face types from qertypes.h. - Removed plugin API stuff dependant on brush type. - Added per-instance selection for brush faces. 08/01/2003 SPoG - Added selection counters for primitive/component modes. - Added face-drag mode (default shortcut key = F). - Added face-centre-point rendering/selection/editing. 07/01/2003 SPoG - Changed selection to work per-instance. 06/01/2003 SPoG - Changed selector interface to allow per-entity selection tests. 06/12/2002 SPoG - Added selection-test and selector objects to clean up selection system. - Unified key modifiers for selection in both primitive and component modes. - Added mapmodel module to load .map and .xmap as misc_model. 02/12/2002 SPoG - Added debug rendering of a selection test. - Fixed bugs in triangle/line clipper, making selection work properly. - Refactored selection system interface. - Added undo for texture nudge. - Fixed minor render-state bug. 29/11/2002 SPoG - Optimised wireframe drawing of brushes with back-face culling. - Optimised brush-winding generation. - Changed winding generation to be more robust with large world extents. - Fixed crashes with unbounded-face and degenerate-edge cases. 20/11/2002 SPoG - Completed rotation manipulator. - Added translation manipulator for the default editing mode. - Changed XY mouse-chaser speed to depend on distance mouse moved outside window. 15/11/2002 SPoG - Added initial version of maya-style manipulators - rotation manipulator. 07/11/2002 SPoG - Fixed false asserts in Brush ConstructPrefab. - Undo system optimisation - uses binary-sorted container to speed up finding already-added objects. - Fixed crash when transforming objects which don't support edit_interface. - Fixed clone command to nudge the selection after cloning. - Fixed clipper to remove brushes that are completely behind the clip plane. 06/11/2002 SPoG - Brushes: cleaned up per-face operations to use face visitor pattern. - Fixed setting brush face texdef, with fully functioning undo on individual brush faces. 04/11/2002 SPoG - Refactored renderer to two objects, camera and XY renderer - XY uses entity shaders. - Experimental pivot object.. work-in-progress. - Modified scene-graph instance-caching to maintain multiple instances within nodes. - Fixed undo bug, deleting a void* doesn't call the destructor. - Rewrote filters system to work with scene graph system. - Cleaned up quake entity module to provide same functionality as before. - Refactored render-state cache to use generic hashtable and reference-cache templates. 19/10/2002 SPoG - spog_branch - experimental - work-in-progress - added scene graph library: defines interfaces, generic graph node types, re-usable systems for traversals, traversal paths, node containers, multiple-instance caching of world-space-transforms/bounding-volumes/visibility. - added scene graph traversals to replace all traversals of 'active_brushes', 'selected_brushes', 'filtered_brushes' and 'entities' linked-lists. - added view module: view-volume-culling system acting on the scene graph, uses scene heirarchy to minimise culling tests per frame. - added opengl-state module: sorts opengl-state objects (shaders) to minimise opengl state changes during rendering. - added renderer module: culls objects outside the view volume, gathers non-culled renderable objects from the scene graph, keeps track of state during traversal, adds renderable objects to correct opengl-state. - added selection module: sets view volume to the selection box/ray, culls objects outside the view volume, gathers non-culled selectable objects from the scene graph (entity/primitive/component), selects gathered objects (select/toggle/cycle) or moves things if already-selected. - added patch module: encapsulates a patch as a scene graph node, optimised patch tesselation. - added brush module: encapsulates a brush as a scene graph node, adapts multiple-brush operations to use the scene graph. - adapted entity module: encapsulates an entity as a scene graph node/subtree, shares common code between different visualised entity types. - adapted model module: encapsulates a model as a scene graph node/subtree. - added undo module: completely new compact infinite-undo-system, operates on undoable objects, uses minimal-state data to store objects, uses refcounting to undo "deleted" objects. TODO: cleanup: many simple things are still broken or not functioning in the right way.. see !\todo items in the code (not all are documented yet though). Selection module probably needs refactoring some more - perhaps split off the move-already-selected stuff. The dependencies are still pretty bad.. need to refactor stdafx.h/qertypes.h. Some of the above modules are not really modules, they're static-linked to the core, but could easily be dynamic-linked. The interfaces to brushes and entities still expose brush_t and entity_t for backwards-compatibility. NOTE: some todos are #if 0 because their functionality is (or will be) replaced by the new systems. ------ branch point - spog_branch 30/08/2003 SPoG - Ported changes from trunk. 17/08/2003 SPoG - Ported changes from trunk. - Added quake pack to win32 setup scripts. - Fixed crash in RunBsp. 17/05/2003 SPoG - Renamed stream interfaces with C and I prefix. - Shoehorned bytestream into idatastream. - Moved member classes out of IArchive, replaced with member typedefs. - Renamed filesystem, path, dynamic string, file input stream with C and I prefix. - Documented filesystem, path, dynamic string, file input stream. - Cleaned up game-specific encapsulation classes a little. 16/05/2003 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=815 found out about string_t that slept through my reviews Updated list of broken stuff on this branch: - include/bytestream.h: remove this file, extend idatastream.h header from the code conventions: include/ directory: This directory is holding the API header files for the synapse modules (plus a few build control and version related headers) All headers that describe synapse APIs should start with an i: ishader.h igl.h The few files in include/ that don't start with a lowercase i are specific files for build control and configuration. Regular developement never creates non i-prefixed files in include/ the merge with IDataStream goes like this (note the corrected class names): class IInputStream class IOutputStream class IDataStream : public IInputStream, IOutputStream class ISeekableStream class ISeekableInputStream : public IInputStream, public ISeekableStream class ISeekableOutputStream : public IOutputStream, public ISeekableStream typedef unsigned int size_type; goes away, use size_t - include/iarchive.h renamed VisitorFunc to IArchiveVisitor move it out of IArchive class (keep it in iarchive.h though) from code conventions: Don't declare classes inside classes. Makes the code harder to read and isn't useful to anything. - remove libs/bytestreamutils.h put that functionality into the IStream stuff / idatastream.h stuff anything you retrieve from an IStream should be endian-correct - libs/filestream.h I'd rather see a header without embedded code, and a .cpp file for it - libs/fs_filesystem.h libs/fs_path.h those totally lack documentation about what they are doing same as above. way too much embedded code. makes things harder to maintain. implement in a .cpp and as usual, name the classes correctly, C and I prefixes - gamespecific_t: rename correctly to CGameSpecific I like the idea of gathering all hardocded game-specific behaviours inside one same class. But is it really the topic of bug800? - gamespecific_executable_t: rename correctly to CGameSpecificExecutable shouldn't this be merged with CGameSpecific? 12/05/2003 SPoG - Fixed win32 build error (win32 has no ). - Added dir_good() check to handle failure of dir_open() in posix DIR wrapper. - Renamed dynamic_string_t and path_t to DynamicString and UnixPath respectively. - Removed unnecessary use of 'inline' and 'virtual' keywords in class definitions (bad habit). - Documented archive interface. 09/05/2003 TTimo - some easy fixes to get it to startup on Linux - tagging the current source as bug800-spog, preparing rollback SPoG - Added an implementation of IArchive to do OS filesystem access. - Changed vfspk3 to use above implementation for OS filesystem access. - Added const qualifiers to vfsGetFullPath and everything dependant on it. - Changed vfsGetFileList to use "*" to indicate all-files instead of a NULL pointer. - Extended IArchive interface to allow for extra filesystem functionality. Added method to check if a file exists quickly. Added method to traverse the filesystem with control on start-dir and depth of recursion. - Defined implementation requirements for IArchive. An archive contains a heirarchy of directories and files, and may contain empty directories. An archive can be traversed in directory order. Directories can be distinguished from files during a traversal. Directory paths will always end with a separator. File entries can be opened as an IArchiveFile. IArchiveFile provides a simple non-seekable input stream which can only be read forwards. Any number of files may be opened and read from an archive simultaneously. An archive may be released while one or more files are still open, the files will remain valid until released. - Changed archivepak, archivezip and archivewad to implement all IArchive requirements. - Factored common code from archive implementations out into new lib/headers: fs_filesystem.h: a templated filesystem container, with iterators and efficient traversal. fs_path.h: a dynamic filesystem path object, with separator checking and efficient memory management. ibytestream.h: abstract interfaces for input byte streams. bytestream.h: utilities operating on abstract input byte streams. filestream.h: a c++ wrapper for stdc FILE object, implementing a seekable input stream. - Added a new pkzip-reader implementation, designed to be orthogonal to the compression library used. - Added a zlib input stream object, which decompresses data from an abstract byte stream on the fly. - Removed archivezip code copy/pasted/hacked from zlib and unzip.c, replaced by pkzip-reader and zlib input stream. - Changed vfsLoadFile to return 0 for a zero-sized file, only returning -1 if it failed to load the file. - Removed halflife-specific disabling of shader-loading, thereby allowing common-hydra.shader to work. - Added archivezip, archivewad and archivepak to win32 setup scripts. - Updated win32 setup scripts for halflife media. - Updated cons scripts for archivezip, archivewad and archivepak. - Added printing of warnings when vfs functions are given invalid input paths. -------- branchpoint: "bug800-spog_branch" 30/08/2003 SPoG - Ported changes from trunk since branch point. 11/08/2003 SPoG - Split qe3.h up into multiple headers. - Cleaned up use of win32 symbols: WINAPI macro for module functions removed. GUID for module interfaces replaced by string. boolean replaced by bool. MB_OK etc gui defines replaced by enumerations. - Removed plugin stuff deprecated by synapse from qerplugin.h. - Cleaned up use of glib symbols: guint32, gdouble, gboolean typedefs removed from non-glib-dependent code. TRUE/FALSE replaced by c++ bool true/false. - Removed all "extern" function declarations. - Removed dependency on MainFrame from preferences.h. - Moved synapse server and pluginmanager instances to pluginmanager.cpp. - Split pluginmanager.cpp into three parts: Radiant's synapse client stuff in plugin.cpp. Implementation of brush/entity/patch-handles stuff in pluginapi.cpp. Synapse server init/shutdown in pluginmanager.cpp. - Added forward-declarations to avoid including other headers. - Replaced CString usage with Str; - Removed unused brush-scripts stuff. - Cleaned up patch-vertex-area-selection logic. - Removed very old code chunks that were commented or #if 0. - Replaced project-entity with a dedicated key/value string map. ---- branch point - spog-cleanup 06/12/2003 SCDS_ReyalP - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=930 shortcuts to change texture window scale 02/12/2003 SCDS_ReyalP - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=913 fix for single monitor window positioning save - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=924 fixes to CenterXYView shortcut, correctly bound to Shift+Control+Tab now TTimo - add a 'q3map2' command line to win32_install.py, factorize and remove win32_install_q3map2.py -- linux 1.3.14 test build 1 29/11/2003 TTimo - heretic2 has no q2map. linux setup tries to install and breaks removed faulty setup line - cleaned more Linux setup fuckage caused by q2/her2 a tip: rm -rf build install before building and testing a new setup 28/11/2003 ydnar - full SCC purge of the vs.net project files (for real this time) - added seperate Q3Map2 build targets - added seperate Q3Map2 post-build Python script - _skybox entity support - _skybox and _decal in entities.def (Q3) -- win32 1.3.14 test build 1 28/11/2003 djbob - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=899 bobtoolz update (icon functionality is in menu too) djbob & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=842 migration of the win32 build system to vs.net/VC7 new libxml and libpng packages are required: http://zerowing.idsoftware.com/libxml/ http://zerowing.idsoftware.com/libpng/ updated win32_install.py for new names and paths TTimo - assraped the vcproj with sed to remove Scc entries SCDS_ReyalP - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=88 2D background image plugin TTimo - putting together win32 setup updates for 1.3.14 msvcr70.dll goes in core directory bkgrnd2d plugin content changed file paths (libxml/libpng) .xlink for new JA content 27/11/2003 TTimo - using a central scons.signatures file for checksums - version bump to 1.3.14 - a libxml-related build bug in qe3.cpp on Debian sid - it looks like Sid no longer has inflate_mask exported from /usr/lib/libz.so switched the mask to be defined in our source this may be a problem on other distros, and on holy box (Woody) SCDS_ReyalP - bug 921 and 922, Z floating window fixes - bug 926, hullcaulk, hintskip, subtlehint EvilTypeGuy - bug 505 - select all faces with a given texture 19/11/2003 ydnar - clipper tool plane points default to 1st selected patch mesh 17/11/2003 TTimo - upgraded server to subversion 0.33 -- released 1.3.13 10/11/2003 SCDS_reyalP - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=917 floating windows startup crash 09/11/2003 TTimo - fix M4_GAME_ET ( OSX setup ) AstroCreep - cleaned up JA shader scripts 01/11/2003 ydnar - Merged ASE submaterial/subobject code from BirdDawg - Made Q2/Heretic2 tools not use precompiled headers to eliminate Win32 compilation errors - Added glColor4ubv() support to the GL function table - Changed PicoModel rendering to use glColor4ubv() instead of 4 divides and pass-by-value glColor4f() - Fixed bug 900 by setting alpha to 255 explicitly in image module, rather than 3 input components, which was borking Q3Map2 jpeg loading, and thus compiles 24/10/2003 TTimo - bump to 1.3.13 Anders - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=826 new osx patch, fixes strip bug in setup. merging setup patches to a single file SCDS_reyalP - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=900 Some jpegs get garbaged alpha channel 22/10/2003 -- merge https://zerowing.idsoftware.com:666/radiant/GtkRadiant/branches/Release-1.3.12/ 19/10/2003 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=826 scons BUILD=info to generate a tarball and it's .info 18/10/2003 Spog - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=888 patch for 16 bit RGBA support in glwidget -- released 1.3.12 Linux 14/10/2003 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=879 fixed hellish dlclose issue only occuring with holy builds -- released 1.3.12 win32 -- end merge Arnout - added epsilon testing to hashtable compares to eliminate almost-identical vertices - pico surfaces now use the normals from LWO vertices 21/10/2003 Arnout - added hashtable for faster vertex matching during LWO surface generation - model rendering now uses DrawElements and will use vertex colours in wireframe/flats shade mode 20/10/2003 Arnout - added LWO support to picomodel. shader names are derived from surface name only geometry from layer 0 is used - added support for 'vertical flipped' TGAs 19/10/2003 Arnout - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=893 fixed starton primary monitor fixed mouse pointer setting on win32 to properly translate gdk's offset coordinate system in windows' one -- released 1.3.12 win32 11/10/2003 Spog - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=865 fix texture subsets TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=889 misc update, missing JA system textures - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=824 fixed .pref file trashing Nurail - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=881 BSP monitoring disabled by default in Q2 09/10/2003 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=883 more JA pack: shaders and mapextras.pk3 textures - fix Q2 win32_install.py to put the tools at the right spot - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=878 correctly support PNG images with an alpha channel - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=885 fix console to refresh during a texture directory load - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=739 fix weird Shift + Control + Z causing a Redo in non-floating window mode 07/10/2003 Nurail & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=872 Q2 tools, added -fs_basepath. Need corresponding setup and .proj updates - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=875 fixed broken surface properties in Q2 surface plugin TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=872 more fixes, build paths in scons, take out INSTALL config on command line (not functional + not need) added Q2 tools back to Linux setup - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=197 using "*" as the shaders minor in surface plugin - updated makeself copy to the latest from icculus.org cvs - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=574 sprite plugins, tweak to make it functional for all games - updated Q2 tools .dsp - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=876 more Jedi Academy setup work and content moving imagepng.dll module to the core, as now both Sof2 and JA need it sample maps reorg, new siege_hoth_sample.map - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=874 a lot more models - using a dynamic File Group in IS to cope with that - Q2 IS setup fix, was not properly putting stuff in baseq2/ IS setup: tweak to Q2 tools stuff 06/10/2003 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=872 Q2 setup needs to be cleaned up and unified between win32 and Linux using INSTALL_Q2 and TOOLS_Q2 in SCons script to install the Q2 tools fixed the setup build dependencies to reference the Q2 tools targets moved the Q2 specific modules imagewad and vfspak to q2/modules 05/10/2003 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=871 updating the gtk2 version to 2.2.4 adding an SVN module with the Gtk2 developer package: checkout gtk2-win32 updating IS to the new files sed'ing the .dsp to replace src-gtk2 by gtk2-win32 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=609 Q2 tools: comment out dupe strupr on win32 update IS setup to missing Q2 stuff ( vfspak and tools ) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=866 Fixed Camera inspector window not refreshing. Was a missing top level gtk_widget_show call 03/10/2003 Nurail - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=609 quake2 tools build scripts Linux setup updates - Q2 game pack in Linux setup TTimo - scan through all URL links in game.xlink to update them - added JA links (Raven and MapCenter forums) 30/09/2003 TTimo - update all synapse.config, win32 .dsw and install_win32.py for new surface module - Jedi Academy and Quake II game packs in IS setups - hardcoded hacks in editor core for JA, copied over from JKII - bug #867, disable sleep by default - q3map2 bug fix Nurail - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=862 Q2's 'no patch' stuff 29/09/2003 TTimo - OSX: fixup setup.xml.in -- merge bug856 back into trunk 16/09/2003 Nurail - new patch + win32 stuff for surface module TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=804 refactored the XML synapse.config handling: better detection of invalid XML file less code, factorized to CSynapseClient::ConfigXML - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=828 fixing bobtoolz 'shaders' major loading issues added '*' minor. to be used with lots of caution. only if the given major will have a single API such as 'shaders' also, map module was missing a VFS entry in non-HL configs. that's bad karma, using a minor "*" instead NOTE: on a lot of modules we could be using a '*' entry instead of having lines in synapse.config - took out obsolete md3model 15/09/2003 Nurail - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=856 quake2 surface module 07/09/2003 Nurail & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=856 a surface inspector module to customize per-game API removing DO_SURFACEPLUGIN define (enabled implicitely) removing bSurfacePropertiesPlugin (true implicitely) remove SI_SetActiveInRadiant, it's always on by default why was USE_UNDOTABLE_DEFINE taken out? - put back in removed DBG_PLUGIN define and related code, that stuff is from way back and no longer relevant cleanup QERApp_FreeShaders in shader module from DO_SURFACEPLUGIN stuff the WINAPI stuff in interfaces is not needed, that's an old remnant. Cleaned up -- end merge bug856 back into trunk 19/09/2003 Justin Blur - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=785 fix ~/.radiant permission bug Nurail & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=849 http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=851 win32 updates for the new modules and install_win32.py 16/09/2003 Nurail & Hydra - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=848 q2 map format minor 08/09/2003 Tr3B - imagepng.so / PNG format support in Linux NOTE: atm no official supported Linux game by GtkR uses this 07/09/2003 Nurail - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=851 imagewal.so module / wal image format - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=840 md2 support in picomodel 06/09/2003 Nurail & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=848 renaming mapq3.so to map.so added hooks for Q2 map format load/save to single map module (minor mapq2) Nurail - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=849 vfspak port to synapse and updates 04/09/2003 SPoG - Fixed crash in RunBsp caused by passing an invalid pointer to printf. - Changed console to wrap long lines instead of using horizontal scrollbar. 30/08/2003 Anders & TTimo - OSX setup, new patch to make scons SETUP=1 produce a .run - don't put bspc Linux binary in the setup 30/08/2003 Anders & TTimo - OSX setup, new patch to make scons SETUP=1 produce a .run - don't put bspc Linux binary in the setup 26/08/2003 Anders - more scons OSX, start on setup stuff 25/08/2003 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=855 make 'move into worldspawn' work again Anders Gudmundson & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=826 OSX scons build system 24/08/2003 ydnar - Removed "test.cpp" from radiant.dsp (merge artifact?) - Added ddslib to radiant.dsw - Correctly set lib deps for q3map2.dsp for ddslib - [bug 852] Increased buffers from 260 bytes on Win32 to 4096 bytes TTimo - bump to ver 1.3.12 - EnsurePythonVersion broke in 0.91 (commented out) David Hogue - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=844 q3data Linux. q3data can read .ase and turn them into .md3 23/08/2003 ydnar - Added ddslib to repository, based on nvidia sample code, cleaned up a bit straight C, loads DXT1, DXT3 and DXT5 format DDS textures. 22/08/2003 TTimo - https://zerowing.idsoftware.com:666/viewsvn/ - Arnout's commit email script - try #2 the commit script doesn't handle viewsvn root remaps (radiant instead of radiant.svn) adding a prefix to the report 04/08/2003 TTimo - conversion from CVS to Subversion: repository convert completed (with revml) module repositories glued together in a single one hooking email commit scripts and backup scripts - Python >= 2.1 required instead of 2.2 01/08/2003 SPoG - Changed gl widget to request maximum available depth buffer precision. - Changed all uses of deprecated GtkCList and GtkCTree to use GtkTreeView/Model. - Fixed directory handle leakage in synapse module search. - Fixed dir_dialog always returning NULL for Textures -> Load Directory. 23/07/2003 SPoG - Ported focus_out_event handlers in gensurf to gtk2 signals system. - Fixed failure to load models for entities other than misc_model. - Fixed crash in model module shutdown caused by mismatched resource capture/release. 22/07/2003 TTimo - fix q3map2 .dsp for correct glib-2.0 includes (common/vfs.c) - camera plugin installs to core now (RTCW and ET) - fixups to the merged setup stuff - patched cvsreport to provide explicit diff for some files #2 - fix to work with scons 0.90 / added LIBPREFIX ('lib') where needed https://sourceforge.net/tracker/?func=detail&atid=398971&aid=766975&group_id=30337 SPoG - Fixed crash in cmdlib ExtractFileBase when source filename is an empty string. 20/07/2003 TTimo - SCons scripts for the ported plugins: bobtoolz, camera, prtview, gensurf - ET Linux setup script + new plugins - q3map2.x86 is installed and wrapped through a q3map2 script (libstdc++ LD_LIBRARY_PATH) - update ChangeLog and credits - put back the GTKRAD_DIR in .fgl 19/07/2003 SPoG - Tagged trunk before merge as bug537-merge-3. - Tagged branch port_gtk2_20030307 as gtk2-merge-final. - Merged changes since tag bug537-merge-2 into trunk. - Removed gtk dependency from plugin toolbar interface. - Ported prtview, bobtoolz and gensurf to gtk2. 18/07/2003 Anders Gud - OSX build fix 16/07/2003 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=814 merging ET support code into to trunk - cvsreport 0.3.0 - http://www.nongnu.org/cvsreport/ rolling out this ver since old cvsreport setup broke - fixup to build on Linux (including fixing plugin builds) -- release-1_3_8-ET 02/07/2003 TTimo - new setup build, with patches and updates from SD - local fixing of bobtoolz dependency against libcmd, and itoolbar.h gtk header bustage 19/06/2003 TTimo - missing plugins. add them to .dsw for default build, add them to IS setup: camera, gensurf, bobtoolz, prtview - fixup bobtoolz code for VC6. for(int i=0 causing duplicate definition errors - removed pk3man from IS (we no longer distribute/maintain it) TODO: cvs remove the IS files for it - re-enabled plugins in build by default, disabled curry and textool TODO: following error when bring up About box of bobtoolz: BobToolz::ERROR->Failed To Load Exclusion List: C:\Program Files\GtkRadiant-ET-1.3\plugins\bobtoolz.dllbt\bt-el2.txt 18/06/2003 TTimo - add ET game pack. from Arnout's full dump of editor source + game pack data trunk tagged at ET-tag for this - Dlg_SdAskCorePath: szDir = "C:\\Program Files\\GtkRadiant-ET-1.<>"; 09/06/2003 ydnar - Added Q3Map2 keys/entities to Quake 3 entities.def - Removed obsolete vlight keys from Quake 3 entities.def - Added MD5 functionality to mathlib, from: http://sourceforge.net/projects/libmd5-rfc/ ------- merged changes since tag bug537-merge-2 from branch port_gtk2_20030307 to trunk TTimo - try checkin on branch see if cvsreport 0.3.0 will verbose it 08/07/2003 SPoG - Fixed recent-files list for file names containing underscores. 07/07/2003 SPoG - Fixed crash and file-type bugs in gtk file-dialog. TTimo - converted the setup code from perl to python - added copy over of libgcc_s and libstdc++, and LD_LIBRARY_PATH in the wrapper script 06/07/2003 SPoG - Changed console popup menu to include cut/copy/paste as well as clear. 05/07/2003 SPoG - Fixed the way surface-inspector dialog responds to escape key. 04/07/2003 TTimo - linux building / SCons 0.90 is broken, use 0.14 for now. added version check adding scons SETUP=1 option to spawn setup build enable back vfswad in scons TODO: grab Conscript-setup, convert it to python in build_setup function 02/07/2003 TTimo - building a win32 setup, using -gtk2 suffix (game packs in Radiant-1.3-gtk2 and core in GtkRadiant-1.3-gtk2) SPoG - Ported vfswad to gtk2. - Fixed memory leak in vfspk3 directory search. - Added vfswad to win32_install.py. 09/06/2003 TTimo - tagging setup/ as gtk2_setup_rollback rolling back trunk setup code to the branch to build an experimental release - merge trunk to branch: -- tagged HEAD with bug537-merge-2 -- merge HEAD between bug537 and bug537-merge-2 into the branch -- 31/05/2003 TTimo - grab back vfswad code that I forgot in bug 800 rollback - add prtview back to the project, fix it to build (#817) 27/05/2003 djbob - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=817 prtview fixes, upgrade to synapse -- release-1_3_8 -- end merge HEAD between bug537 and bug537-merge-2 into the branch -- - freshly merged in vfswad is broken - freshly merged in prtview is broken - q3radiant.dsp -> GtkRadiant.dsp, outputs GtkRadiant.exe - removed vc5 dsps SPoG - Updated win32 setup stuff to use gtk2 dlls. - Modified setup.pl to run correctly (tested on cygwin perl 5.6). 08/06/2003 TTimo - Linux: check gcc 3.x, better ldd check add gcc version to about message kill old cons stuff - added q3map2.x86 scons build - header conflict libs/cmdlib.h tools/quake3/common/cmdlib.h grepped through q3map2 source to change #include "cmdlib.h" to common/cmdlib.h - killed more cons files remnants SPoG - Improved error reporting for win32 setup system. - Fixed errors reported when running setup scripts. - Fixed scale of xor selection rectangle in XY window. 07/06/2003 SPoG - Fixed X Window System error when entering freelook on *nix. 06/06/2003 SPoG - Fixed copy/paste on *nix. - Changed copy/paste on *nix to use GtkClipboard api. - Changed copy/paste on win32 to be non-window-specific. - Further cleaned up MainFrame::Create. - Changed freelook to use gdk_window_get_origin instead of gdk_window_get_root_origin to place the cursor. 05/06/2003 SPoG - Fixed grey statusbar in 4-way-split mode. - Redirected gtk messages before creating main window. - Removed unused XYFriend hack from camwindow. 04/06/2003 TTimo - win32_install.py settings loaded/saved from site.conf 02/06/2003 TTimo - fixed python running with no output. Make sure VC6 finds native Python before any cygwin Python look at the Directories settings in Tools > Options to either kill the c:\cygwin\bin path, or have Python path first - renamed dupe files to avoid header collision and general confusion between entity and model - added win32_install.py to perform post-build install (need to load the configuration paths from a non-cvs stored site.conf file) 01/06/2003 TTimo - bind gen.dsp to makeversion.py - added a run_python.bat to check for python presence and execute 27/05/2003 TTimo - write makeversion.py module - hook it up to SCons build - cleaner, easier to use - comment out vfswad build lines. source is still not in tree (bug 800 aftermath I think) 18/05/2003 SPoG - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=537 Changed Sys_FPrintf_VA to immediately process console events during map load. Changed startup to create main window after QE_Init(). Fixed loading last map on startup. Fixed crash on exit. Fixed colour dialog. TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=537 have to delay merging back to trunk. have a behaviour problem between debug and release builds. while debug is fine, release is screwed (see bug item) -- tagged HEAD with bug537 -- merge HEAD between merge-gtk2-20030413 and bug537 into the branch ----- 11/05/2003 Dan Olofson & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=812 workaround for ATI drivers bug (polygon backfaces) use Preferences > 2D Display/rendering > ATI cards with broken drivers Riant - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=806 updated synapse.config for SoF2 png TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=805 dir_dialog is broken - is only used in prefab path prompt -- release-1_3_7 14/04/2003 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=801 moved "ignoring sprite for entity.." to be a _DEBUG only thing - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=802 fixed models not drawing on win32. was a setup bug - OSX setup build updates - added dependency against libpng3-shlibs - added openurl.sh to open urls on *nix (with setup updates) Riant - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=803 RTCW - default_project.proj in setup 13/04/2003 Michael Schlueter & EvilTypeGuy - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=684 imagepng building under Linux Riant & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=797 fixed texture compression support TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=799 regen project file from template on version upgrade updated all default_project.proj to have "version" "1" - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=798 missing modules/bitmaps/model_reload_entity.bmp from Linux setup -- end merge HEAD between merge-gtk2-20030413 and bug537 into the branch ----- 17/05/2003 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=537 http://www.qeradiant.com/wikifaq/index.php?Gtk2%20build%20notes went through the new dll dependencies, listed required files preparing for a single zip package updated all the project files to rely on src-gtk2/ 13/04/2003 SPoG - Tagged HEAD with 'merge-gtk2-20030413' and merged HEAD --> port_gtk2_20030307. 12/04/2003 SPoG - Added gtk-2.x libraries to win32 setup. - Changed win32 setup to use 'dynamic' file-groups, making it possible to add files without modifying installshield scripts. - Modified win32/setup.pl to copy setup data to dynamic file-group directories. 30/03/2003 TTimo - added scons scripts. the scons engine is included in the tree. you just need to have python have ldd -r safe check on .so TODO: - make sure it's gcc3 - check OSX - add q3map2 build 29/03/2003 TTimo - tracked and fixed the startup bomb on Debian sid: `pkg-config gtk+-2.0 --libs` -Wl,--export-dynamic -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangoxft-1.0 -lpangox-1.0 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0 http://www.gnu.org/manual/ld-2.9.1/html_chapter/ld_2.html#SEC3 --export-dynamic When creating a dynamically linked executable, add all symbols to the dynamic symbol table. The dynamic symbol table is the set of symbols which are visible from dynamic objects at run time. If you do not use this option, the dynamic symbol table will normally contain only those symbols which are referenced by some dynamic object mentioned in the link. If you use dlopen to load a dynamic object which needs to refer back to the symbols defined by the program, rather than some other dynamic object, then you will probably need to use this option when linking the program itself. this causes symbol confusion, shaders.so's g_ShaderTable suddenly resolves to the core's g_ShaderTable one is a 'shaders' API, the other an 'appshaders' .. everything gets badly mixed up added a check in the cons script, using `pkg-config gtk+-2.0 --libs-only-L` `pkg-config gtk+-2.0 --libs-only-l` (same for gtkglext) 28/03/2003 TTimo - propagate jpeg compile fix from bug750 branch - use PKG_CONFIG_PATH when building radiant/ (alternate gtkglext-1.0) - on OSX, you need gtk+2-dev package, and pkgconfig, atk1 build gtkglext from source http://gtkglext.sourceforge.net 17/03/2003 TTimo - updated the build system to glib2/gtk2/gtkglext atm it compiles and starts on my dev box (Debian Sid) but doesn't reach end of initialization, hangs on q = (qtexture_t*)g_hash_table_lookup (g_ShadersTable.m_pfnQTexmap (), stdName); in shaders.cpp QERApp_Try_Texture_ForName need to have the gtk2 dev packages, and libgtkglext1-dev 12/03/2003 SPoG - Replaced alpha-blended area-selection rect with XOR rect. - Fixed YX/XZ/YZ toggle in floating windows layout. - Cleaned up xor rectangle code. 11/03/2003 SPoG - Fixed console scroll-to-last-text-inserted. - Fixed console error/warning colours. - Refactored or removed WIN32-specific gtk-related stuff. - Removed win32 SetCapture/ReleaseCapture on GLWindow. - Removed win32 gtk_main_iteration calls in glwindow mousemoved. - Cleaned up start-on-primary-monitor stuff. - Changed main window to use standard save/load window position/size. - Replaced deprecated gtk_widget_set_uposition with gtk_window_move. - Removed win32/X gl functions from igl. - TODO: replace/remove deprecated gtk_widget_usize. 10/03/2003 SPoG - Changed fonts in win32 rc file to 8pt tahoma. - Fixed flat-grey gui in Regular layout mode. - Changed main-window save/restore maximized to use gtk API. - Fixed button_press_event handling on console/entity/entitylist windows. 09/03/2003 SPoG - Fixed crash on shutdown after changing floating-z-window preference. - Removed win32_realize_floating hack. - Refactored MainFrame::Create to make it more readable. - Fixed key_press_event handlers for entity/surface/patch dialogs. - Fixed delete_event handlers for dialogs derived from Dialog class. 08/03/2003 SPoG - Fixed viewport for entity window comment text. - Fixed x-shrinking for entity window comment text. - Fixed menu underscore shortcut hack in MRU list. - Changed groupdialog to connect switch_page signal after creating all pages. - Changed gl widget to use gtkglext/pango to create fonts. - Cleaned up gtkglext glwidget implementation. - Reduced border size on toolbar widgets. - Replaced font with font_name in win32 rc file. - Added viewports for all scrolled text boxes. - Fixed entities/textures/console window title update when page is changed. - Fixed floating windows not being transient to main window (don't want them on taskbar). 07/03/2003 SPoG - Created a new branch for the port to gtk 2.x. - Fixed menu underscore shortcuts to use gtk_label_new_with_mnemonic. - Fixed global keyboard shortcuts by using mainframe_keypress. - Fixed use of deprecated gtk_color_selection_get_color. - Removed use of deprecated gtk_paned_set_gutter_size. - Replaced deprecated gtk_widget_draw with gtk_widget_queue_draw. - Replaced deprecated gtk_object_get/set_data with g_object_get/set_data. - Replaced deprecated gdk functions with 2.x equivalents. ----- branch port_gtk2_20030307 ------ 13/04/2003 Michael Schlueter & EvilTypeGuy - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=684 imagepng building under Linux Riant & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=797 broken texture compression support 31/01/2003 SPoG - bug #752 - Construct fix for ppc, patch applied. 26/01/2003 TTimo - bug #750 - revamp of the setup stuff on Linux (under way, see bug for progress - feel free to help!) - reworked the cons scripts, setup is hooked in to cons now also, added gcc version select on command line, using Cons_gcc.pm utility 22/01/2003 TTimo - merged merge-1_2_10-post back to trunk =============================================================== -- merging release-1_2_9 -> merge-post-1_2_10 into trunk trunk before merge is tagged pre-merge-1_2_10 =============================================================== 22/01/2003 TTimo - finished up the TODO items, turned into bug items or dropped them. branch is ready to move back in to trunk 18/01/2003 TTimo - fixed ID_SELECTION_MERGE 17/01/2003 TTimo - fixups FlushReloadSelectedToolbarButton -> CFlushReloadSelected incorrect naming: RadiantToolbarModuleManager -> CRadiantToolbarModuleManager ToolbarButton -> IToolbarButton, and C* implementations http://www.qeradiant.com/wikifaq/admin.php?Code%20Conventions 14/01/2003 ydnar - Minor Cons fix for OS X (bug 729) 13/01/2003 ydnar - GtkRadiant now builds on OS X, Linux, and Win32 out of the same tree - OSX build uses gtkfileselect-linux now, as the Darwin version was broken/old fixme: change this to use OS X open dialog box or something? - Minor fixes to a few files to fix gcc warnings - Model module now builds on OS X and Linux, using Synapse properly - PicoModel change to invert T coordinate on ASE models - Q3Map2 change to export ASE models with T coordinate flipped - Misc Q3Map2 changes 09/01/2003 ydnar - Updated Construct with Darwin/OS X ld flags for 4MB stack size - Misc Q3Map2 updates (2.3.35-dev) 05/01/2003 ydnar - "angles" key now properly ordered, to work with current mathlib (also changed in Q3Map2) 31/12/2002 ydnar - PicoModel: Minor fix to MDC loader (naming/define) - Q3Map2: 2.3.34-pre-1 updates - MapXML dsp unix->dos newlines 29/12/2002 SPoG - Merged q3map2-texturing prefs key. - Merged vfs check for gamemode project key. 27/12/2002 TTimo - fix GetTickCount stuff - added q3map2 cons script - fixed Linux build 23/12/2002 SPoG - Added model cache API, moved model cache implementation from entity module to core. - Added file-type registry API, replaced core file-type manager with registry. - Changed model module to register supported file types with core registry. - Removed or #ifdef'd non-functional code from model module. - Added support for misc_gamemodel and model_static to entity module. - Cleaned up entity module's on-epair-changed API. - Moved light-entity-specific code to a seperate file in entity module. - Cleaned up file dialog interface - specify file-type-lists with a string. 22/12/2002 SPoG - Ported camera plugin to synapse, adding support for camera and ui APIs. 20/12/2002 SPoG - Fixed default prefs setting for selected-brushes-camera, gridmajor-alt and gridminor-alt. - Merged CEntityEclassModel::Draw in entity module. - Ported imagepng module to synapse. - Fixed warning for CamDragMultiSelect preference bool used as int. 19/12/2002 SPoG - Fixed white-textures bug caused by texture compression preferences. - Ported light-radius rendering to 1.3 entity module. 18/12/2002 SPoG - Merged win32 project files, with the exception of camera plugin. - Ported model module to synapse API. - Redesigned toolbar API to remove gtk-dependency from toolbar plugins. - Refactored window-position preference save/load. 17/12/2002 TTimo - kick doxygen generation for branch merge-1_2_10-post 15/12/2002 TTimo - having the linux version compile and start again. took out numerous elements while merging, built a list of TODO stuff the main thing to do being to bring the win32 build back up too, then to go through TODO list and fix stuff until the win32 version runs too, I check this in to a seperate branch merge-1_2_10-post - There is quite a massive update in mainframe.cpp switch case for all events. Looks like it's just a reordering of stuff, but it looks bad in the diffs. - added m_MapReg pattern - At some point, I'm thinking that forcing correct TAB/SPACE conversion on the server end would be a good thing to have. Nazisticly forcing the formatting sounds like the only viable solution. 11/12/2002 RR2DO2 - #418, mdc load and display (RTCW) - #597, CenterCamera shortcut Use Ctrl+Shift+TAB to center the views onto the current camera location - #714, bitmap loading fixes and speedups - #715, fixed Alt+Shift cycle/drill select to work with brush-based entities EvilTypeGuy - #718, fix compilation warnings Riant - #707, fixed HM mode in STV:EF 10/12/2002 EvilTypeGuy - Fix gcc3 compilation warning EvilTypeGuy and X-Man - Fix OpenURL so browser launching works on XDarwin (Mac) systems. 8/12/2002 RR2DO2 - #710, AssignSound pattern - #711, SoF2 model_static drawing - #713, sync 2d and 3d rendering of models - #238, apply 0..1 T range when Fitting a patch (instead of 0..-1 previously) - #633, Add ability to change default color in 3D window Misc > Colors > Camera background ydnar - Q3Map 2.3.33 (see changes.q3map2.txt) - Quake 3 + TA common.shader updates (q3map_terrain, hint) 3/12/2002 TTimo - merging Stable-1_2-Apple into Stable-1_2 - why INSTALL.TXT? re-used INSTALL, updated to point to wiki - why the -machinedump test against i386-redhat-linux? removed - using $is_darwin flag instead of $gcc_machine tests in the build scripts: gotta leave some room for a Linux ppc build, and darwin x86 exporting it for use in sub scripts - the addition of ccache support broke some Apple SConstruct patches to $ENV{PATH}, fixing merged version is compiling fine on Debian Sid checking in on a branch, need to validate win32 build and OSX build before applying in Stable-1_2 -- release-1_2_11 30/11/2002 TTimo - added seaw0lf to credits - ydnar's changelog.q3map2, added to global.xlink and Linux setup - 1.2.11 version tag - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=699 updated IS setup for q3map_terrain keyword also fixed details in STVEF media Arnout - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=569 http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=698 fixed drill select, Ctrl bug in vertex mode, and updated changelog.txt 29/11/2002 TTimo - 1.2.11-rc1 - update changelog credits links for release - update linux setup, putting EULA and new README instructions 28/11/2002 ydnar - Removed redundant 'p' from "developers" - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=637 - fixed - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=694 - fixed - Updated to Q3Map 2.3.32 - Added epsilon to texture plane choose code to eliminate numerical inconsistencies on brush faces slanted at 45 degree angles (bug 637) - Fixed bug in lightmap export after lighting when map contains 0 BSP lightmaps - Adjusted some light tracing constants to fix certain brush/patch seam shadows - Tinkered with skylight code again - Fixed bug where lightgrid would be black if level was compiled with -nogrid - Fixed -approx code to work in floating-point space, using _minlight - Fixed bug where vertex light code was using invalid pvs data to create light list for surface, leading to incorrect vertex lighting - Fixed related bug in anti-light-leak code that was causing brush faces to go black (bug 694) - New: _minlight sets _minvertexlight and (new) _mingridlight automatically - New: _mingridlight key to set minimum grid lighting TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=637 added preference setting in Preferences > BSP monitoring added an item on the wiki 27/11/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=662 picomodel-based model.dll module (new model.dll, removed md3module.dll) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=664 media/setup updates for q3map2 support added modified quakev3.qe4, bumped internal version to 4 for all games SOF2 and JKII were forcing BSP monitoring off because of sof2map, now only printing a warning added -rename to SOF2 BSP phase Q3 & RTCW new templates are working haven't tested the STVEF & SOF2 versions updated IS setup scripts to make sure quakev3.qe4 is updated in nightly release (not needed on Linux, we will be doing a full release) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=662 updated win32 setup to provide right model.dll stuff - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=621 typo was causing memory error RR2DO2 & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=662 more model fixes, fixed the Linux build to build model.so added search path to modules/ for bitmaps model reload, patch and bitmap 26/11/2002 RR2DO2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=569 area select - Alt+Shift for area select (complete tall) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=621 broken undo creating ghost undo entities (and trashes memory) partly fixes the issue, it's a memory error still - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=659 updates to RTCW camera plugin - works in 4 view mode - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=663 more fixes to plugin API TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=638 libpng in the core DLLs instead of SoF2 (for q3map2 dependencies) putting q3map2 binary with the Core Binaries 25/11/2002 TTimo - added ccache support to cons build system - http://ccache.samba.org/ 21/11/2002 ydnar - minor bugfix to PicoModel ASE material loader - Q3Map2 updated to 2.3.31 (Splash Damage) - Stitching the edges of lightmaps on patches that wrap around (cyls and cones) so the seam is no longer visible - The -patchmeta switch works better now, the patches are still stored in the BSP for collision, but are pre-tesselated into nonplanar meta surfaces for more efficient rendering - Better, more uniform lightmap sample position finding on patch meshes - Moved q3map_tcMod and q3map_alphaMod processing to the final phase - New: q3map_skylight AMOUNT ITERATIONS to replace surfacelight on sky surfaces for much faster and more uniform sky illumination - Fixed bug in PicoModel ASE material parsing code - Fixed a few seam/lightmap precision/projection errors - Increased MAX_SHADER FILES to 1024 and fixed overrun error when more than that number of shaders was listed in shaderlist.txt - Increased a few compiler maximums for larger maps - New: -np N switch on BSP phase, works like -shadeangle, in that it forces all planar shaders to be nonplanar with the shading angle specified - New: -nohint switch on BSP phase, omits hint brushes from compile for testing - New: -debugaxis switch on light mode. Colors lightmaps based on their lightmap axis (which direction the lightmap was projected on) - New: -debugorigin switch on light mode. Colors lightmaps based on the luxel origin relative to the raw lightmap's bounding box - New: -debugcluster switch on light mode. Colors lightmaps based on the pvs cluster the luxel falls into - New: -convert switch to convert BSP to ASE file (experimental) - New: q3map_lightmapmergable directive to allow terrain to be mapped onto a single lightmap page for seamless terrain shadows 18/11/2002 TTimo - fixed pk3man build system to work with new cons layout - fixing linux setup system to work with new cons layout Linux 1.2.11 will be a full setup, much easier that way - update makeself to the latest (and best) version - add q3map2 to Linux setup. goes in core (g_strAppPath) NOTE: has a dynamic dependency to libpng - pk3man still has issues with the zlib code that's been thrown in it unresolved which I don't have time to look at since we plan to drop pk3man in 1.3, dropping it now is just as good - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=644 detect GOTY install from registry and use it as default path 13/11/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=639 reworked to have the UI in game settings dialog (this is strictly win32 thing, if that broke Linux build, then fix the typos) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=630 mouse AngleSpeed setting was getting clobbered. fixed and upped the max values - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=623 applied a fix, rolls back the values when the compression formats are not supported fix ain't very clean, if we have to deal with extensions some more, we need to deal with the settings persistance better - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=624 updated the setup code for town_*.shader (both in full setup and update) updated files in WolfPack - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=672 using a QE4_VERSION define, added a message if there's a project template with wrong version 12/11/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=671 guard junk.txt path between " " - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=663 fix to CommitBrushHandleToEntity stuff RR2DO2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=660 previously you could select patch control points when patch selected + vertex edit (V) in 2D view. Works in camera view now 12/11/2002 TTimo - nudging zerowing to trigger Stable-1_2-Apple doxygen generation http://zerowing.idsoftware.com/doxygen/ 11/11/2002 TTimo - http://ttimo.net/web/anjuta modified the .prj to work with the cons patches (linked dirs) still way experimental - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=651 fixing linking for radiant.x86 10/11/2002 RR2DO2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=669 patch inspector bug - fixed - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=663 fucked up change in the plugin API caused breakage of several plugins still have to fix bobtoolz http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=665 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=661 Undolevels not set properly - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=660 drag selection to the camwindow for patches in controlpoint edit mode (not sure about the actual shortcuts, Ctrl+Alt on my current Linux setup) TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=657 mark map modified on editing entity keys - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=651 added the correct link and ldflags statements to have static linking everywhere didn't check gcc 3 build, check correct static on Debian Sid and holy box has a $staticstdcxx in Construct to toggle On/Off if needed 09/11/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=651 reworking the cons building. support for gcc2 and gcc3 cons -- gcc= read gcc version and configure accordingly changed _NO_STLPORT to Q_NO_STLPORT independant BASE_CFLAGS and BASE_CXXFLAGS correcting usage of CC/CXX for c/cpp source and linking fixed missing -lz in vfspk3.so changed the way we build curry.so, works from the GtkRadiant tree now (NOTE: gcc 3.2 build of curry.so spews quite a few warnings) tweaked the way we do -fno-rtti -fno-exception 04/11/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=638 .qe4 version 4, udpated q3's .qe4 template, update setup to put q3map2 in the right place bumped version to 1.2.11-test for test setups 03/11/2002 ydnar - fixed bug in jpeg loading code (4 components instead of 3 for RGB images, mh) - updated PicoModel to 0.8.8 and Q3Map2 sundry fixes (2.3.29): - Merged with latest CVS, fixed minor issues with matrix order - Fixed minor Sys_FPrintf/Sys_Printf substitution typo in Q3Map2 - Expanded debug colors to 12 for debugging surface meshes - PicoModel: fixed ASE loader to support > 1 texture coordinate per-vertex, so more models supported correctly, also loading vertex normals - PicoModel: md3 shader names are now cleaned. Suffixes (such as .tga or .jpg) are stripped, and \ path separators are changed to / - New: Add :q3map to the end of any shader name, and it will be interpreted as the named shader minus :q3map. Example: textures/shaderlab/concrete:q3map -> textures/shaderlab/concrete One potential use is the -approx feature to collapse lightmapped surfaces into vertexlit surfaces, saving lightmap space/memory - New: q3map_clipModel -- does what you think it does, sort of. This code ix really experimental, and should *only* be used on large models such as terrain (not small decorative models). This code will be evolving. Note: the shader's surfaceparms are inherited by the magic clip brush, so if you have nonsolid in your model's shader that uses q3map_clipModel, then the brush will also be nonsolid 03/11/2002 TTimo - cleaning up some cons stuff, checking that the setup building process is still good on Linux - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=622 updated Linux setup to put the bitmap 02/11/2002 ydnar - PicoModel: replaced stricmp with _pico_stricmp 02/11/2002 ydnar - PicoModel: added obj.c and ms3d.c, removed wfobj.c 02/11/2002 ydnar - seaw0lf - Updated Q3Map2 to 2.3.29 sources 2.3.29 - Merged with latest CVS, fixed minor issues with matrix order 2.3.28 - Bug 654 (http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=654): Fixed problem where brush faces, drawsurfaces, and surfaceparms weren't living together in perfect harmony (terrain surfaceparms now inherited by brushes) - Nodraw fog works now, albeit when you're underneath, surfaces above don't get fogged properly. Could be good for foggy water where you want the above-water portions to only be occluded by the water surface - Bug 656 (http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=656): Number of lightgrid points displayed (byte size is currently out of proportion due to internal storage format) when Q3Map is called with the -info switch - Fixed wack surface merging bug where code would attempt to merge triangles not adjacent to the current set, causing bad lightmap projections on nonplanar surfaces - Fixed tiny 1-character bug in 2d lightmap texture allocator where adjacent luxels were being checked for occlusion rather than the actual source luxel 2.3.27 - Fixed minor bug in scriplib bugfix where the last character in a file wasn't being read. - Fixed bug where 0-area or bogus triangles were causing crash in MapRawLightmap if they used a shader with a normalmap (thanks ShadowSpawn) - Fixed bug where lightmaps were getting hosed levelwide on a prerelease version of 2.3.27 - Fixed bug where lightmaps were getting knackered on models and certain patches - Merged latest PicoModel version from seaw0lf, adding support for ASE and WF OBJ models (preliminary) - Increased MAX_MAP_PLANES to 0x40000 (~256k) 2.3.26 - Now using GtkRadiant's libpng and zlib config (linked as DLLs) - Fixed bug in script parser where repeat calls to GetToken() were causing memory corruption - Fixed SOF2 -rename bug - When using -game sof2 or -game jk2, the -flares argument is implied - Added -noflares argument to disable the above behavior - Added support for flares on entities. Use one of the following keys: "_flare" "1" -- use default flare (different for each game) "_flareshader" "path/to/flareshader" -- use a specific flare shader Note: This only matters in SOF2/JK2 now. Make a light targetted (a spotlight) to get it to aim the correct direction, otherwise it defaults to pointing downward. You cannot have omnidirectional flares - Lightgrid size is automatically increased to accomodate large maps. The MAX_MAP_LIGHTGRID error will never happen again - Update PicoModel to 0.8.7 sources - ASE support - Alias|Wavefront OBJ support - .remap shader remapping suport - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=655 handle grayscale jpegs gracefully - mathlib: fixed VectorClear(), got rid of braces - scriplib: fixed double-free memory corruption bug - radiant: added new color scheme to emulate Lightwave/Maya/3DS Max 02/11/2002 TTimo - too many issues with build system reading system's libjpeg.h instead of libs/libjpeg.h renamed libs/libjpeg.h to libs/radiant_libjpeg.h, updated sources 29/10/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=639 running from a network share - saving prefs per-user 27/10/2002 TTimo - merged in some more m4x4 code for q3map2 - fixed unresolved code in picomodel (strlwr / strnicmp) - reworked the tools building to build both q3map and q3map2 without trouble 25/10/2002 ydnar - q3map2 and picomodel source, initial checkin to Stable-1_2 branch (does not compile yet, tweaking to be done) 23/10/2002 TTimo - camera.dll goes into $(RTCWRADIANTDIR)/plugins instead of $(RTCWRADIANTDIR)/modules fixed up camera compile (exports) added camera bitmap (plugin toolbar) 21/10/2002 TTimo - quickfix to the build (typo) - changed dynamic linking on Linux to look for libGL.so.1 by default fixes "all textures are blank" Linux bug with NVidia cards (you still have to have a working NVidia GL installation though, xlibmesa-dev on Debian screws things up) - checked in modified q3 .qe4 with q3map2 menu (see bug #638) 09/10/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=622 reworked the plugin toolbar to rely on interface instead of straight exports cleaned up the botclip monsterclip Brush_Draw filtering, added proper selection filtering (Brush_Ray) merged bug-622 back into Stable-1_2, bug-622 branch is dead now 06/09/2002 James Monroe - RR2DO2 - TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=619 light globes, applying patch by RR2DO2 built from the initial light globe code - note to self: indent -kr -nut -st -ts2 -i2 RR2DO2 - TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=622 massive patch update from SD's GtkRadiant - camera plugin: new bitmap fixed Linux install path for camera plugin to wolf/plugins - fixed various warnings in camera build gcc / Linux - fixed pref crash if plugin toolbar disabled - fixed Gtk-WARNING on bad cast in AddPlugInToolbarItem - renamed the new select to 'Use paint-select in camera view:' in prefs (camera paint-select, should be our default name for this) NEW: you can 'paint select' in the camera view: 'camera paint-select' press shift and move the mouse over the camera view to paint over brushes you want to select configurable in prefs to enable / use Shift key, or use 'classic mode' ctrl+alt NEW: light radius drawing Added in-editor light envelope drawing. Outer circle is max envelope, inner fullbright radius. Optional classic mode emulates the similar drawing from Rituals and Ravens tools (not q3map correct, easier for the level designer to understand/legacy). NOTE: 'angles' is q3map2 only NOTE: could manipulate angles directly from the views (2d and 3d with some handles) NOTE TO SELF: hey guys .. just a quick question if you don't mind .. I'm trying to track a Gtk-WARNING .. is there a way to make those apps cause a break to track them easily ? just run your app with --g-fatal-warnings TODO: add new bitmap to win32 & linux setups TODO: don't use exports for the plugin toolbar, use entry functions do something like CPlugIn::InitBSPFrontendPlugin TODO: botclip is broken with the new Brush_Ray code initial ChangeLog for the patch: 28-09-2002 Arnout + Added 'angles' support for models (misc_model/misc_gamemodel). + Prevented pivot drawing of model from scaling and rotating. + Cleaned up the dropdown boxes in the preferences a bit (all use tables now, so not multiline). + Added 'Classic Key Setup' option to camera paint select configuration, this drag-selects with ctrl+alt instead of shift. + Changed XYWnd::PositionView to position on the center of the selection, not on the mins. 27-09-2002 Arnout + Added in-editor light envelope drawing. Outer circle is max envelope, inner fullbright radius. Optional classic mode emulates the similar drawing from Rituals and Ravens tools (not q3map correct, easier for the level designer to understand/legacy). 26-09-2002 Arnout + Upped MAX_TEXTUREDIRS to 256 (from 128). 25-09-2002 Arnout + Fixed patches not being drawn in XY window with colour of parent entity. + Made paste to camera snap destination spot snap to grid. 18-09-2002 Arnout + Changed Select_Reselect to be much faster. 12-09-2002 Arnout + Fixed curve point drag-selection area not showing properly in XY views. + Fixed size info breaking over 9999.9 units. + Fixed AllocateSelectedPatchHandles not setting patchesmode to ESelectedPatches. + Changed the horizontal and vertical tc shift spin control to have a limit of 8192. + Moved SPoG's implementation of redisperse cols to a seperate function and reinstated the old code. + Added 'Paste to Camera', shortcut Alt+V, which pastes the contents of the clipboard to the current camera origin. + Added centerview functionality to 4 window mode. Ctrl+tab will focus on the selection, or if non existant, on the camera. 11-09-2002 Arnout + Made sure settings set in savedinfo.bin get initialized to their proper defaults. + Added botclip filter (filters *botclip* and *monsterclip*). 10-09-2002 Arnout + Removed .reg from normal map saving, can only save as region using 'Save region'. + Added outline style cycling (j) cycle between z buffered outlines and selected colour rendering. + Added colour dialog to pick the colour of selected surfaces in the camwindow. + Third coordinate for clip points now gets set to the center of the selection. + Changed arbitrary rotation dialog to accept negative angles as well. + Changed texture alignment dialog to accept values up to 2 decimal points. + Fixed entity inspector to say 'Textures:' in the window title. NOTE: still broke in floating window mode + Changed entity inspector so that tab doesn't clear the epair value field anymore, so it retains the value while jumping to it. + Disabling camera paint-select now returns selection behaviour for groups to the old behaviour as well (shift+click selects whole group). + Changed load_plugin_bitmap to load bitmaps from g_strAppPath if g_strGameToolsPath fails. + Added plugin toolbar and api. + Fixed m_pfnCommitBrushHandleToEntity, wasn't creating brushes properly (well, not at all really). Older changes: Arnout + Added misc_gamemodel drawing. + Ported camera paint-select over from 1.3. + Fixed statusbar display of text (removed a bunch of \n's). + Added area selection in 3d view for patches. 30/09/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=556 quickfix crash bug 27/09/2002 TTimo - more CORERADIANTDIR cleanup (q3data) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=602 added cascading to the entity submenu (doesn't cascade the main menu, only the sub ones, NPC_* for instance) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=556 with clip and caulk filtered out, won't be selected anymore in camera view (i.e. selecting invisible faces) added SF_CAMERA to the flags in the selection process cleanup up various ugly syntaxes in the selection code: don't ever do if (flags == SF_SINGLEFACE) on a bitmask and assert that the other flags will always be NULL don't do arithmetic on bitmasks: if ( (flags & SF_ENTITIES_FIRST) && t.brush == NULL) return Test_Ray (origin, dir, flags - SF_ENTITIES_FIRST); is WRONG using flags & ~SF_ENTITIES_FIRST is the appropriate way 23/09/2002 Riant - new IS scripts to go with recent media updates Riant & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=615 reworked the fix to use "caulk_shader" in .game updated IS .rul script to generate special values for Sof2 and JKII 21/09/2002 Riant - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=595 more texture compression, dialog and settings Michael Schlueter - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=592 fixes to the Linux build system, exclusive q3 or wolf working now 22/08/2002 EvilTypeGuy - Fix @*$&)@)$$ memory leak of my own doing, yes it's really been in there this long. This should help memory usage drastically, especially when flushing & reloading the same sets of textures, GtkRadiant's memory usage no longer becomes heinous. 14/08/2002 EvilTypeGuy - Fix build on some linux boxen by including qertypes.h for proper boolean type declaration -- release-1_2_10 16/08/2002 TTimo - STVEF media update finalized (some .def) - 1_2 Core Update for shader manual update - in JKII, typo with nar_shader? replaced by nar_shaddar, with proper support in update too - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=530 Q3/TA media update with cleaned up shaders - validated the update content by a diff between 1.2.9 + 1.2.10-update and 1.2.10 full - added a DO_NIGHTLY_BOOL to setup.rul AND a warning during setup about update content for games that are not installed - built 1.2.10-sof2, SoF2 full install 15/08/2002 Michael Schlueter - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=590 added the option to build a Linux setup with the debug binaries TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=530 cleaned up shaders, done nightly setup update on Linux updated Linux nightly for 1.2 to use /usr/local/games/GtkRadiant-1.2 as default base - using version 1.2.10-update. Full Sof2 setup will be 1.2.10-sof2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=426 don't straffe when using Ctrl+Shift(+Alt) - camera.so RTCW plugin in Linux setup - quickfix to non-initialized var in camera code - awfull piece of work that had been completely left out, nightly elements for JK2 and STVEF added JKII media update and STVEF media update (for the DIR_GAME elements) JKII nightly is finalized 14/08/2002 TTimo - fixed a missing file - Linux build quickfix - fixed silly rendering bug - added pref to force texture compression off (hey why would you do that??) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=466 fixed MAX_POINTS_ON_WINDING overflow in q3map (and relevant code to handle in radiant) 13/08/2002 TTimo - cleared up notexture (dead code) - cleaned up QERApp_LoadTextureRGBA gamma table init - having a shot at 1.3 texture compression sees the extension, binds the texture with the currect setting but rendering is fucked .. someone explain? 08/7/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=586 search and destroy Q3Radiant -> Radiant 07/7/2002 SCDS_reyalP - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=526 wolf_entities.def update riant - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=548 STV:EF updates - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=541 SOF2 updates - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=584 JKII updates 06/7/2002 Riant - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=541 Sof2 patches and IS setup TTimo - game pack prompt asking about STVEF, fixed - mp_examples was leaked and non lighted, fixed - imagepng.dll goes into Sof2 install / modules, and not in DIR_CORE - libpng12.dll needs installed only with Sof2 pack (added 'SOF2 Pogram DLL') default texture scale is 0.125 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=582 nomipmap -> nomipmaps in shader manual - removed libs/pak, this was still being linked in to Radiant, but not used at all - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=580 .PK3 are recognized along .pk3 files (strcmp ->strcasecmp) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=386 added the RTCW camera plugin to IS setup Michael Schlueter - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=581 GL warning fix - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=567 GL font display fixes (mostly Linux) applied the changes with some tweaking 31/6/2002 TTimo - compiling the camera plugin on Linux: move the GUID and other misc compatibility definitions to include/misc_def.h GetTickCount being used in camera.so, this is from radiant/missing.cpp (unresolved) -> use QGetTickCount instead (in main function table) 30/6/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=530 cleaned the .shader from 'light 1' statements updated the IS script for the updated .shader 17/6/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=541 Sof2 support, PNG format wrote imagepng module, dynamic dependencies to zlib and libpng changes in the core: some hardcoded to "sof2.game" for png interface loading and extensions in GetTextureExtension, killed outdated support for texture plugins if ! "sof2.game", png is not loaded, support disabled http://zerowing.idsoftware.com/libpng/ correctly configured for VC build (post build steps and dependencies) is required on win32 to build imagepng - added m_pfnGetGameFileName to the main function table (was needed for png stuff) - cleaned up the QERApp_LoadTextureRGBA path using (unsigned char* pPixels, int nWidth, int nHeight) cleaning up internal access path RR2DO2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=386 camera plugin for RTCW TTimo: wrote the .dsp, post build steps etc. IMPORTANT: you need to have RTCWRADIANTDIR env variable pointing to the RTCW Radiant files (default C:\Program Files\Return To Castle Wolfenstein\Radiant) 12/6/2002 RR2DO2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=299 MP/SP pk3 filtering in VFS - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=386 .camera support: splines library, camera plugin TTimo: portability fixups, cons build, guarding pragma, __cdecl BOOL virtual functions but non-virtual destructor declaration with no type int idCameraFOV::start - control reaches end of non-void, making it void enumeration not handled in switch no _MAX_PATH, the portable one is PATH_MAX implicit declaration of int _fullpath for(int i = 0; .. struct _IO_FILE has no member named '_bufsiz' stricmp -> Q_stricmp attempt at implementation in .h file (InitIglToQgl) camera stuff still vastly broken (particularly on Linux), need to check in because of new fixes incoming djbob - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=17 quick fix to spawnflags getting corrupted when multiple entities selected (doesn't completely solve the problems we have with spawnflags yet though) =============================================================== END -- merging release-1_2_9 -> merge-post-1_2_10 into trunk - END =============================================================== 12/12/2002 Hydra - #197, HL support update 11/12/2002 TTimo - added cmdlib dependency to mapq3.so (fixes unresolved) 25/10/2002 Hydra - vfsGetFullPath() can now (optionally) search PK3/WAD files - Half-life map loading is now un-borked (my original patch worked but some conditional code in the patch was incorrectly applied. That, coupled with the missing vfsFileExists and vfsFindFile replacements) - A patch to imagehl/lbmlib.cpp/LoadIDSP() was missed out, causing all sprite models to be reverse-rendered (due to an inverted alphamask) - Renamed HydraToolz to HydraToolz-HL as it's half-life specific changed project files and renamed all appropriate files and directories (for the merge, just delete contrib/hydratoolz and apply the diff) - Comments on previous notes: - TODO: need to rationalize where the modules are placed and identify HL specific modules (this affects the build system / post build step too) imagehl and spritemodel are halflife specific and can be placed in either $coreradiantdir/modules or $hlradiantdir/modules I've updated the .dsp files so that they are copied to $coreradiantdir/modules spritemodel can actually be used for other engines, not just HL so it makes sense to keep it in $coreradiantdir/modules hydratoolz is a half-life specific plugin and must go in $hlradiantdir/modules as it is NOT to be used for any other engines. I've also updated the "about text" to reflect this. 14/08/2002 EvilTypeGuy - fix build process for textool plugin on some Linux boxen by including qertypes.h 11/06/2002 TTimo - spritemodels in build system - applying HL setup patch (att 270, bug 197) - the templating went one filename seperator too far, causing all *.fgl to be modified .. fixed so that we only have the relevant changes - modules added to main Executable Files, TODO for later will need to identify what is HL specific - .game generation: don't want enginename yet, gamename is ok - updated HL .game generation for eclass_singleload and no_patch - update hydratoolz location in setup - update maphl in synapse.config 07/06/2002 TTimo - realized that \func doesn't work in doxygen, should be \fn (updated everywhere) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=197 applying the HL patch (see original list of changes below) - ugly eclass API changes eclassfgd/plugin.cpp.rej, eclass API changes involved, a bunch of .rej SupportsMultiple tries to send configuration information from the eclass format file module to the eclass manager dropping it, using a proper configuration node instead (eclass_singleload) - added "no_patch" prop to disable patch support the patch toolbar prompts are only present in prefs if there is patch support otherwise everything is force-disabled - PFN_VFSFINDFILE PFN_VFSFILEEXISTS: one of the problems we have is that the 'manager' code and file format code are in the same module (i.e. vfspk3 / vfswad: two formats, but the manager part is pretty much the same) vfsFindFile(relative filename): this worked by searching through the list of loaded pk3/wad files for the file then trying to search through the search directories - wasn't properly documented about what it does / how is the search performed - not consistent with existing code, duplicate of vfsGetFullPath for the most part can't be added to the VFS API as-is, it would confuse the interface - usage of vfsFindFile in the code doesn't justify the way it proceeds for search foxing it, replacing by calls to vfsGetFullPath vfsFileExists(relative filename): returns wether a file exist, can be flagged to search in pk3/wad or straight filesystem - this is a duplicate / particular case of vfsGetFileCount foxing it too, we need to extend and update vfsGetFileCount instead - mapq3: the changes completely fucked q3 map parsing need reorganization. same module provides parsing for all .map based formats we use wrappers around the actual calls and globals in the module to select formats MAPVERSION_Q2 and MAPVERSION_Q1 don't need to be there yet, they are not supported MAPVERSION_HL means WC >= 2.2 (when introduced, MAPVERSION_Q2 would be Q2 or qer+hl plugin (same)) MAPVERSION_HL uses "maphl" minor name (instead of mapq2) cleaned up the Q3 read/write code that got broken cleaned up various commenting/hack that deal with Q2!=HL format .. we'll see about Q2 when we actually do it bad cut and paste from cmdlib code, using actual dependency to cmdlib instead (see below for some cmdlib updates) - took out all SafeRead SafeWrite code from cmdlib, removed annoying cmdlib dependency to Error function all file access go through VFS module, the cmdlib 07/06/2002 15:47file code was way old - radiant/points.cpp pointfile code changes (that's used only for non-monitored compiling now) - applied patch 267 (hydratoolz fixes) - commented out some bworldcraft flagged stuff in mapq3/parse.cpp - updated the .dsw .dsp to compile and copy HL stuff - TODO: need to rationalize where the modules are placed and identify HL specific modules - TODO: seems to be a synapse crash when unloading plugins (hydratools) (looks like I didn't look at the plugin unload code yet actually) - TODO: make sure HL setup puts eclass_singleload="1" and no_patch="1" - TODO: WATCHBSP_KEY and TEXTURE_KEY hardcoded for HL need cleanup - TODO: imagehl duplicates some image functionality imagehl is supposed to be only for HL-specific image formats it 'adds' the required formats to the stuff that image makes available for everyone already - TODO: HL doesn't have a BSP menu! - TODO: rename mapq3/ into map/, the map module handles all .map formats - TODO: it's likely that we only need a vfs/ module instead of vfspk3/ and vfspak/ think about it, see if we really act on this (or do we need to abstract the manager and some file format modules) - TODO: HL synapse.config needs to use maphl - TODO: wtf is enginename="quake2" in hl.game - TODO: I don't have a sample HL map to play with, so I didn't test the changes against 05/06/2002 TTimo - fixups to make 1.3 start (Q3 mode) - turned off C++ exception support in the modules/plugins, as we don't use it - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=543 exit properly if missing chunks in synapse.config, don't crash Hydra - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=558 fix for version check in release build ====================================================================================== -- http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=197 HL support patch ====================================================================================== 04/6/2002 Hydra - Patched in some CVS changes and fixed a little issue with the new entity file loader code. 28/5/2002 Hydra - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=544 Selected Entity Bounding Box obscured by brushes fix. - Moved the "wad" keypair creation code from the Map module into a new plugin called HydraToolz, this means that wad keypair is done manually by the user, as in fact it should be. (as the order of the wads is actually important). - Fixed a problem with the wads in the wad list being re-ordered. 27/5/2002 Hydra - Created an inital implementation of a sprite model plugin. According to the powers that be, it seems creating a model plugin is hackish. It works ok, but there is no way to attach models (sprites if you will) to non-fixedsize entities (like func_bombtarget) Also, I can't get the alpha map stuff right so I had to invert the alpha mask in the spr loader so that 0xff = not drawn pixel. 17/5/2002 Hydra - "Wad" keypairs are now used when loading a map and speeds up map loading significantly. This sorts out quite a few issues that could otherwise occur. - Map loader now uses textures from wads listed in the the "wad" keypair first. - Added a texture name mapping cache system to the .map loader this significantly improves load times of maps that don't store texture names along with paths (e.g. "mytexture" not "mytextures/mytexture".) - Added vfsFileExists() to the vfs table (for above) and added it to vfspk3 and vfswad - Map loading and saving times are printed to the console. - Wad file names from the "wad" key pair are logged to the console when a map is loaded - The user is informed if the textures loaded were not found in the wad files in the "wad" keypair. - The user is informed if the textures was not found in any wad file at all (Q2/HL only, the shader module still gives you similar information for other games when a shader activation fails) 8/5/2002 Hydra - Added basic support in mapq3 for reading maps saved by Worldcraft 2.2+ in .map format (It uses [ ]'s round some of the texture co-ordinates) TODO: do we need to be able to save a map in this format too ? - Added support for loading ZHLT style point files (*.lin) - Added wad filename information when loading textures. (This helps take the ambiguity out of which wad files textures come from, so that we can correctly setup the worldspawn "wads" e-pair manually.) Note: This will be removed when the "wads" worldspawn key is built by radiant. - added vfsFindFile() to vfs table. - VFSWAD: vfsLoadFile() no longer ignores paths when loading textures (this was by design, but the design has changed for the better) - When loading a Quake2 map file, vfsFindFile() is used to find the actual path of the shader/texture being loaded. This fixes all the weird issues that crop up when we were able to use non wad-relative texture names () and wad-relative(/). (such as having an image loaded twice in memory.) We also now get the correct shader name in the suface inspector too. Note: not sure if this code should stay in the map parser, or wether it should be moved to where shaders are first initialised. Note: maybe this needs to be when a halflife map is loaded, not specifically a quake2 map file. - added EClass_SupportsMultiple to the EClass loader API. Note: this is poop. FGD files can be additive but radiant makes it so they can't be. This function would not be needed if the eclass loader itself took care of the init, rather then the manager taking care of the init. Also note that if the loader were to take care of the init then FGD files *CAN* be additive, as it's not down to the format of the FGD files. However, it'll do for the moment because all the supplied FGD files that come with halflife and it's mods are meant to be used one at a time. - removed support for having an additional (not external) eclass loader. Just ifdef'd for now, grep for USEADDITIONALECLASSLOADER. We never mix entity definition formats and synapse.config allows us to just have the right one and also there is no mechanism for setting g_bHaveEClassExt anymore. - Texture subset on by default for halflife. - default texture scale is now set to 1 instead of 0.5 for halflife. (needs to be 1 for q1/q2 too) - patch toolbar disabled by default for halflife and it's also disabled in the preferences so it can't be turned back on) (needs to be 1 for q1/q2 too) - bsp monitoring disabled by default for halflife - When you drop a light entity the epair "_light" is used instead of "light" (halflife specific) - removed -fs_game additions to the map compiler commands; ZHLT doesn't support it. - saving of contents/flags/values in q2 format maps disabled (ZHLT doesn't like em !#?!) TODO: re-enable for Q2 (but not halflife) format maps when we can can figure out what game/engine combo we're using from within a module - configured mapq3 to have dynamic VFS API too - Added halflife shaderlist.txt parsing back in, it's actually useful afterall (for editor shaders). ====================================================================================== -- end HL support patch ====================================================================================== 01/06/2002 TTimo - merging 1.2.7 -> 1.2.9 changes into 1.3, merge notes: - the win32 .dsp are a bit different, using the $(CORERADIANTDIR) post build commands now - merged in the JKII/STVEF hardcoded chunks, should probably check that everything is still fine on that end was setting the "dir" epair in project files intead of "gamename" like all other games? (which should really be "fs_game" anyway, I wonder who decided to call it "gamename") - rebuilt a setup. we have a problem with RADIANT_MAJOR RADIANT_MINOR it seems TODO: setup needs to use GtkRadiant-1. as basename in start menu, and base for installation C:\Program Files\GtkRadiant-1.3 and C:\quake3\Radiant-1.3 etc. for the game packs TODO: add HL setup chunks! =============================================================== -- merging release-1_2_7 -> release-1_2_9 into 1.3 =============================================================== 28/5/2002 TTimo - final fixes for Linux 1.2.9 setup 27/5/2002 TTimo - bug 521, q3 entities.def trigger_hurt fix - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=542 default texture scale is configured in .game defaults to 0.5 (q3/wolf) if nothing specified, under the prop "default_scale" removed the item from the prefs dialog too updated the nightly setup to put the proper param in JKII .game - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=509 changing texture window scale changes selected brushes texture re-selecting the previous texture can be done, but is a bit tedious to write made sure we deselect before re-init of the tex window view - fixed linux setup code bug. won't be any update, only a full release on linux 26/5/2002 TTimo - parallel cons working at last! was a problem with the targets list ('Default' command) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=515 using the eclass extents for the box if model can't be found - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=435 changed the submenu cascading params to avoid the overlap (we fit less stuff now obviously) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=540 that sigchld handler is only used on Linux to report the run times since we are rewriting the whole BSP code stuff, we can drop this for now - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=538 removed that prompt and display - we build radiant.x86 in cons scripts, updated the setup code - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=526 updated the setup script to install new wolf_entities.def - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=302 added q3map2 URL to global.xlink, updated Linux setup - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=465 printing q3map version info through the net stream - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=539 fixed various media, some related code, and Linux setup - fixed watchbsp.cpp "jk2.game", was breaking game spawn for wolf (needed else if) SCDS_reyalP - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=504 fixed bobtoolz vis viewer to work with RTCW (BSP version) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=526 update of the Wolf entities file 25/5/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=164 corruption on exit, tried to look some more. Cleaned up some source, need looking at Gtk code closer - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=536 cleaned up SHADER_NOT_FOUND SHADER_NOTEX internals some more added a clean error exit in case this happens, fixed a crash that would happen anyway (Patch_LODMatchAll) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=394 cleanup/sanitize of the pattern filtering code, it was ugly. did some doxygen documentation fixed part of the print XY code, more broken stuff showed up, dropping it - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=503 region compiling was indeed fucked, spog b0rkage fixed so that it works again denying compile with camera out of the region reworked SelectBrush to deal with regioning and select the right brushes 24/5/2002 TTimo - Linux build fix 23/5/2002 Riant & TTimo - STVEF patch and setup scripts TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=516 moved error handling code to it's own file radiant/error.cpp compiled with UNICODE define (that's why I had to isolate), and process the error string so that Gtk can print it (that's only relevant to win32) 22/5/2002 TTimo - quickfix, cleanup of the console verbosity 11/5/2002 TTimo - final IS script updates for JKII game pack, version 1.2.8-jk2 - fixed a bad karma #ifdef _DEBUG chunk in Texture_NextPos (causing crash of release build) - added web url support in .xlink files (strstr on http://) 10/5/2002 TTimo - cleaned the build step copy from $(QUAKE3RADIANTDIR) to $(CORERADIANTDIR) - system shaders auto-load: display 'system' in the prefs - force BSP monitoring off in jk2 mode - cleaned up web update check, added HL (3) and Jedi Knight II (number 4) (on the web database too) - updated IS setup script for mapextras.pk3 Riant - system shaders auto-load in prefs Raven - mapextras.pk3 as replacement for system.pk3 (system editor textures) 8/5/2002 Riant - game pack and patches for JKII support TTimo - .game additions to specify .shader path (shaderlist and shader scripts) NOTE: if we ever use q3map for JKII compiles, that would need to be propagated - reworked the shaderlist to list all the included shaders - built a system.pk3 pack for textures/system/ and textures/radiant/ (misses a few pieces still) - MP / SP mapping mode toggle, SP ignores mp_*.def MP ignores sp_*.def - fs_basepath does not get added during BSP command expansion for JKII mode - more verbose on script location and junk.txt location when monitored compile is disabled (the BSP compilation WANTS to be rewritten, it's getting VERY URGENT) - JKII game back IS setup lands 7/5/2002 TTimo - using radiant.x86 as Linux target (instead of radiant, didn't fit with the setup procedure) - bumped version tag - TODO: bug #453 code needs backported from 1.3 6/5/2002 TTimo - fixed typo in plugins/mapq3/write.cpp Map_Write g_count_entities = 0; instead of g_count_brushes - more fixes which showed up while merging this with 1.3 -- release-1_2_7 ----------- tagged and Stable-1_2 merging into trunk 02/5/2002 Gef - added filtering on unselect for newly created brushes/entities (bugzilla: #374) SPoG - added undo for pasted/cloned brushes ============================================================ -- end release-1_2_7 -> release-1_2_9 merge ============================================================ 15/05/2002 TTimo - rewrote the ref count code cleanly, added some elements to design and todo - wrote the core shutdown code of synapse, 1.3 exits cleanly without crashing (well, in most cases it seems) 10/05/2002 TTimo - began writing proper unloading and shutdown of synapse (see libs/synapse/docs/unload.txt) design doc started, non active modules are unloaded after startup need win32 implementation of ReleaseSO - quickfix on win32 (ReleaseSO) 07/05/2002 SPoG - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=512 - cleaned up strHomeMaps and strFSBasePath stuff prompts for maps, models, sounds etc are fs_game-dependant =========================================================================== -- merging Stable-1_2 between Stable-1_2-tag and release_1_2_7 into trunk merge ChangeLog ============================================================================= 07/05/2002 - using RADIANT_MAJOR_VERSION and RADIANT_MINOR_VERSION for the version info, this was conflicting with synapse - m_strHomeMaps http://zerowing.idsoftware.com/viewcvs/viewcvs.cgi/GtkRadiant/include/qertypes.h.diff?r1=1.27&r2=1.28&only_with_tag=MAIN http://zerowing.idsoftware.com/archives/gtkradiant/2002-February/002170.html posted on the ML, bringing it back in from 1.2 setup scripts: easily merged, as the 1.3 scripts have not been touched mostly qe3.cpp conflict: 1.2 tweaks stuff in the QE_*Project* functions 1.3 has them mostly commented out applying manually where relevant the project settings stuff is very different, and the changes can't be applied as is given the fixes I had to do in 1.2, I'd expect the current 1.3 version to be fairly broken a complete kill and rewrite of the prefs/project stuff might be our option anyway http://zerowing.idsoftware.com/archives/gtkradiant/2002-May/003038.html qe3.cpp QE_InitVFS conflict: 1.3 has some changes when creating the files in a new userprefix (ex. ~/.q3a/baseq3/scripts /maps /maps/prefabs etc.) merged by hand, probably needs to be checked qe3.cpp OpenDialog SaveAsDialog conflict: commented out in 1.3, getting rid of it completely preferences.cpp conflict: 1.2 adds CUSTOMSHADEREDITOR_KEY pref 1.3 uses a completely different syntax for prefs preferences.cpp conflict: prefab path pref changes conflict with 1.3 pref syntax applying changes manually to 1.3 codebase pmesh.cpp conflict: 1.2 adds pref to group / not group patch thickening 1.3 changes the way we manipulate entities around that code merged manually, would be worth checking that the thicken pref works pluginmanager.cpp conflicts: synapse completely changes that part on relevant 1.2 thing is the removal of pfnRadiant_Free map.cpp Map_ImportEntities conflict 1.3 has bug 453 map conversion promt that was not backported to 1.2 (caused merge to conflict a bit) usin 1.3 code and checking 1.2 changes manually using radiant.x86 as Linux target (instead of radiant, didn't fit with the setup procedure) 06/05/2002 not merging in .dsw .dsp an eclass.cpp fixed moved to eclass_def.cpp mainframe.cpp is always a bitch to merge, sent several mail comments to list about conflicts that arose MainFrame::OnFileSaveas needed some updates that were not in the diff (correct default prompt) (same for MainFrame::OnFileSaveregion) MainFrame::OnFileNewproject conflicts a bit, changes have been made in 1.2 and 1.3 changes in 1.2 seem more crucial, using the 1.2 version, and patched the 1.3 manually over it (might need to be checked, bug #506) TODO: need to check for parasite g_free that I added back from the file dialog propagated ChangeLog from Stable-1_2 ============================================================================= 02/5/2002 Gef - added filtering on unselect for newly created brushes/entities (bugzilla: #374) SPoG - added undo for pasted/cloned brushes TTimo - shift+left click to open shader editor no longer selects the texture on the way (this was unstable, pCurrentShader could become NULL somehow) - editpad bindings were completely broken attempts to make it work again failed taking it out changed the prefs, on win32 you select between internal shader editor or win32 .shader binding we have lost the ability to jump to a given line, if someone has a good solution for line jumping, let me know - one more fix to the MAJOR / MINOR safe checks stuff - bug #500: oooogly, I removed a line which I should not have :) 01/5/2002 TTimo - "Save selected.." load/save in fs_game sensitive directory too - removed a bunch of unused/broken project settings items removed most of them actually .. project settings are .. ahem - added an optional 'go to url' button in gtk_MessageBox 30/4/2002 Gef - fixed lod drawing of selected patches when patches are filtered 29/4/2002 TTimo - bugzilla #467 make patch inspector deny space textures make mapq3 write code drop space textures - bugzilla #132 removed remotebasepath and texturepath rewrote the Textures > Load Directory (which was kinda relying on texturepath) - bugzilla #355 uploading editpad zip to qeradiant.com misc/ in files section, replacing the win32 message about editpad added editpad quote in qer.com totd - fixing the map load/save dialogs to work correctly with mod settings on win32 (was done on Linux and still broken on win32) 26/4/2002 Gef - fixed patches losing their shader if outside region when calling flush/reload (bugzilla: #492) - blocked textures with spaces from loading in Texture_ShowDirectory with a warning (bugzilla: #467) - fixed a dud shader (liquids.shader -> textures/liquids/ripplewater2_back) didn't have the textures/liquids prefix 25/4/2002 Gef - fixed a broken image link in the shader manual (bugzilla: #486) - changed prtview to use ~/.radiant//prtview.ini instead of ~/.q3a/radiant/prtview.ini on linux - fixed prtview loading/saving config (bugzilla: #424) TTimo - removed QERApp_RadiantFree from the function table we can malloc and free across modules configured correctly for the CRT (Common Runtime DLLs) cleaned up related broken malloc / free strategy in the plugins (vfsLoadFile uglyness) - added main build date and version to curry / pk3man / prtview 23/4/2002 SmallPileOfGibs - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=229 flush and reload was affecting texturing of selected brushes TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=489 File > Check for update menu item, jumps to the website and checks for update - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=431 win32 part, RADIANT_MAJOR RADIANT_MINOR written out by setup - more stuff on File > New Project and common mod setup issues (not finished yet) 22/4/2002 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=431 reworking a bit the installer stuff wrote the version checking needs testing on win32 (RADIANT_MAJOR and RADIANT_MINOR are required in the install now) 21/4/2002 TTimo - trying more seriously to get a new nightly out updating the ChangeLog for current 1.2.7 from this file cleanups, browsing through the bugs to close/update/fix - http://zerowing.idsoftware.com/bugzilla/showattachment.cgi?attach_id=197 I kinda fixed that myself already, going through the diff and applying the missing stuff creating the prefabs/ dir in QE_InitVFS - added a line about the games dialog / auto-select at startup in the dialog frame 15/4/2002 TTimo - cleaning some old commented out map load code - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=477 on Linux: - strHomeMaps was init without taking care of m_strFSGame - SaveAsDialog was not using strHomeMaps NOTE: should strHomeMaps be spcific to Linux, or we will do better if we unify need similar checks on win32 13/4/2002 TTimo - kicking the source to generate new doxygen on zerowing 09/4/2002 Gef - setting the sel_mode accordingly when (i)nverting selection, verts were being drawn when they shouldn't have been 05/4/2002 Gef - fix File/New Project for mods so it doesn't fail if the dir exists (bugzilla: #459) - add Linux-isms for New Projects & read/write permissions... note: for a total conversion, basepath needs to be manually set - prevent opening multiple internal shader editor dialogs - added preference for using a custom shader editor - set horizontal scrollbar to be automatic instead of never for entity keyval list (bugzilla: #4) - added a call to Select_Reselect() in XYWnd->OnViewEntity() to make sure its modifying the current selection (bugzilla: #436) - fixed entity dialog passing events through to main window (bugzilla: #454) return values were backwards - patching in the .pfb extension adding stuff (bugzilla: #259) - fixed thickened patches not being grouped (bugzilla: #226). this was supposed to be happening anyway, the entity create code was called before the patches were selected 02/4/2002 EvilTypeGuy - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=457 add entity #X and brush #X comments back to saved .map files 24/3/2002 Hydra & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=444 only show empty alpha channel warning if the tga texture is actually 32 bit (24 bit would always have empty alpha, the warning was useless in this case) 19/3/2002 Gef http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=217 - Set show value to true for angle and movement velocity sliders in preferences - Increased the maximum value of angle velocity from 6 to 100 18/3/2002 SPoG - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=419 fixed File->Save with region active acts the same as File->SaveRegion for ents end merge ============================================================================= 16/4/2002 SPoG - fixed MDC_XYZ_SCALE value 12/4/2002 SPoG - fixed win32 compile error - vc6 being nitpicky - fixed refcount init on CSynapseAPIManager - cleaned up md3model win32 project file 9/4/2002 Gef - added nudging for selected brush and patch vertices (bugzilla: #240) - added selected brush vertex highlighting - sorted all the ID_'s in HandleCommand alphabetically to make it easier to track things down - setting the sel_mode accordingly when (i)nverting selection, verts were being drawn when they shouldn't have been 5/4/2002 EvilTypeGuy & djbob - patched in djbob's grid minor/major color settings for gridsize < 1 http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=24 1/4/2002 TTimo - configured md3model to have dynamic VFS API too - cleaned up texwindow.cpp texture extension loop - updated current HL media with hl's synapse.config http://zerowing.idsoftware.com/stuff/HL-media-0401.zip - checking in new synapse.config for Q3/RTCW - fixed win32 project files, removed hltoggle.h - bumped version to 1.3.3 31/3/2002 TTimo - XML runtime configuration of synapse uses a synapse.config in the gametools path, we can add a line in the .game to specify the file later on - various cleanups and removal of dead code - Linux build system: sanitized CFLAGS, libxml, STLPort and glib include path all in the toplevel Construct file - removed the 'cons -- halflife' option, the binaries are unified again - cleaned up image loading 29/3/2002 TTimo - patching in Hydra's code for Half-Life, builds and runs on Linux, need to quickfix on win32 now - build system on Linux: some things are still hardcoded into the core, you need a different core for Q3/RTCW or HL for now. do ./cons -- halflife to build HL mode (build trees are seperate) - there is no media / install procedure yet, but a zip with what you may need for install is available: http://zerowing.idsoftware.com/stuff/HL-media-0329.zip - cvs added all the new files - patched various things from the patches, don't have a precise list cleaned up the interface requests, isolated HL specific between TMP_HALFLIFE defines removed 'tga' from imagehl, two modules providing the same API has unexpected results TODO: the image loading is the main problem right now. We should not have any place that scans the extensions, this is done internally to the image load manager? texwindow.cpp does enumeration of the minors too .. but that may be legal in this case. TODO: synapse config at runtime through XML (rather big piece) - fixing build on win32 bad coding practices: 'for (GSList *choicelst = ..' added a quick hack include/hltoggle.h for easy switch q3/rtcw or hl compile (remaining hardcoded stuff is temporary) 28/3/2002 Gef - added linux pthreads support to tools - removed old terrain.c and lightv.c from q3map2 Conscript 27/3/2002 Gef - updated cons for q3map 2 - minor q3map2 fixes for linux compile errors/warnings - minor warning fix in map.cpp SPoG - changed entity_addtolist to add entities to end of list instead of beginning - added eclass_forname to eclassmanager interface - fixed setting eclass before model-update for entities loaded from map - fixed setting bounding box for models after model-update ydnar - q3map2 - fixed crash on -connect and other gremlins related to argument processing - removed flag that prevented Castle's maps from compiling 27/3/2002 Hydra Important Changes: - Added VFSWAD modules for extracting textures from WAD files. - Added ImageHL for loading textures contained in WAD files - Updated shaders source code so that you can produce ShadersHL.dll (single minor using #ifdefs) - MapQ3 source updated so that it can load and save q2 format maps provides a multiple minors. - Added EClassFGD for loading FGD definition files (I documented this code quite well, if you're interested...) - Added support for iconsprite() settings in the FGD loader, we set eclass_t->skinpath with the name of the sprite TODO: write a sprite model plugin. Fixes: - Fixed incorrect line numbers being reported when script files had // comments in them - Removed EClass_Create from the EClass manager _EClassManagerTable - Replaced all occurences of "textures/radiant/notex" in shaders.cpp with a define. - Fixed a crash in shaders.cpp when there was no default texture. - Fixed a possible issue with g_bCancel_Map_LoadFile - Added a crash fix for uninitialised patchMesh_t->pSymbiot Core Changes Required for HalfLife Support: - Set MAX_FLAGS to 16 to support Halflife's extra spawnflags, adjusted entity inspector to display the new spawnflags, updated FGD loader to load them correctly (previously it only loaded the ones with values <8) (Done without breaking the old Q2 code that was commented out) - Added GetTokenExtra to the _ScripLibTable - Kludged texwindow.cpp to allow loading extension other than "tga" and "jpg" TODO: ttimo, we need something in synapse to help with this. - Plugin manager requests different API's depending on .game file used. TODO: this needs to be done on a PER GAME basis, not PER .GAME FILE. - Shaderlist.txt is not parsed on startup if hl.game is used. TODO: this needs to be done on a PER ENGINE basis, not PER GAME. Cosmetic Changes: - Changed MAPQ3's minor_name from "map" to "mapq3" (also adds "mapq2" as a minor) - Changed XMAP's minor_name from "xmap" to "mapxml" - Changed VFS's minor_name from "quake3" to "pk3", more inline with VFSWAD now. - Changed file/Load to file/Import on the menus - When a shader (Q3/HL) is not found a message is displayed in the console (only once for each shader that is not found). This is so the user can quickly get a list of missing textures/shaders. 26/3/2002 ydnar - initial q3map 2.0 source import new tools/quake3/q3map2 directory common/qfiles.h and common/surfaceflags.h modified affects q3map 1.x too, bumped MAX_MAP_BRUSHSIDES to 0x40000 will need to write the build scripts and compile on Linux too SPoG - Re-added dialog prompting user to convert/change-mode/abort when map BP mode conflicts with project settings - large entity/models update +++ include/ientity.h 25 Mar 2002 11:37:54 -0000 entity module - interface cleanup - common #defines for easy transition +++ include/igl.h 25 Mar 2002 11:37:55 -0000 opengl module - Vertex Arrays support +++ include/imodel.h 25 Mar 2002 11:37:57 -0000 model module - interface cleanup +++ libs/mathlib.h 25 Mar 2002 11:37:59 -0000 vector macros - cleanup m4x4 - documentation of matrix layout - interface for utility functions for axis-angle and quaternion rotations - interface for new utilities for specifically transforming points/normals aabb - interface for faster aabb-ray test without finding intersection point - interface for utility to calculate an aabb to contain a transformed aabb +++ libs/mathlib/bbox.c 25 Mar 2002 11:38:01 -0000 - cleanup of use of qboolean - implementation of fast aabb-ray-test - implementation of aabb-for-transformed-aabb +++ libs/mathlib/m4x4.c 25 Mar 2002 11:38:02 -0000 - implementation of utility for rotation matrix from axis-angle/quaternion - cleanup of implementation of matrix multiplication functions (optimise for in-order array traversal) - implementation of new utilities for specifically transforming points/normals +++ libs/mathlib/ray.c 25 Mar 2002 11:38:02 -0000 - replace use of m4x4_transform_vec3 with new point/normal specific utils +++ plugins/mapq3/plugin.cpp 25 Mar 2002 11:38:06 -0000 - rename g_EntityTable using #define in ientity.h +++ plugins/mapq3/plugin.h 25 Mar 2002 11:38:06 -0000 - rename g_EntityTable using #define in ientity.h +++ plugins/mapxml/xmlparse.cpp 25 Mar 2002 11:38:06 -0000 - buffer-safe dtd path construction (without using string class, in case of unknown bugs) +++ plugins/md3model/Conscript 25 Mar 2002 11:38:06 -0000 - remove entity-module files from md3model conscript +++ plugins/md3model/md3model.cpp 25 Mar 2002 11:38:07 -0000 - implementation of generic quake-style-model class CModel - implementation of CModel-derived md3/mdc classes +++ plugins/md3model/md3model.dsp 25 Mar 2002 11:38:08 -0000 - remove entity-module files from md3model dsp +++ plugins/md3model/md3model.h 25 Mar 2002 11:38:08 -0000 - interface for generic quake-style-model class CModel - interface for CModel-derived md3/mdc classes +++ plugins/md3model/md3surface.cpp 25 Mar 2002 11:38:09 -0000 - implementation of generic quake-style-model class CSurface - implementation of CSurface-derived md3/md2/mdl/mdc classes +++ plugins/md3model/md3surface.h 25 Mar 2002 11:38:09 -0000 - interface for generic quake-style-model class CSurface - interface for CSurface-derived md3/md2/mdl/mdc classes +++ plugins/md3model/plugin.cpp 25 Mar 2002 11:38:10 -0000 - provide support to synapse for loading md3/mdc/mdl/md2 models, and mdl images +++ plugins/md3model/plugin.h 25 Mar 2002 11:38:10 -0000 - interface for loading md3/mdc/mdl/md2 models, and mdl images +++ radiant/brush.cpp 25 Mar 2002 11:38:18 -0000 - #ifdef remove Group/Brush-Patch-Epair related stuff - const correctness for ValueForKey interface const change - add bounding-box update for models in Brush_Build - remove old brush parsing/writing stuff - remove old eclass-model loading/displaying stuff - enable vertex arrays on light drawing - moved brush is-selected? utility to brush.cpp +++ radiant/brush.h 25 Mar 2002 11:38:18 -0000 - comment out interface for old brush parse/write stuff - comment out interface for brush epair stuff +++ radiant/brush_primit.cpp 25 Mar 2002 11:38:20 -0000 - remove old brush-primitives parsing/writing stuff +++ radiant/camwindow.cpp 25 Mar 2002 11:38:23 -0000 - moved brush-bbox update for models to brush.cpp:Brush_Build - bugfix for material colour setting when drawing models +++ radiant/eclass.cpp 25 Mar 2002 11:38:24 -0000 - removed old eclass-model checking/loading stuff - added const checking for Eclass_ForName interface +++ radiant/entity.cpp 25 Mar 2002 11:38:26 -0000 - REMOVE THIS FILE +++ radiant/entity.h 25 Mar 2002 11:38:26 -0000 - REMOVE THIS FILE +++ radiant/groupdialog.cpp 25 Mar 2002 11:38:29 -0000 - change entity creation to not use Entity_Create (function was removed) - commented groups stuff +++ radiant/gtkdlgs.cpp 25 Mar 2002 11:38:36 -0000 - const correctness for ValueForKey +++ radiant/gtkmisc.cpp 25 Mar 2002 11:38:39 -0000 - added filetype patterns for mdc/mdl/md2 +++ radiant/main.cpp 25 Mar 2002 11:38:41 -0000 - const correctness fixes +++ radiant/mainframe.cpp 25 Mar 2002 11:38:59 -0000 - change selection -> merge entity and selection -> separate from entity to go through mainframe class - implementation of mainframe functions for selection -> merge entity and selection -> separate from entity - made entity grouping and detail/structural settings undoable - commented out old groups stuff +++ radiant/mainframe.h 25 Mar 2002 11:39:01 -0000 - interface for mainframe functions for selection -> merge entity and selection -> separate from entity +++ radiant/map.cpp 25 Mar 2002 11:39:04 -0000 - const correctness fixes +++ radiant/pluginmanager.cpp 25 Mar 2002 11:39:08 -0000 - removed model table - stopped requesting model table from synapse - request undo table from synapse - commented out support for IEpairs stuff - NOTE: to be integrated with entity module - fill interface table for opengl vertex array support - fill interface table for undo +++ radiant/pmesh.cpp 25 Mar 2002 11:39:18 -0000 - cleanup patch cap and patch thicken to create entities using entity module interface (without Entity_Create) - removed old patch parse/write stuff - #ifdef'd out patch epair/groups stuff +++ radiant/qe3.cpp 25 Mar 2002 11:39:21 -0000 - const fixes - buffer-safe dtd path construction (without using string class, in case of unknown bugs) +++ radiant/qe3.h 25 Mar 2002 11:39:24 -0000 - don't include entity.h, include ientity.h and forward-declare entity-table instead - include imodel.h but don't forward declare model-table - include iundo.h and forward-declare undo table - comment out interface to old patch parse/write stuff - comment out interface to old brush parse/write stuff - comment out iepairs header include.. NOTE: to be integrated with entity module/interface - include eclass interface (we don't have an eclass.h) - declare interface for CreateEntityFromName (generic useful func) - declare target/targetname utils interface (we don't have a targetname.h) +++ radiant/select.cpp 25 Mar 2002 11:39:27 -0000 - cleanup implementation of entity selection-grouping/ungrouping utlities +++ radiant/select.h 25 Mar 2002 11:39:27 -0000 - cleanup interface for entity selection-grouping/ungrouping utlities +++ radiant/undo.cpp 25 Mar 2002 11:39:29 -0000 - removed workaround for wierd entity_clone behaviour (changed in entity module) - avoid using Entity_FreeEpairs (not exposed by entity module) +++ radiant/xywindow.cpp 25 Mar 2002 11:39:35 -0000 - const fixes - cleanup implementation of CreateEntityFromName to be a usful generic utiliy function - enable vertex arrays in XY_Draw - enable undo for right-click dropping entities in XY window TTimo - various fixes to make the above compile on Linux, checkin to cvs - fixing some win32 build stuff Hydra - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=434 fixed setSpecialLoad in .def code 19/3/2002 Gef - Modified the fix for LoadImage to be more consistent with other code - Applied Hydra's fix for empty alpha channel warnings & cleaned up indentations (tabs) in lbmlib.cpp also added output of the tga type when a tga file fails to load - Reverted my over complex fix (read; mess) for strtok_r to use strtok instead of manual tokenising 17/3/2002 Gef - Fixed LoadImage API list not being incremented while trying to find image minors, result was infinite loop when loading images that weren't of the first type (tga) - Fixed cloning giving dtd errors. mapxml/xmlparse.cpp:ParseXMLStream() was using g_FuncTable.m_pfnGetQERPath() as the dtds path... disabled validation until spog can check that my fix is the right solution - Added simple formatting to xmap file output so that each node has a new line for readability 13/3/2002 TTimo - introduced API List managers we deal with two types of APIManager now, the ones that matching all minors for a given major and the ones that require a fixed list of minors - converted the image loaders to go through a API list manager - fixed various things in synapse (introduced more bugs?) - fixed plugins, realized it was still broken 12/3/2002 Hydra & TTimo - EClass_Create in the EClass manager _EClassManagerTable - removed InitFromText from _EClassTable 8/3/2002 TTimo - some commented out code cleanups - added eclassfgd/ fgd.so module skeleton loaded up in radiant core as an optional entity format added eclass manager code to deal with the new format if present this still loads .def, the actual .fgd code needs to be written now - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=433 added a g_strDTDPath global disabled DTD validation, broken on win32 - Str copy constructor (const Str &) working correctly with a __strDup 7/3/2002 TTimo - added verbosity in file accesses for CXMLPropertyBag - more fixes to project lookup - dropping dtds/ prefix, this is installation dependent - removed ipluginentities.h, the plugin entities stuff was disabled long time ago already - cleaned up some old commented out stuff - proof of concept synapse builtin module: new class CSynapseClientBuiltin allows to have modules builtin to the application (i.e. statically linked) adding include/ieclass.h (eclass loader API) radiant/eclass_def.cpp (.def class loader, builtin) radiant/eclass_def.h (.def loade, API public to the core) NOTE: radiant/eclass_def.cpp needs to be added to the win32 projects - quickfix to project file loading ("/scripts/") - introduced an EClass manager, hooked up the .def builtin module through it (not yet possible to push new entity format modules, but .def reading is already fully synapsed) 6/3/2002 Gef - Fixed a segfault when getting mUserPathPrefix in CGameDescription::CGameDescription() - added preferences check for fixing target/name collisions - fixed a logical error on my part, where setting g_qeglobals.m_strHomeGame in CGameDescription constructor results in a value from the last file parsed. Moved it to a more appropriate location, where it gets a value from the selected .game file. SPoG - changed g_strGameToolsPath to g_strAppPath in GetQERPath API - fixed mapq3.dtd - enabled DTD validation of xmap files - added mapq3.dtd to setup scripts (not tested) TTimo - added OnActivated() to synapse clients, override to put some init code - fixing default project path lookup and user project increment (again) - fix to linux setup, no trailing slash in basegame items (wolf.game and q3.game) - removed old plugin/modules code, leaving only the synapse implementation recoded image loading and Map_Import/Map_Export still some temporary solutions and cleanup work to be done removed plugin.cpp from the tree / build system 5/3/2002 SPoG - TODO: add default project for wolf to WolfPack CVS module - changed xml project file load to search for DTD "dtds/project.dtd" under radiant path - fixed crash in mapq3 on trying to read uninitialised token ptr - changed .map to be default map format for now - changed runbsp to not hardcode -fs_basepath - added -fs_basepath to quake3 default project - added project.dtd to setup scripts and swapped quakev2.qe4 for default_project.proj (not tested) 4/3/2002 TTimo - merged synapse2 branch back into trunk, checked Linux and win32 builds ok - updated the .dsp to work with new libxml2 2.4.16 - fixed broken enginepath guessing, and broken project path rotation / saving 28/2/2002 Gef - Added extra checks for target/targetname collisions - Find Brush dialog title correction (bugzilla #393) 26/2/2002 Gef - Added Entity_Connect() to entity.cpp to avoid duplicating code - Fixed target/targetname collisions - entities being cross-linked when copied Bugzilla #385 : http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=385 16/2/2002 Gef - cleaned up the kyro gl_point workaround stuff - taught ClipPoint's (clips & path points) how to draw themselves 8/2/2002 Gef - Added mapxml.so to linux setup - strip debug symbols option in setup - removed g_qeglobals.m_strHomeMaps, writing it to project instead fixes a bunch of re-broken path issues. Also uses fs_game now. - Minor grid colour in QER Black & Green theme - Save window's pos/size for all view types in MainFrame::OnDestroy --------------------------- on branch synapse2 4/3/2002 - modules don't show up in plugins menu, added a dump in console before entering interactive mode - added compile time def for synapse verbosity 3/3/2002 - finished converting all the modules to synapse, disabled old ResolveInterface call 24/2/2002 - hooked TexTool into Radiant plugin menu through synapse - added iplugin.h which I had forgotten earlier - ported synapse code to compile and run on win32 19/2/2002 - SYN_REQUIRE_ANY / multiple API manager code can load multiple interfaces based on a matching pattern converted TexTool to load that way 18/2/2002 - added iplugin.h with basic interface for plugins 13/2/2002 - synapse on modules currently disabled, the basics of the code are working fine, need to look at multiple interfaces matches before going further - started converting shaders, requires conversion of a lot more others - image converted to synapse - no longer using GUID in synapse, all done through *_MAJOR strings HOWTO: convert a module to synapse: configure it to link against synapse static lib (+include path to STLPort required) add #include "synapse.h" to the plugin header declare the : public CSynapseClient in plugin header implement it (listing provides and requires, implement the request code) 12/2/2002 - vfspk3 converted to synapse 11/2/2002 TODO: get rid of all WINAPI crap - debugged the API dependencies solver to actually work - added newer cons at the head of the tree 10/2/2002 TTimo - added the basic code for solving API dependencies and requesting the various tables - more diagnostic printing code fixes - version checkings - some more design work (libs/synapse/doc) 9/2/2002 TTimo - some changes to the files layout, cleanup of the diagnostics printing (stuff's mostly broken right now) - reworked the complete Sys_Printf stuff to rely on va_list implementation - include/isynapse.h declared useless and foxed without mercy - added include/irefcount.h 8/2/2002 TTimo - adding an experimental Anjuta project file to play around with 7/2/2002 TTimo - various fixes to build on linux, listed a bunch of current issues - fixing terrademo.map to remove broken mapobj~1 -> mapobjects -- synapse2 branch -- - propagate the code from old synapse branch to a new branch out of 1.3 tree (builds and runs on linux, that's about it for now) --------------------------- end branch synapse2 7/2/2002 djbob - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=354 moved all the preferences code to XML 6/2/2002 SPoG - checked all paths conform to: unix dir separators + trailing separator - changed file dialogs for load/save of maps to default to "mapspath" - removed OpenDialog and SaveAsDialog, use file_dialog instead - removed FileSystem paths stored in QEGlobals_t.. replaced by CGameDescription - removed dependence on EnginePath from preferences, replaced by CGameDescription - removed hardcoded g_get_home_dir calls for file dialogs - added validation of project settings entry paths before they are set 5/2/2002 EvilTypeGuy - moved filters.cpp related function declarations to filters.h and added #include "filters.h" to brush.cpp, csg.cpp, main.cpp, mainframe.cpp, map.cpp, select.cpp as not all files include qe3.h and qe3.h is a rather monolithic header this seems to be a cleaner solution per SPoG's suggestion...Fixes compilation. Gef - contrib/plugins BOOL cleanup (uses qboolean now) fixes X header conflict - cons update for mapxml - SaveAsDialog() changed to match path's used in OpenDialog() - removed radiant/xy.h - moved contents to qe3.h (FilterBrush declaration) 4/2/2002 SPoG - changed QE_LoadProject and QE_SaveProject to load/save xml project file format - changed request dialog for project files to loop until a valid file is found - fixed memleaks in CGameDescription constructor for xmlGetProp - added converting gametoolspath unix format when parsed from game file - fixed m4x4 lib to use column-major order (more compatible with opengl) - added divergence parameter to ray-point intersection test (now easier to select distant points in perspective views) - cleaned up modelview/projection matrix manipulations in 2d/3d view - cleaned up map modules / interface source files a bit - added ability to specify map module version when importing/exporting map - cleaned up file dialog code, returned filename is static and in unix format - save-as dialogs force a file extension depending on filetype selected - added filetype manager to support registering custom file types - fixed loading and cleaning engine path from radiant.ini correctly 3/2/2002 EvilTypeGuy - fixed win32 compilation (userpathprefix is Linux specific) ETG & Powzer - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=308 added preference to allow 'paint drag-select' brushes/faces in 3d camera view - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=389 added preference to strafe camera foward/back in 3d view while freelook is active ETG & RR2DO2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=388 patch adds ability to strafe up/down/left right while freelook is active 1/2/2002 TTimo - bumped to 1.3.1-nightly -- 1.2 stable branch branched here Gef & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=372 http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=376 appplied the patch, corrected the mapspath expansion stuff TTimo - linux nightly setup code - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=384 hacked a corrective action in the nightly setup SPoG - fixed creating region brushes that fill the entire grid for Save Region 31/1/2002 Micheal Schlueter - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=375 syntax fix to q3map path_init.c Gef - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=279 patch 185 == 186 tweaking to config stuff in linux setup patch 187 Ensures the games directory exists before trying to create a file there patch 177 Adds *.cf files & uses them. I think I have all the files in the right places now... maybe (some additional fixes on top by me) ETG quick fix to shader prefs load 29/1/2002 EvilTypeGuy - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=345 more detachable menus fixes - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=334 fixes 'load shaders at startup' preference SPoG - fixed misc_model "modelscale" and "modelscale_vec" support TTimo - upgraded setup scripts to support nightly build - last minute fix to the modelscale and modelscale_vec code (md3 module) ydnar q3map 1.2.4-y2 New features: - -nopatchfix argument. This disables lightmap patch fixes and makes a map suitable for lighting with -vlight. - Degenerate patches are treated like broken brushes. They are ignored, warned about, and selected in Radiant if you ran with the -connect option (or from the BSP menu). This was what was causing the "0 valued axis" error some people were experiencing. New entity keys: - "_lightmapscale" key for brush entities (worldspawn, func_*). This lets a mapper scale the lightmap samplesize per-entity. For large constructions, 2.0 or 3.0 is a fine value, and keeps BSP size down and compile times low. For those areas you want to have high-detail shadows, make a func_group and use a value of 0.25 or so. It will scale the samplesize value for the surface's shader (default 16) or the -samplesize argument. - "modelscale" and "modelscale_vec" keys for misc_models (1.0 = default). This was for proper RTCW support and is available for Quake 3 maps as well. Lets you scale up map models in the world, getting around the MD3 size limitation. The next build of GtkRadiant has SPoG's code to support this in-editor so you can see what effect a scale has. - Flare surfaces are now supressed from the BSP. They serve no purpose other than add to the vert & surfacecount in a BSP. These surfaces were created silently when a shader has "light 1" or "q3map_flareshader X." Use the new -flares switch when BSPing your map to have them emitted. Changes: - GtkRadiant 1.2.4-nightly version increment. - Full WolfSDK style lighting enabled with -game wolf, including lightJuniors. This includes linear lights by default (no angle attenuation) and support for the additional RTCW "fade" and "angle" keys, and spawnflag changes, including q3map_nondynamic on light entities. This may require maps being constructed for RTCW with the current toolset to change their light entities. Sorry. :) Note, Wolf-style lighting only works with -light, and not -vlight. - Vertex light stitching now uses a near-ambient light check for dark vertexes as opposed to lower-than-average fixups. This preserves some shadow detail better while getting the buried verts lit properly. Comments encouraged. - Surfaces' samplesize are now stored in the BSP. This change makes BSPs generated from this version incompatible with all other q3maps. The upside is that -samplesize N is no longer necessary on the -light or -vlight stage. This feature is necessary to support the "_lightmapscale" key. - Additional PVS optimizations in lighting. Fixes: - Will compile for RTCW properly (1.2.1-y12 didn't). - No more sparklies where fog meets brush faces. They're split properly now. - Crash bug in vlight fixed. - Vertex light fixups/stitching is considerably faster. - Vertex light fixups ONLY stitch faces with lightmaps. For pointlight surfaces you're on your own. - Better snapping logic when merging nearly-coincident vertexes on complex brush windings. - Bug where the .prt file had some bogus or nearly-borked portals. They're cleaned up like everything else now. - A few stupid bugs in path initialization. Should work better. Also includes TTimo's fixes to my code so it would work properly on Linux. - RR2DO2's PCX loading patch for alphamaps. This bug was manifesting itself in the form of offset or incorrect samples being used on terrain entities. - A ton of other minor little fixes here and there. 28/1/2002 TTimo - win32 fixes - 1.2.4-nightly djbob - EClass_ForName fix if malformed name ---- 1.2.3 linux released TTimo - fixed BSP version depending on game mode in q3map (home dir guessing is still fucked, have to fix before release) - fixed q3map init_path.c home path bug on init Gef - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=369 more fixes to texture paths in gensurf 27/1/2002 TTimo - switching to v3 project file, forcing reload of template if non-v3 need to distribute quakev3.qe4 in setups now (done for linux setup, will have to in win32) - renamed Main to main in q3map init paths - fixes the ~/. inits and init order in q3map - added m_pfnPathForPluginName to the main function table, returns the directory a plugin is running from used in bobtoolz / curry / pk3man to find various files see also todo: http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=368 - some fixes to textures loading paths in curry - linux setup copying correct content for curry (pk3 in wolf media) and bobtoolz (bt/ in plugins/) - building 1.2.2 setups Gef - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=362 gensurf fix djbob - bobtoolz update Hydra - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=361 fixes a bug with the texture menu loading, now we see the non-shaderlist directories too 26/1/2002 Gef - Michael Schlueter - TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=279 applied several patches (to setup code and to the setup scripts) modified makesdk.pl to update with more content added an "enginepath" attribute to the game file, reworked the handling in editor TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=347 took out the refresh command from the plugin menu - more linux fixes: bringing all the plugins to compile again on linux polishing the setup code (all the right files in the right places) - for linux release, bumping ver to 1.2.2 win32 will have a 1.2.3-nightly after that - added correct init of ~/.q3a or ~/.wolf *nix systems have a 'prefix' attribute in the .game file to specify - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=359 identified the mod compiling problems applying back the old fs_basepath fs_game code to the BSP generation ydnar- TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=351 cleaner path init code it doesn't init for ~/.q3a and ~/.wolf paths yet 25/1/2002 SPoG - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=352 using the wrong matrix stack for XY_Draw caused stack overflow error - texture_mode was set to an invalid enum in wireframe/flatshade mode - changed plugin API to expect gamedir-relative texturenames - fixed gensurf to create faces/patches with gamedir-relative textures 24/1/2002 SPoG - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=322 added modelscale key check to misc_model entity in md3/entity module added angle key check to eclassmodel class in md3/entity module fixed bugs in BP writing and reading in map module TTimo (commited as SPoG) - fixing permissions on cvsreport and doxygen stuff, upgraded dot 23/1/2002 SPoG - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=336 plugin API bugfix - fixes textures on stuff created by plugins ---- 1.2.1 was released here 22/1/2002 Gef - linux build fixes SCDS_reyalP - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=325 wrong file packaged in setup RR2DO2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=327 fix to PCX loading SPoG - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=298 cut & paste bugfix - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=332 update origin key on entities - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=333 made fixedsize entities not scalable 21/1/2002 TTimo - scanning in g_strAppPath/modules/ and plugins/ prior to g_strGameToolsPath using the main path to put general plugins and modules - fixed bobtoolz bug, init of epairs table was relying on wrong params - fixed curry to compile again on 1.2 - fixed pk3man to compile again on 1.2 - updated IS setup: installing the plugins with the core installing the common modules in the core - Compiling manual, more IS stuff, .xlink etc. RR2DO2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=315 patches for improved multimonitor support (with some associated pref items) ydnar - more q3map: http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=324 - radiosity fixes (proper handling of ambient light) - polygonoffset fixes - lightmaps on patches work better (normal calcs adjusted, planar patches are box projected like brush sides) - double vfs init in bsp stage removed (this needs to be tested on Linux) - lighting is faster again - a couple crash bugs resolved - other tasty nibbles 20/1/2002 EvilTypeGuy - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=313 detachable menus set as preference (in layout) - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=255 path prompt - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=307 patch dialog names ETG & RR2DO2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=306 fix 'Natural' texturing crash ETG & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=291 found out the problem, Wolf SP spawn works now TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=144 fixed more problems with model loading vfsExtractRelativePath prolly broke the linux build, just a matter of putting a bunch of #idfdef - fixed an additionnal .pid lock situation, cleaning the global prefs on game .pid lock - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=301 fixed md3 tris test selection bug djbob - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=219 fixed bobtoolz for 1.2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=318 filter structural RR2DO2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=305 filter in viewmenu for lightgrid brushes (ydnar's q3map) fixes image lib loading bugs Hydra - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=298 copy/clone deselects the copied stuff added a pref to deselect or not, and to nudge pasted stuff or not 19/1/2002 djbob - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=311 IEpair wrapper to access project entity from plugins RR2DO2 - missing IncRef in CShaderArray::AddSingle TTimo - game.xlink files in gametools path, is scanned to build items in the Help menu (and the associated code) 18/1/2002 Gef / Michael Schlueter / TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=279 patches 133 and 138 applied, new setup code 14/1/2002 TTimo - adding djbob write access for bobtoolz 13/1/2002 ydnar - q3map code updates 1.2.1-y8 new lightgrid surface flag feature lightgrid shader and editor image for Wolf and Q3/TA: in the common .pk3 and in all common.shader cvs remove setup/data/baseq3/common-q3r.pk3 (unused, we use common-spog.pk3) TTimo - updating setup to use mapq3 module instead of map (both Wolf and Q3 game packs) (also checked the lightgrid option) - fixed setup.pl bug for template gen from WorkDir/ - correct spawning between SP and MP mapping mode - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=297 .pid check, console logging and prefs cleanup Wolfen - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=294 checked in updates to the manual links page and setup instructions (i.e. new prefs dialog) 12/1/2002 Gef & Michael Schlueter - bugs #295 and #279, new patches applied EvilTypeGuy & djbob - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=220 patch selection crash EvilTypeGuy - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=260 Dense and Very Dense Cylinders have wrong number of rows - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=292 latching patch toolbar settings TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=144 win32 long/short pathname bugs reappearing, switching back to short paths for project settings - removed obsolete radiant/vfs.cpp radiant/vfs.h - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=291 using new .qe4 for Wolf, fixed stuff editor side (long path names and engine spawn) SCDS_reyalP - http://zerowing.idsoftware.com/bugzilla/showattachment.cgi?attach_id=118 realloc bug in terrain 11/1/2002 SPoG - unpatched bug #239, unintended duplication of brushes, patch #96 Note: bug #239 now unresolved EvilTypeGuy - bug #295 fixes for compile under Linux 10/1/2002 SPoG - fixed CEntityEclassModel referencing eclass after eclass has been deleted SPoG - map-module branch - new map module, provides current functionality, using new map interface - cleaned up merging/creating of entity array used by map module - implemented MemStream::printf(const char,...) - can't print strings larger than 1024 currently - changed copy/paste to use the map module, via abstraction of FileStream/MemStream as DataStream - fixed Save Region and Save Selected - new xml map module "mapxml" - cleaned up map.cpp 6/1/2002 TTimo - removed m_bPak from pref dialogs (it was dead code) 5/1/2002 RR2DO2 - q3map terrain blending fix for >5 layers EvilTypeGuy - fs_homepath patch on linux Gef - bug #279, linux setup, patch #102 - bug #239, unintended duplication of brushes, patch #96 TTimo - added Wolf specific project settings dialog: correct fs_game selection and combo names added multiplayer / single player mapping mode selection 4/1/2002 TTimo - adding -game wolf switch to q3map (-game quake3 works too, but it's the default anyway) using different bsp version and different fs_basegame on wolf - updated the setup/win32/setup.pl script to generate from a config file instead of hardcoded (added corresponding q3.cf wolf.cf and all.cf config files) - added a default Start Menu shortcut name (RR2DO2 special) - diffing against Id's internal SOS source and merging in new stuff: - bumped MAX_SURFACE_INFO to 4096 in shaders.c - new terrain code (Jim Dose) ParseTerrain() addition in terrain.c Creates a mapDrawSurface_t from the terrain text - VL_SurfaceRadiosity and VL_SurfaceRadiosity MrElusive's vlight radiosity code - speedups to vis.c and visflow.c (MrElusive) 3/1/2002 TTimo - merge gameselect branch back into trunk the IS setup scripts have been updated for the new paths layout developement environment needs to be updated to copy binaries to the right places for debug it is recommended to run a 1.2.1 setup on win32 prior to compile and install debug bins - updated the setup to be more templated for inclusion/non inclusion of game packs on demand - propagating recent fixes to Alpha into the trunk based on diffing between Merge-1_1_1 and Merge-1_1_2: ===================================================================== 13/11/2001 djbob - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=244 reverted again the shader manual and tcMod docs TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=214 patched aselib.c, was calling strstr badly (relative path extraction) 12/11/2001 djbob - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=241 applied patch, will release in next nightly Spog - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=254 patch for safe_malloc TTimo - fixing STLPort config checks and XML config (CHAR -> xmlChar) - added safe_malloc_info and safe_malloc in the common/ dir - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=179 added XML stream version checking between Radiant and q3map ======================================================================== also, manual merge of docs/manual and setup media this merge work is related to bug #280 too: http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=280 ydnar - new q3map, radiosity and bug fixes, code merged in with the trunk version (TODO: add more detailed changes log) EvilTypeGuy - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=274 broken auto caulking fix EvilTypeGyu & LordHavoc - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=207 (two new files, project settings updated) 2/1/2002 TTimo - branch gameselect - copying over the linux setup binaries (setup, uninstall, setup.gtk) from Alpha branch. Those have the ability to prompt destination path per component. Gef - branch gameselect - patch 101 for bug 279 .game files generation by the setup, makesdk.sh and postinstall.sh fixups 1/1/2002 Gef - branch gameselect - linux source fix http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=279 (we use PATH_MAX as the cross platform define instead of MAX_PATH which only works on win32) TTimo - branch gameselect - cleanup and homogeneisation of the paths for prefs storage m_global_rc_path: win32: g_strAppPath linux: ~/.radiant// m_rc_path: win32: g_strGameToolsPath linux: ~/.radiant// so that global.pref goes in ~/.radiant//global.pref and radiant.ini ~/.radiant///radiant.ini 27/12/2001 TTimo - branch gameselect - global prefs file (global.pref), XML based in core directory stores game selection setting stores autoload setting - dropping 'gameid' from .game file, gonna use a 'gamefile' in global prefs instead (and the .game file name .. thks Gef) - TODO: radiant.log stuff in global prefs? 21/12/2001 TTimo - branch gameselect - more Wolf setup tweaking for an experimental build release: quakev2.qe4 project template file using a 'gameid' attribute in the game file to select hardcoded features in the editor binary 'basegame' node for lookup of the default project file 'engine' node for engine path - added experimental Wolf game pack to IS - added setup/win32/HOWTO with extensive information about the procedure to add new game packs - reading the 'name' attribute in the game node for game selection dialog - TODO: pid files to make safe startup? The .pid stuff should be happening after game selection, since it covers game-specific preference settings. - TODO: console logging pref should be a global pref, goes with game autoload? 17/12/2001 TTimo - branch gameselect - updating the setup script for experimental 1.2.0 setup: merged some of the docs back into trunk (Radiant manual, some TA docs) will need to perform a complete diffing between Alpha and trunk about docs/manual at some point merged bitmaps from Alpha too added the Q3 modules (image, map, md3model, shaders, vfspk3) to Q3 game pack in setup generating per-game config file q3.game in OnMoved (IS setup) will need equivalent with linux setup of course various other generic fixes to the setup code - multiple games support, list of changes, and TODO: NOTE: this is on a 'gameselect' branch for now Doxygen documentation should be at http://zerowing.idsoftware.com/doxygen for this branch too. The installation procedure has changed. The win32 installer is partly ready, linux installer will need to be modified too. The editor binary and the Gtk DLLs are installed in a common location, i.e. 'C:\Program Files\GtkRadiant' typically. The game specific binaries and modules go in the same location as usual, for instance 'C:\Program Files\Quake III Arena\GtkRadiant\' (and also 'C:\Program Files\Quake III Arena\GtkRadiant\modules' 'C:\<..>\plugins') The environment variables used by the build system (VC6 project files) have been adapted: $(QUAKE3RADIANTDIR) is still used $(CORERADIANTDIR) is used for the main editor location When editor starts, it looks for games/*.game under g_strAppPath and prompts the user for a game Once game is selected, parameters are used for regular startup. You need to write your own q3.game for now, it will be generated by the setup procedure my C:\Program Files\GtkRadiant\games\q3.game looks like that: given that, the editor does a complete startup, and the basics are here for multiple games - precise changes: g_strToolsPath renamed to g_strGameToolsPath most of former g_strAppPath uses g_strGameToolsPath the name change was also meant for homogeneity with DIR_GAMETOOLS_* variables we use in the setups g_strAppPath still used, points to the main installation path added the game selection code in CPrefsDlg::Init using several classes and a dialog box, parsing XML files - TODO: the console 'Radiant.log' doesn't catch the game selection stuff as it is now initialize it to the main install, without the game setting (console logging is a debugging tool anyway, no reason it should go to the proper game folder each time) the 'preferences reset/cleanup' code is probably broken, specially when used with the .pid checking since we check for .pid even before we know where the GameTools path is on linux, we need to sanitize the ~/.q3a dir usage. Switch to ~/.radiant, use the version tag to maintain things independant, and use the game name to isolate per-game settings? ~/.radiant/1.2.0-nightly/quake3/radiant.ini (.pid, .log) ~/.radiant/1.2.0-nightly/wolf/.. also, when looking for those files (.ini mostly), win32 stores them in a main installation, and linux has them in ~/.radiant/.. (which is the read/write area). This should be homogenized? Maybe by adding a 'Main' to the readonly path and a new variable with 'RW', pointing to 'Main' on win32 and to ~/.radiant on linux 11/12/2001 TTimo - replaced setup/win32/setup.sh by setup/win32/setup.pl same functionality level + abiliy to generate back a template from a work version - major rework on the IS scripts, basics of multiple games support installer clean seperation between editor core and game pack design doc and analysis of custom setup generation, setup script UI requierements see setup/win32/TODO for more details 10/12/2001 TTimo - new generation of InstallShield setup using a template/ directory instead of a .zip file requires rewrite of the processing script allows easier maintenance of the IS script 23/11/2001 TTimo - yet another update to cvsreport script, catch the branch and forward the info to user commands too able to build doxygen for several branches selectively now: http://zerowing.idsoftware.com/doxygen 22/11/2001 TTimo - new cvsreport script, should send explicit diff of the CHANGES file now 03/12/2001 TTimo - md3-module branch - validated the fixes and the build on linux, ready to merge in trunk SPoG - md3-module branch - changed function naming conventions in mathlib for m4x4, ray, bbox, to be consistent - fixed bug in m4x4_invert 29/11/2001 TTimo - md3-module branch - flagged all new mathlib functions that need a name change or an argument order change also added various \todo to point out inconsistencies 28/11/2001 TTimo - md3-module branch - updated linux build - fixed CEntityMiscModel and CEntityEclassModel destructors (any destructor should be virtual) 27/11/2001 Spog - md3-module branch - stopped texturewindow showing shaders without the "textures/" path - made md3 module functionally identical to current radiant md3 code 22/11/2001 TTimo - md3-module branch - fixes to the core for linux build - model.so module builds on linux - added plugins/md3model/doc/md3-design.txt - several doxy-friendly \todo chunks about the module model Spog - md3-module branch - fixed aabb_add_aabb() algorithm wasn't very reliable - added VectorMid, VectorNegative and CrossProduct macros to mathlib - added bbox_intersect_plane() 21/11/2001 Spog & TTimo - md3-module branch - initial code from Spog following a preparatory design work merging in as new 'md3-module' branch geomlib code merged into mathlib some reorganisation of the source layout and cleanup (more stuff in imodel.h, less in qertypes.h) Spog - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=261 fix applied 20/23/11/2001 TTimo - yet another update to cvsreport script, catch the branch and forward the info to user commands too able to build doxygen for several branches selectively now: http://zerowing.idsoftware.com/doxygen 22/11/2001 TTimo - new cvsreport script, should send explicit diff of the CHANGES file now 11/2001 Spog - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=253 additional fixes TTimo - renamed tools/quake3/common/threads.h to qthreads.h avoids a collision with system headers 19/11/2001 Spog - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=251 Fixed "Move into worldspawn" deleting entities with only one brush Fixed Brush_Move using texture lock on fixedsize entity brushes Fixed Textures > Texture Lock > Rotations toggle checkbox 16/11/2001 Gef - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=247 applied patch 77, using a notebook layout for preferences dialog also patched in some preferences saving that had been forgotten (such as invert mouse in freelook) Spog - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=253 patch 84 + additional modifs, bug still open 15/11/2001 Spog - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=252 rewritten rendering pipeline for cam window - fixes some hacks, improves speed, makes rendering modes more consistent with each other 07/11/2001 TTimo - more IMAP interface, adding a blind data void *pData to entity_t more info about it and why it's done is in map.cpp, should be a small base for next additions to the editor 31/10/2001 TTimo - using IDataStream in map module, moved back some of the module code into the trunk 30/10/2001 Gef - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=245 applied patch 76 TTimo - renaming istream.h to idatastream.h, this had nasty conflicts with OS includes already had to IStream -> IDataStream some time ago anyway 27/10/2001 TTimo - updated cvsreport, testing new ver - added a static version of texdef (no memory alloc on the texture name) unused for now, was just experimental Gef - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=245 applied patch 75 26/01/2001 TTimo - various updates: new GtkSDK precompiled binaries updated libxml2 package (to 2.4.3) updated STLPort (to 4.5) now compiling with STLPort and threading (since we are using threading throughout the app) - exposing the data stream API to the modules, renamed some stuff on the way need to update the map module to use it now - cleanup on qtexture_t definition guarding and disabling chunks of the surface plugin code behind DO_SURFACEPLUGIN (see earlier patch on plugin entities) 25/01/2001 Hydra - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=202 applied patch commenting out plugin entities code might come back in 1.2 under another implementation the code is still there, only commented out for now 17/01/2001 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=93 checking in doxygen content, setting up generation on zerowing auto generation on zerowing upon a commit: http://zerowing.idsoftware.com/doxygen - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=231 checked in the patch - switching to a new cvs commit script 14/10/2001 TTimo - libs/mathlib library unifies mathlib code squattered all over the tree mainly a merge of tools math code and radiant/mathlib.cpp C implementation, using an extern "C" construct for use from C++ need to check on linux, win32 builds ok extracted qboolean code into libs/bytebool.h on the way 11/10/2001 TTimo merged TmpMerge-1_1_1 branch back in the trunk, the update process from Alpha 1.1.1 is done TTimo - branch TmpMerge-1_1_1 looking through all remaining .rej files and applying the failed patches accordingly bobtoolz is broken, but it's not due to the merge the plugin API is different and some things need updated (disabled bobtoolz build in contrib/Construct for now) same for gensurf same for prtview same for textool setup: replaced the existing stuff with 1.1.1 code fixed various things for win32 build, checked correct CRT lib config 10/10/2001 TTimo - branch TmpMerge-1_1_1 building modules, going through all the .rej merging radiant/missing.h and modules/shaders/missing.h into a single one, moving to libs/ exposing BuildShaderList PreloadShaders in _QERAppShadersTable have to review all the remaining .rej to finalize the merge now 04/10/2001 TTimo - branch TmpMerge-1_1_1 using this branch as temporary location for merge process copied over new binary files. mostly .dsp (prolly broken) and setup/linux/setup.data stuff 25/08/2001 TTimo map module successfully loaded and saved q3dm1, the saved file was then loaded back into 1.1-TA without problems rebuilt and checked on win32 merged IMap back in trunk, fixed some memory conflicts on win32 Took me a lot more time than I would have liked to, but there's a script tied to the CVS server now, which will post on this list a diff of the docs/developer/CHANGES file whenever it gets updated. This will probably be very handy for me since I'll only have to put update information in the CHANGES file instead of having to post on the list too. The script is likely to be a bit laggy, or miss some features (for instance I'd like to extract the branch name .. anyone know how I can get the branch name (Alpha/IMap/HEAD) from the version number? PS: I can email this script to anyone who would like to have a look 22/08/2001 TTimo did more work on map module, one big chunk of work left: the core should broadcast interface requests to plugins when it doesn't know how to do it by itself.. Gef new doxygen patch, generates output from core (libs/ include/ and radiant/) 21/08/2001 TTimo removed Makefile, use cons damnit! 18/08/2001 Gef automated documentation via doxygen, new scripts and content 18/08/2001 EvilTypeGuy patch for CHAR to xmlChar conversion (xml2 consistency) 09/08/2001 TTimo the map module starts to look like something, cleaned up the interface stuff started moving the actual code out in the module and removing it from the core lots of issues raised on the way, some structures to export, and the macro scheme to access API functions more easily it compiles right now, but won't run because it's missing a lot of things .. the process simply happens to be "under way" 04/08/2001 TTimo patched more path code, to look for stuff in "bitmaps/" and "modules/" instead of "tools/bitmaps" and "tools/modules" modified the Construct files accordingly merged in radiant/ishaders.cpp diff into plugins/shaders/shaders.cpp (PreloadShaders) merged in radiant/lbmlib.cpp diff into plugins/images/lbmlib.cpp (Sys_FPrintf) checked the .rej and patched a few remaining things NOTE the diffs are space/tab sensisitive, and we used the "beautify source" a bunch of times, so it's a bit fucked now next time, generate the diffs not space sensitive.. TODO map loading is fucked, "textures/" prefix issue? 27/07/2001 TTimo merging recent changes from Alpha branch into the Trunk this could not be done with a regular cvs merge because we already did a cvs merge of Alpha into trunk some time ago manually built a diff between the current Alpha (now tagged Merge-1_1-TA_1-nightly) and the Alpha we had right after the former cvs merge: -r Alpha -D 2000-05-28 binary files ignored in the diff, only going for source stuff built with diff -Nru Reference/ Current/ then patch -p1 < patchfile next, started rebuilding: big manual updates were in vfs.cpp and texwindow.cpp cleaned up some VFS stuff .. it had an absurd QERAppFileSystem / QERPlugFileSystem scheme TODO: the ISSetup has not been copied over from Alpha OK check the Construct files OK radiant/ishaders.cpp no longer exists .. apply the patch on the shader module OK radiant/lbmlib.cpp no longer exists .. in the image code? OK look at the *.rej files 03/10/2001 TTimo - adding a pref to select patches by BBox, fixes http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=212 02/10/2001 TTimo - reverting Spog patch 67 to bug #209, starting from scratch applied again, with HasModel returning NULL safe checks - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=211 fixed overlays drawing (XY and Cam) 01/10/2001 TTimo - building and distributing q3data (.ase -> .md3 conversion utility) updated q3data to show main GtkRadiant version information and build date - generating a new GUID per-setup http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=206 Gef - updated credits.html and links.htm, look much better http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=200 - update Z-checker view on camera up and down http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=199 Spog - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=209 Fixed QERApp_ReloadShaders.. PreloadShaders needs a BuildShaderList call Fixed Flush & Reload Shaders for md3 models 25/09/2001 Gef / djbob - several patches to the key handling code, for linux specific issues and sticky keys http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=191 TTimo - fixing q3map bug, not processing the argv correctly http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=192 - fixed ToggleCubicClip shortcut Ctrl+\ (win32 Gtk source patch) http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=15 18/09/2001 RR2DO2 - discreet movement for camera (prefs setting) fixes texture window bug latching view layout changes until restart http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=23 djbob - added back "view > show > show angles" in view filters http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=188 15/09/2001 G_Dewan - fixed problems with q3map when not using -connect SPoG - fixed q3map texture projection for brushes belonging to entities with local origin - added SafeOpenRead() check, terminating map->bsp stage if .map file cannot be read 13/09/2001 RR2DO2 - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=181 fixing key handling bug (key pressed with repetition was not properly catched) TTimo - added new Radiant manual elements (GtkRad section) to the win32 full setup - reverting version to nightly, going back to nightly / RC delayed - patched linux setup, now prompting for component path only if at least one of the options is checked. Still need to handle Cancel in dialog though. 12/09/2001 TTimo - more fixes to linux script, copy plugins right now 10/09/2001 TTimo - patched contrib plugins, using seperate build scheme - fixed textool issues, compiles again 09/09/2001 TTimo - sub-menu cascading http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=178 - udpated the Q3Radiant manual with some new GtkRadiant stuff - updated the FAQ with 1.1.1 known issues Gef - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=174 applied all the patches 07/09/2001 SPoG - fixed qer_editorimages outside "textures/" being ignored - stopped q3map_lightimage being used to set shader image dimensions - changed bsp menu to remove "bsp_", changed menu text in default .qe4 - fixed patch LOD update - now always occurs on both cam/xy draw djbob - dynamic DEpair class strings in bobtoolz http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=171 - decrease VESF verbosity http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=169 TTimo - fixed Gtk keyboard bug Ctrl + [ and ] http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=15 06/09/2001 TTimo - merged FullSetup branch into the trunk, we have basic functionality for a full linux setup (components prompting for path) http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=158 Gef - CapDialog source cleanup patch (got rid of the namespace) RR2DO2 - more camera fixes, wheel mouse and texture drag drop http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=23 - additionnal patch to optimize camera refreshes http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=23 djbob - remember last key/pair in entity dialog for easy "apply again" http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=18 - re-enabled texture name edit on PI http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=18 04/09/2001 djbob - left pane on status bar http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=166 RR2DO2 - cam window cursor fix http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=23 TTimo (FullSetup branch) patched setupdb and setup to allow for path prompt in install modified the setup script scheme to go towards a solution similar to what we do under win32 (build a full and nightly build) the binaries in setup.data/ (setup and setup.gtk) still need to be updated with proper binaries built from setup and setupdb cvs source 03/09/2001 TTimo - wheel mouse in texture window on win32 (with a pref setting for increment) http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=160 - not saving prefs while exit on sleep http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=157 - fixed select all of type (changed behaviour to something that makes more sense?) http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=79 Gef - final tweaks to wheel mouse scrolling (locks texwin scrolling and scrollbar update) http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=160 - prevent multiple color selection dialog for light entity http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=165 djbob & TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=137 window positions applied patch to store SI and PI positions storing entity info and map info positions reworked the overall position load/save scheme added an enum for the view style, makes things more readable 02/09/2001 TTimo - added/cleanup ToggleFreeMode to camwindow.cpp .. stopped working on cam stuff since RR2DO2 has another patch in preparation Gef - patched Conscript to accept 'cons -- release' on the command line to performa a release build djbob - added patch splitting to bobtoolz - fix to patch control points bug in camera http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=159 - handling of NWUV errors in q3map http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=147 RR2DO2 - new patch for camera control http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=23 01/09/2001 SPoG - Fixed .wal texture support, searches for .wal extension if .tga and .jpg fail NOTE: requires a "pics/colormap.pcx" file to obtain a palette from - Added variable default texture scale in preferences (ini key: TextureDefaultScale) 01/09/2001 djbob - fixed surface inspector "fit" bug http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=161 - single face deselection on a selected brush http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=153 31/08/2001 TTimo - Moved *.def files to scripts/ in win32 setup http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=116 - Applied patch for background position on widgets (win32) http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=108 - Checked C runtime lib configs http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=135 - updating docs (add to CVS, update setups etc.) added TA teams manual to the full setup uploaded on web site http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=97 - changed versioning to 1.1.1-nightly, next release will be 1.1.1 (the -TA part was removed, since we now support ALL mods) - removed AFX_MANAGE_STATE calls, this is old MFC related code for win32 - moved texdef_t::name to private, added const char * GetName() (doesn't fix explosion on exit for win32 debug builds though) - fixed DoTextEdit / EditPad b0rkage (due to recent Q_Exec changes) http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=134 - added targetShaderName documentation to shader manual http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=102 - added "notta" and "notq3a" documentation to the TA Mapping manual - fixed entities.def on shootable doors and buttons http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=101 djbob - added MAX_POINT_ON_WINDING error handling http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=129 - bobtoolz update http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=123 RR2DO2 - noclip-type camera movement http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=23 30/08/2001 TTimo - Fixed CHANGES commit script bug - Fixed -onlyents bug in q3map / origin brushes http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=92 - added mouse wheel to the texture window http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=81 SPoG - Fixed texture rotation not updating correctly on patches http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=136 - Fixed long delay on toggling cubic clip by removing call to Map_BuildBrushData() - Added note in entities.def for default worldspawn _color value http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=105 - Added IncRef and DecRef to Patch_FindReplaceTexture() http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=95 - Fixed misc_model updating on changing model key or with invalid model http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=138 30/08/2001 SPoG - Added negative vertical scale on SET and FIT in patch/surface inspector http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=65 27/08/2001 Gef - running makeversion.sh from Conscript - a bunch of patches to cleanup compile warnings on linux - added VectorSnap on float grid - IWindowListener modified to pass float values for X Y in click messages TTimo - fixed crash when adding a misc_model if Gtk dialog is on djbob - md3 filtering for misc_model dialog http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=76 26/08/2001 Gef fixed http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=152 Kyro II GL drivers bug fixed http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=150 using a scrolling textbox for GL extensions in the about list fixed http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=150 func_group toggle in cap dialog TTimo fixed running BSP commands on linux fixed http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=133 VFS init on linux around 15/08/2001 TTimo quakecon fixes: switched to long filenames in project and misc_model dialogs, removed all occurences of win32 conversion to old 8.3 filenames NOTE: this might raise some bugs and issues, but it's the way to go for the future, already fixes more issues than it creates 03/08/2001 djbob fixed Radiant hijacks win32 copy/paste http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=36 --- merged Alpha into Trunk, see Merge-1_1-TA-nightly tag 25/07/2001 TTimo fixed project dialog to behave right proper .def scanning fixed shader loading with VFS and mod stuff added a local to texwindow.cpp GSList *l_shaderfiles holds the names of the active .shader files modified q3map to read "fs_basepath" and "fs_game" TODO: .def files in the media need to move to /scripts/ rename entities-TA.def to entities-ta.def 24/07/2001 TTimo http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=116 updated cmdlib's Q_Exec to be more widely used through Radiant (during watchbsp.cpp cleanup) patching in MarsMattel's code for mod support, and started fixing: added m_strFSBasePath m_strFSMain m_strFSGame to g_qeglobals to match Q3's filesystem reworked the project file dialog changed the way we load and initialize eclass and shaders to work with mod code updated VFS initialisation code, cleaner and better console output the "game" key in the project file is no longer relevant, only "dir" is (if "dir" is not present, then no mod support, vanilla Q3) changed the loading of the .def files to scan in scripts/, you might need to move your entites.def to use TODO: cleanup .. (search where "basepath" is used for instance) using fs_game when calling q3map fixing project dialog to behave right shader loading using VFS functions (seems to work again but I'm not sure) win32 ver. might be slightly broken .def scanning, don't scan ALL .def 23/07/2001 TTimo added version and build info to the log file + current timestamp 22/07/2001 SPoG fixed selection of misc_model when viewed as a bounding box 20/07/2001 TTimo cons script for q3map building added general GtkRadiant versioning (version.h) to q3map nightly setup on linux: using the right install path (with GtkRadiant's version name) cleaned up options to only the stuff relevant to nightly fixed Radiant and core binaries path in setup added some template processing of setup.xml (similar to what is being done on win32) 19/07/2001 TTimo http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=112 applied ^Fishman's path inclusion of version.h and aboutmsg.h moved to qe3.h changed base path location process (in most cases it will prompt) fixed the path construction to initialize according to the new layout 16/07/2001 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=115 fixed wake up crash on linux 12/07/2001 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=117 fixed - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=120 fixed installer bug on win98, was a problem with cygwin config 11/07/2001 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=64 cleanup and fixed 06/07/2001 TTimo - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=100 can't locate the "textures: in use" problem, has been fixed already? now selecting the right entity in the list, had to go around an inifinite recursion problem (i.e. selection message in the entity class list causes UpdateSel recursion) 04/07/2001 TTimo - added botclip to missionpack/common.shader http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=114 01/07/2001 TTimo - backported cons scripts to Alpha branch. Type 'cons' at the head to build regular makefiles should soon be outdated.. 30/06/2001 TTimo - updated the IS script (Gtk changes and and BACK problem) http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=68 - bunch of fixed to make it build on win32 against new STLPort http://zerowing.idsoftware.com/STLPort/ using an STLPort configured locally in GtkRadiant (with stl_config.h, new file) 29/06/2001 TTimo - fixed GDI leak affecting text widgets, specially the console and the entity inspector 18/06/2001 TTimo - more win32 project file cleanup, removing libs/libxml2 from the tree - importing back "gtkr_list.h" from 1.2, made Alpha branch STLport compliant too http://www.qeradiant.com/faq/fom-serve/cache/174.html 30/05/2001 TTimo - added libxml2 as an external dependency. libxml2 should be installed as a seperate directory on win32. dynamic linking now instead of static previously. - cleaned up q3map win32 project file, removed opengl dependency (the drawflag command line is inoperant now .. I don't think it was used anyway?) 26/07/2001 TTimo - checking in Gef's doxygen files 14/06/2001 TTimo - added .dsp for map module on win32 - fixed several issues with module loading, stability of the debug and release builds http://www.qeradiant.com/faq/index.cgi?file=197 12/06/2001 TTimo - got rid of of SysMsg thing, using SysPrintf and SysFPrintf now - got rid of InfoMsg functions (can't remember what it was) - changed the m_pfnError in the plugin API to match Radiant's (void)(char *, ...) - changed Warning to Sys_Warning, as #define to Sys_FPrintf(SYS_WRN, 11/06/2001 TTimo - new map module, in plugins/map, required for execution (linux Makefiles written, win32 needs to be) this is using the imap.h interface - added Sys_ functions to the main table (Sys_BeginWait Sys_EndWait) - got rid of AFX_MANAGE_STATE macros .. those are crappy MFC remnants - reverted Spog's changes to the console logging switches to their original behaviour - removed m_fVersion from the func table .. we use the size of the table to do the checks XMLmap merge from 31/11/2000: - started moving the map loading code into a module 08/06/2001 TTimo - updates to the plugin loading code, verbose a bit more, and more interesting information 05/06/2001 TTimo - some fixes to vfspk3 string code, using the proper str implementation http://www.qeradiant.com/faq/index.cgi?file=175 - added and tweaked various cons build files, Radiant 1.2 core and required Q3 modules are building now - fixes to image module 04/06/2001 TTimo - started using cons for the linux (*NIX) build system see http://www.dsmit.com/cons/ SPoG - Fixed drawing too much coordinate text in XY window - Changed grid line drawing in XY window to be more consistent - Fixed clipper-tool-uses-caulk to only apply common/caulk to solid opaque brushes (shaders.dll now parses some new surfaceparms) - Changed shader parsing to pass over layer information in shaders, rather than parsing and ignoring it all - Changed misc_model selection to ignore back-facing triangles - Added axes to show the grid origin in XY window - Changed misc_model rendering and selection to minimise the number of extra transformation calculations - Fixed texture directory listing to allocate and free memory correctly using vfs - Added qglDeleteTextures() to plugin GL API - fixes crash - Fixed image.dll to correctly allocate and free memory for jpgs - Moved modules to /modules from /plugins, updated win32 project files. (linux/mac makefiles will need to be updated) - Changed console logging toggle in main() to automatically disable logging after any successful startup - Changed console logging to only activate when a Release build finds a .pid file - Changed "found .pid" and "logging console output" messageboxes to give a clearer message - Added vfsFreeFile - which is kinda redundant if we use g_free and g_malloc for everything 31/05/2001 TTimo - cleanup of the win32 project file and C++ options.\ Turned off exception handling, changed some code generation options and fixed some threaded/non-threaded linking problems - STL in GtkRadiant or a plugin must now use STLPort a custom configured version of STLPort is available at http://zerowing.idsoftware.com/STLPort still need to write some guidelines about it bascially, we are using STL: iostreams disabled, no namespace, no threading, no exceptions 30/05/2001 TTimo - removed libxml2 from tree, use a seperate libxml2/ directory next to GtkRadiant/ for win32 libxml2 will be distributed seperately as an archive based on official release (same as win32 Gtk SDK) (check on zerowing for the latest archive) libxml2 is now used as dynamic shared object on win32, makes sense since many module will rely on it - cleaned q3map, removed GL dependencies - updated Debug and Release builds on win32, it compiles and runs now 28/05/2001 Spog - moved vfsExtractRelativePath and vfsGetFullPath to vfs.cpp in vfspk3, added vfsExtractRelativePath and vfsGetFullPath to IFileSystem. Copied BuildShortPathName() from qe3.cpp to vfs.cpp as a Temp fix. - Changed Error() calls in bmp.cpp as a Temp fix, they relied on definition of Error in qe3.cpp. Should probably use Error() from cmdlib instead. - Fixed unresolved external in jpgload.obj - merged bufsize argument into jpeg_stdio_src from Alpha branch... assuming Alpha is the newer version. - Changed GtkWidget* to void* in image.cpp.. this could be cleaned up more.. i only did enough to make it compile. - Added jpeg.cpp to msvc project for image.dll.. changed declaraction of LoadJPG() in image.cpp to an extern... is this correct? - TODO: update vfs.cpp, vfspak.cpp and vfs.h in plugins/vfspak - fixed unresolved external load_pixmap() - merged load_pixmap declaration from Alpha branch into gtkmisc.cpp - moved vfsBasePromptPath() to qe3.cpp as a Temp fix - not currently required in vfs module, but it will be in future. - two calls to free() in texwindow.cpp freeing memory allocated by vfs module, causing debug assert errors - changed them to g_free() - TODO: Delete vfs.cpp and vfs.h from /radiant TTimo - additional fixes after Spog's merge (linux version), removed messaging.cpp messaging.h (name changed to ui.h ui.cpp) updated linux makefile accordingly - merge of Alpha version into trunk (massive amount of changes and merges, not detailed) 25/05/2001 TTimo (Alpha branch) - merged the recent MacOS branch back into Alpha this makes a potential source codebase for a MacOS release 24/05/2001 TTimo (Alpha branch) - patching Spog's recent changes to fix linux build using DBL_MAX and FLT_MAX from for float and double max 23/05/2001 TTimo (Alpha branch) - testing Spog's write access SPoG (Alpha branch) - Added variable LOD for PatchMeshes based on curvature - Added LOD-matching to eliminate gaps between patches with mismatched LOD - Fixed texture shift/scale on LOD'd PatchMeshes - Added opengl lighting (three infinite light sources) - Added dynamically calculating vertex normals for PatchMeshes, for gl lighting - Added decoding/transforming md3 vertex normals for gl lighting - Changed camera drawing routine to minimise gl state changes - Removed Patch_InsertDelete() - not functional - Added CV lattice to selected patches - Added Per-polygon patch selection - Added Per-polygon misc_model selection - Changed default "patch subdivisions" to 4 - Rewrote camwindow drawing to only change opengl state within the camwnd's member functions fixes all rendering modes to be more consistent, speeds up rendering --------- GtkRadiant 1.1-TA win32 and linux release ---------- 13/05/2001 Spog (patched in TTimo) (Alpha branch) - Fixed "Fix entity-target/targetname collisions" to use next available tN if tN, else use next available name_N - Changed patch point selection to pick already-selected points in preference over non-selected - Changed RemoveCols and RemoveRows to not extrapolate unless a col/row is selected 11/05/2001 TTimo (Alpha branch) - final fix pass to the generated version and about message tags - improved texture adjustment code (shift+arrows shortcuts) texture adjustment commands now affect the texture relatively to their current orientation they will move along their texture axis, and not along world axis the texture adjustment commands are now interpreted to be more intuitive: Radiant will match the up/down/right/left translation messages to the face that is affected depending on the way the camera is looking at the face, the right move commands will be used changes start in Select_ShiftTexture, using new ShiftTextureRelative_Camera ShiftTextureRelative_Camera uses several new functions: // get the two relative texture axes for the current texturing BrushPrimit_GetRelativeAxes(f, vecS, vecT); MatchViewAxes does the matching between up/down/left/right commands and world directions: // vec defines a direction in geometric space and P an origin point // the user is interacting from the camera view // (for example with texture adjustment shortcuts) // and intuitively if he hits left / right / up / down // what happens in geometric space should match the left/right/up/down move in camera space // axis = 0: vec is along left/right // axis = 1: vec is along up/down // sgn = +1: same directions // sgn = -1: opposite directions // Implementation: // typical use case is giving a face center and a normalized vector // 1) compute start and endpoint, project them in camera view, get the direction // depending on the situation, we might bump into precision issues with that // 2) possible to compute the projected direction independently? // this solution would be better but right now I don't see how to do it.. void CamWnd::MatchViewAxes(const vec3_t P, const vec3_t vec, int &axis, float &sgn) // shift a texture (texture adjustments) along it's current texture axes // x and y are geometric values, which we must compute as ST increments // this depends on the texture size and the pixel/texel ratio void ShiftTextureRelative_BrushPrimit( face_t *f, float x, float y) those functions are using various new utility functions: // GL matrix product void GLMatMul(vec_t M[4][4], vec_t A[4], vec_t B[4]); // project a 3D point onto the camera space // we use the GL viewing matrixes // this is the implementation of a glu function (I realized that afterwards): gluProject void CamWnd::ProjectCamera(const vec3_t A, vec_t B[2]) - UI abstraction layer (interfaces for Gtk MFC and Q3 UI) 09/05/2001 Maj (Alpha branch) - new splash screen Spog (patched in by TTimo) (Alpha branch) patcing in changes: - moving void VectorSnap(vec3_t point, int snap); to mathlib - NOTE: STL dependency removed .. leaving this comment this will rely on M$ implementation of STL on win32 and the libstdc++ for linux it should work fine for basic stuff but M$ implementation doesn't follow the standards when it comes to advanced stuff it is probably better to leave the STL header in local files and not go towards including it directly from qe3.h Spog's Changelog: rushing this a bit.. make sure you check it doesn't remove anything you changed. This only contains changes within /radiant .. i'm pretty sure I didn't change anything else, but i'll check again. Patch below. Fixed ctrl+G SnapToGrid, now never creates degenerate face-planes Fixed setting an origin for multiple brushes to use origin point of fixedsize entities Fixed mirroring and rotation of fixedsize entities including misc_model Fixed undo/redo on multiple entities to link brushes to entities correctly Fixed "view > entities as.." menu to display correct default setting Fixed "view > entities as.." toolbar button to show menu Changed selection-area of edge/vertex control handles to stay constant when zoomed Fixed undo on ctrl+G SnapToGrid Fixed Selection Invert to set bSelected correctly on patches Fixed XY-window Z selection origin to be g_MaxWorldCoord Changed RotateIcon to draw same size at all zoom levels Fixed origin drift on saving misc_model with null md3Class Fixed creation of cap for 'Bevel' type patches Fixed inverted cap being created for 'Endcap' type patches Fixed inverting patches on mirror operations Added snap-selected-to-grid affects only the patch points selected Cleaned up Select_ApplyMatrix and Select_SnapToGrid Added drawing of brush planepts in debug build Fixed texture quality slider adjustment Removed redundant menu items curve > cap > inverted bevel/inverted endcap Fixed texture scrolling not working when scrollbar is disabled Fixed textures with odd dimensions being skewed with texture quality less than max Changed Patch Inspector Horizontal/Vertical increment to use pixel values (default 8) Changed Patch Inspector Horizontal increment to subtract from S values but not T values Changed Patch Inspector Stretch spinner to do something useful Changed Patch Inspector Stretch default amount to 0.5 Changed Arbitrary Rotation dialog to reset rotation spinner values to 0 on Apply !! stops output in console window !! - Added sending q3map output to /temp/junk.txt to bsp commands, in win32 only Fixed Patch_Naturalize to calculate T values backwards, correcting texture vertical flip Changed patch row/column Insert/Remove to interpolate/extrapolate from existing curves Fixed point selection on patches when new points are added Fixed redundant edge/vertex handles being created for patch brushes and fixedsize brushes Fixed refusal to activate brush vertex-drag mode if any patches are selected Partly fixed Undo picking up patch point drags when no points are selected Fixed behaviour of vertex selection on patches Fixed patch point colours in textured mode in cam window Changed patch point selection to update selection pool on each selection click 06/05/2001 TTimo (Alpha branch) - more setup script changes, will rely on version information various other fixes in the script file 02/05/2001 TTimo (Alpha branch) - added makeversion.sh to the root, will generate version and date files before compilation version.h and date.h - cleanup and fixes to the linux setup scripts Spog (CVS add and config by TTimo) (Alpha branch) - win32 setup script, run setup/setup.sh from cygwin to create a working directory for the setup 01/05/2001 TTimo (Alpha branch) - fixes to linux version from previous set of patches 19/04/2001 Hydra (patched in TTimo) (Alpha branch) http://fenris.lokigames.com/show_bug.cgi?id=3458 : - *.pfb filter SpoG (patched in TTimo) (Alpha branch) - updated setup data: entities.def common.shader(Q3) and common-spog.pk3 http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=25 : - Patches: Curve > matrix > redisperse > rows/columns I changed this function to treat a patch as multiple 3by3 sections when doing redispersal of control points. The effect is that green patch points are never moved. I also removed the call to Patch_Naturalize, so the texture coordinates are not changed (user can hit ctrl+n to naturalize afterwards if desired). - rewrote the patch_captexture function to be more reliable - Fixed YZ view drawing and selection being mirrored on plane X=0 - Fixed X and Z rotation direction to be clockwise as shown on the toolbar button icons http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=8 : - Fixed: Removed orientation-switching hack to fix 2pt-clip orientation problems, originally stemming from ass-backwards representation of grid axes. Fixed clipper to generate 3rd clip point correctly for each axis instead. - Fixed: Stopped clipper-caulker from NOT applying caulk if the first face of a brush was "common/caulk". TTimo (Alpha branch) - removed some unused code in the Gtk file dialog, hopefully stabilizing it 02/04/2001 TTimo (Alpha branch) - changed the regular/BP conversion prompt 01/04/2001 Spog (patched in by TTimo) (Alpha branch) - Fixed view > show coordinates now affects Z window - Fixed minimum/maximum world coordinates now -65536/65536 - Fixed view > show blocks now only draws vertical lines if not XY view - Added variable blocksize (gtkr only displays 1024 < blocksize < 65536) - Changed XY/Z window grid drawing to use floats internally - Fixed broken XY window grid drawing for higher zoom levels - Changed camera and Z-checker icons to stay the same size when zoom level changes 24/03/2001 Spog (patched in by TTimo) (Alpha branch) - added filters.cpp to the VC6 Makefile. Linux build needs updating - Changed Filter system to use brush-flags updated only on actions that affect filtering - Changed Filter system to allow further extension and future customisation - Changed show/hide to use brush filter flags - Changed Find/Replace textures to only rebuild brushes that changed. - Changed View > Filter menu shortcuts and behaviour - Fixed various minor spelling errors TTimo (Alpha branch) - Fixed the 'Clean' command in preferences, used to remove only Radiant.ini and not SavedInfo.bin 06/03/2001 TTimo (Alpha branch) - better parse error information: added the line number of the error in (hopefully) all cases 30/02/2001 TTimo (Alpha branch) - texture locking in BP mode for axis flipping and axis rotation (toolbar buttons) (Id bugfix request) - fixed undo in BP mode - MatchToken error message in q3map improved with the script name 27/02/2001 TTimo (Alpha branch) - switched linux makefiles to xml2-config instead of xml-config latest version of libxml2 is using xml2-config instead of xml-config now 26/02/2001 TTimo (Alpha branch) - fixed a loki_initpath misbehaviour, was overriding the path to the binary with RADIANT_DATA if defined 21/02/2001 - Added setup data and a script to build linux setups to the cvs TTimo (Alpha branch) - various printf -> Sys_Printf - added vslick/ directory for Visual Slickedit 6.0 on win32 <- THIS IDE RULES 20/02/2001 - Removed "Show Paths" option, already in the filter menu 19/02/2001 - Fixed the Enter key handling on the surface inspector (suggested by Spog) - Fixed skewed textures with lower texture quality - Changed the order the include directories are searched under Linux 15/02/2001 - Moved the Show Cluster Portals option to the Filter menu - Fixed the rotate and scale toolbar buttons being incorrectly checked - Fixed arbitrary rotation bug (#3073) 14/02/2001 - Fixed CreateFont memory leak on glwidget 12/02/2001 TTimo (Alpha branch) - fixed save as prefab stuff (right dialog name and overwrite prompt) 10/02/2001 TTimo (Alpha branch) - was crashing on win32 boxes where HOME env var was not defined (loading bookmarks) 09/02/2001 TTimo (Alpha branch) - change some code in the file dialog to use g_malloc g_free instead of new for win32 file dialog and malloc for Gtk file dialog. (all of this trying to get rid of some of the crashes) 07/02/2001 - Fixed Load command initial path - Fixed some toolbar buttons not being correctly initialized -----------? 06/02/2001 (Alpha branch) - Fixed pk3man file dialog errors - New RC uploaded - Changed conflicting shortcuts: FilterModels = Shift+M, FilterTriggers = Ctrl+Shift+T TTimo (Alpha branch) - fix to hide/show, still selecting hidden brushes 05/02/2001 (Alpha branch) - Fixed compile errors (use stat, not _stat) - Removed --nofonts option 04/02/2001 TTimo (Alpha branch) - fenris #2866, added a pref to turn on/off name conflicts resolution, rewrote the whole algorithm - fenris #2823, fixed patch and brush dragging in 0.25 0.5 grids (it's an ugly hack btw) - fixed the black squares at end of line in Gtk text boxes RR2DO2 (Alpha branch) - fix to the "entitypath" fixup in QE_CheckProject. might not compile on linux yet (use of _stat?) 03/02/2001 TTimo (Alpha branch) - fenris #2867, limiting the amount of "spawnflags" "0" appearing in entities. This bug has work left to do, there are some oddities in the entity inspector behavior described. 02/02/2001 (Alpha branch) - Fixed sleep mode not restoring windows correctly - Fixed some minimize/restore issues on floating views mode TTimo (Alpha branch) - fixed more gtkfilesel stuff. pattern filtering works for both Gtk dialogs and win32 native. Also checked on linux that it compiles. Renamed gtkfilesel.h to gtkfilesel-linux.h for consistency. 31/01/2001 (Alpha branch) - New file selection widget with filtering, masks and all other shit we need TTimo (Alpha branch) - changed some gtkfilesel API and fixed some bugs on pattern filtering, need to reboot on linux and fix some more 30/01/2001 (Alpha branch) - Added an option to keep the Z and XY views on the same window in floating views mode - Did some cleanup TTimo (Alpha branch) - removed the 3 layers in terrain entities limitation, increase version tag to patchlevel 3 sent for testing to AstroCreep, bug is still there - fixed one more thing with RC file (get it in the right dir) - worked on file dialog and pattern filtering, still issues left 29/01/2001 Jonas (patched in by TTimo) (Alpha branch) - Using RC file to tweak the font size on win32, looks much nicer now! - Fixed fenris #2773: esc key behaviour when group window has focus / dependant on view modes 28/01/2001 TTimo (Alpha branch) - Finished fenris #2810 (Snap T to grid), it was a bitch - Fixed fenris #2769: raise the brush max size (it was already big, now it's just not sane) - Fixed fenris #2965: eclass (entities) loading code broken, needs to be checked on linux build before closing 27/01/2001 TTimo (Alpha branch) - Fixed vertex edit prefs broken - more fixes in Gtk libs - Fixed clipping + brush primitives bug (#2644) - Fixed clip caulk related issues (#2912) - Added Snap T to grid back (#2810) <- still need to test and validate it, I'm too tired tonight 25/01/2001 TTimo (Alpha branch) - New Gtk file selection dialog seems stabilized, built a Gtk SDK for the new Gtk libs. 24/01/2001 (Alpha branch) - Fixed elapsed time displayed by q3map - Fixed Radiant loading some TGA files upside down TTimo (Alpha branch) - more work done on the file selector. Added a win32 pref to select between regular win32 file dialog and Gtk one. The advanced file selector is still not stabilized on win32. I am thinking about letting go and sticking to the regular one. 23/01/2001 (Alpha branch) - Fixed q3map not finding md3 files under missionpack/ - Prompt to save changes when choosing a recent file - Fixed window title when choosing File/Load Map - Don't show hidden brushes in the Z window 22/01/2001 (Alpha branch) - More File Dialog fixes 21/01/2001 TTimo (Alpha branch) - version first version of the advanced file selector on win32 seems to work nicely, but crashes when you actually load something .. needs debugging! leo (Alpha branch) - Set correct initial directory for the File/Load command 17/01/2001 (Alpha branch) - Fixed q3map is crash if a .shader file is referenced in shaderlist and not found TTimo (Alpha branch) - fixed some license headers on gtkfilesel.c, started looking into porting gtkfilesel.c to win32 16/01/2001 raistlin - the tree is opened whoooo! TTimo (Alpha branch) - replaced the old Id header by the newer version (BIG update, to trunk and Alpha) - switched str.h to BSP - added LGPL license to the sample dll 15/01/2001 (Alpha branch) - Added camera window toggle option to all views mode TTimo for trunk and Alpha: - renamed TOOL_SOURCE_EULA to LICENSE_ID - renamed CONTRIBUTOR to CONTRIBUTOR_AGREEMENT - added CONTRIBUTORS and LICENSE 14/01/2001 (Alpha branch) - plugin SDK is back in setup/ moved the sample dll to be in plugins/, need to rewrite the SDK scripts - built a lightweight plugin SDK with cygwin makefile for the sample plugin 12/01/2001 (Alpha branch) - Set map modified flag when deleting a brush - Minimize all windows when the main window is minimized in floating views mode 11/01/2001 (Alpha branch) - Cleaned up the View/Show submenu - Fixed texture menu splitting - Fixed major grid lines on 128 and 256 grids - Load only a single .def file if specified in the project settings - Fixed q3map Makefile TTimo (Alpha branch) - Removed plugins/shaders from Alpha branch - got rid of common2/ and code, moved qfiles.h and surfaceflags.h into common/ - put the licensing headers in all source files (forgot some? byte me) 10/01/2001 leo (Alpha branch) - Added new filter system based on FAKK2 Radiant TTimo - fixed whatever could be fixed to make it compile with the new directory layout (Alpha branch) - project files update 09/01/2001 (Alpha branch) - Added undo for patch redisperse rows and patch redisperse cols commands - Fixed Show Z Outline menu item 30/11/2000 TTimo - removed content flags and value from qtexture_t, these have moved to the IShader (NOTE: qtexture_t != texdef_t, texdef_t still using flags value and content) - Rewrote the linux plugins Makefiles 29/11/2000 - Improved the way modules are loaded - Added new parameter to QERPlug_RequestInterface - finished VC6 project files conversion for new directory structure - fixed shader blending on terrain maps bug 08/01/2001 - Updated Makefiles for the new directory structure - Fixed View/Show/Entities menu not being checked correctly - Fixed "Invert Selection" command selecting hidden brushes - Fixed "Select All of Type" command not working correctly after the Enitity Window is closed - Fixed grid being drawn even when it's the same color of the background - Fixed "Toggle Size Paint" not turning off 05/01/2001 - Fixed autosave interval being calculated wrong - Fixed autosave path under Linux - Fixed q3map crash when trying to load missing pcx files - Fixed q3map not finding .bmp files for the terrain alpha map 04/01/2001 - Fixed GL stack underflow when loading a misc_model 03/01/2001 - Fixed patches remaining half-selected after "Region set selected" (#2748) - Fixed Surface Inspector spin buttons rate (#2776) - Fixed some shortcuts not appearing on menu items (#2786) ================================================================================ 1.1-TA beta ================================================================================ 02/01/2001 - Fixed memory problem if a file without extension is entered in the file save dialog. - Fixed double slashes "//" on filenames when saving a map - Fixed pk3man plugin not finding the toolbar bitmaps - Fixed double clicks being considered 2 mouse clicks RR2DO2 (applied by TTimo) - Clusterportal filtering ('View > Show > Show clusterportal' toggle) 01/01/2001 TTimo - updated Web/ with new stuff, web site ready for release - fixed a crash with multiple edge dragging on win32 (was caused by compiler optimizations, this one was a major pain) 31/12/2000 - fixed the file open/save dialogs initial directory RR2DO2 (applied by TTimo) - bug fix in the terrain loading speedup TTimo - tried to lookup the Z window minimum width problem, added #define DBG_WINDOWPOS code to investigate 30/12/2000 RR2DO2 (applied by TTimo) - fix to CSG Merge in the menu drop down (menu was there, command not hooked) - some message formatting fixes TTimo - rudimentary pattern matching in file selection, affects the plugin API too - fixed silly bug in the "clipper uses caulk" code - major speedup to the loading code on terrain entities (in mpterra2, from 113s to 4s for the main terrain entity) - patched back the file open/save dialogs initial directory to override in TA mode - fixed Patch output crash in the plugin API - fixed BP conversion in the brush output of the plugin API minkey (applied by TTimo) - fix to the m_pfnLoadFile code to use VFS 29/12/2000 - Remember main window position in floating views mode - Fixed wake up when running the engine in floating views mode under win32 TTimo - various fixes and debug hooks for PJ bug reports 28/12/2000 - Fixed VFS initialization order - Removed texture menu splitting option from preferences (now it's automatic) TTimo - built an initial setup, updated the changelog file for 1.1-TA-beta 27/12/2000 - Fixed Q3Map output window being too wide on some errors - Added VFS to q3map TTimo - replace a printf in q3map by Sys_Printf (!), which is what should actually be used - added a set of functions to vfs to help with file dialogs, building relative files etc. - reworked the file dialogs so they default in the right location (open/save as/md3 loading/sound loading) - fixed shader editor to work with the right path 26/12/2000 TTimo - put the converted HTML manuals (Radiant, shaders and model) in the tree (and the win32 setup) - added the new Terrain and Team Arena mapping manuals (added to the setups too) leo - Copy and paste across different instances of Radiant - Fixed wait cursor when copying - Print engine command line to the console - Fix glib warnings when running the engine - Fixed shader files being loaded twice - Texture menu now automatically breaks when it reaches the maximum screen height 24/12/2000 - Fixed q3map to compile with the new LoadJPGBuf parameter TTimo - added TA paths to the BSP commands and running engine - fixed a bug if running with monitoring disabled (generating the .bat was borked) - changed the -moddir implementation to a global switch in q3map (same as -connect) - moddirparam as a global variable in cmdlib, added a TA_HACK in there - changed the SetQDirFromPath to stick to "baseq3/" when using -moddir TODO: check standalone files 23/12/2000 TTimo - fixed some sleep/wake code (crashes and wakeup problems on models) - vfsInitDirectory for TA directory (needs to be checked on linux) - changed my mind on entities.def, if TA is enabled, load entities-TA.def on top of regular entities.def mickey (applied by TTimo) - some memory overrun fixes 22/12/2000 - Fixed plugin Makefiles to not use private/ RR2DO2 (applied by leo) - Fixed SetTallBrush undo - Added bug report link to help menu 21/12/2000 - Daily Linux compilation fixes - Fixed q3map to read .pk3 files from the directory set by -moddir - Fixed vfs not listing all files correctly - Fixed libjpeg crashing on some jpeg files - Load .def files depending on the current game 20/12/2000 - Applied Mickey's patch to fix win32 window position save/load. - removed missing _msize call TTimo - cleaned up more g_malloc g_free problems, cleaned a INPUT_BUF_SIZE problem in jpeglib 19/12/2000 - More manual updates - Fixed bugs comparing file extensions - Added VFS to the Alpha branch TTimo - moved game selection to the project settings - got leo's vfs fixes, started changing the memory allocation scheme to glib - moved 'free' calls to g_free with a #define in cmdlib, Radiant seems to run nicely again - removed calls to _msize .. those were causing heap debug assertion failures - upped more stuff 18/12/2000 - Added popup menus with the list of active textures to the find texture dialog - Fixed some menu checkbuttons - Changed max number of shader files parsed by q3map to 128 - Updated manual images 17/12/2000 - Fixed bug with the texture window scrollbar range Mickey (patched in by TTimo) - fix to the floating windows mode, don't send windows to the desktop when raising something else (#2659) TTimo - finalized the merge and move into worldspawn commands by adding the undo stuff - fixed the clamping problems when flipping or mirroring patches - added 0.5 and 0.25 grids - added undo to Select_CompleteTall Select_PartialTall and Select_Inside - added on-the-fly conversion between regular brush coordinates and brush primitives texturing in the plugin API 15/12/2000 - Fixed crash on Shift-A (Select all of type) - Save the state of the toolbar buttons - Remember the state of the Show Patch Bounding Box button - Double clicking on an entity on the Entity View tree selects the entity - Sort the list columns of the map info dialog - Fixed a bug that would allow multiple Entity View dialogs Mickey (patched in by TTimo) - saving position and size of the entity window between runs and during usage TTimo - two new commands in the drop down menu: "move into worldspawn" will move selected brushes to worldspawn and eventually delete entities which end up with no brushes "merge brushes" will merge brushes into an entity (from worldspawn or from another entity) - added cleaned HTML version of the editor manual in the tree 14/12/2000 - When pressing a letter key in the entity window list, scroll to the entity starting with the key pressed - Fixed backspace not working on the texture subset entry - Added version check when loading savedinfo.bin TTimo - started implementing Select_Merge and Select_Seperate for workflow improvement on terrain maps 13/12/2000 - Finished GtkGenSurf RR2DO2 (merged in by TTimo) - patch to q3map, added option -custinfoparams for custom surface flags (still need documentation) TTimo - zoom out and grid drawing taylored to the world size 12/12/2000 TTimo - quick win32 update to gensurf - fixed #2610 (MAX_NETMESSAGE) .. needed a consistent rewrite of the way we parse the stream 11/12/2000 - Fixed linux compiler errors from recent changes Not fixed today but I forgot to add those to the Alpha changelog - Fixed multiple Map Info dialogs bug - Fixed texture window not scrolling to the top when a new directory is loaded - Fixed GL Windows grab pointer bug - Fixed crash after map compilation if the map leaked - Fixed q3map crash if MAX_SHADER_FILES is reached 28/11/2000 - Fixed sleep mode restoring hidden windows (win32) - Fixed find/replace textures dialog layout and keep it always on top of the main window - Replaced malloc/free calls with g_malloc/g_free to avoid the win32 limitation 27/11/2000 - Removed glu.h dependencies - Added new file selection dialog - Removed g_PrefsDlg.m_bDisableAlphaChannel (always FALSE) - Added shortcuts for sleep and simple patch mesh - Fixed crash after sleep mode (no GL context current) 24/11/2000 - Rewrote the jpeg functions of the image plugin - Replaced some MFC classes with glib - More shader plugin fixes - Fixed bug with select all entities command TTimo - fixed q3map to handle the new LoadJPGBuff length parameter 22/11/2000 - Fixed crash in Error() if there's no current GL context - Fixes to the shaders plugin TTimo - created VC6 project file for image module - modified the m_pfnError in qerplugin.h to use (char *, ...) construct 21/11/2000 - Ensured that the plugins are loaded in the correct order - Added Sys_FPrintf and Sys_Printf to the plugin interfaces - Some VC++ fixes TTimo - more fixes to the world size - modified moduleentry_t so it compiles on win32. need to update the code in all modules probably - other minor fixes and updates to get everything building on win32 20/11/2000 - Moved image loading code to a plugin - Fixed some bugs in the shader plugin - Now using glGenTextures to set texture ids 19/11/2000 TTimo - shader code removed from Radiant core, relies on shader module - added ctrl-alt-LBUTTON = multiple brush select without selecting whole entities (from TA update) - added an XML testing proggy in DevDocs/ 18/11/2000 TTimo - shader module is compiling - reworked the way we deal with required interfaces, automated the interface request process and added code to check the required modules have been found 17/11/2000 - Q1 VFS plugin - Changes to the VFS API to detect the format supported by a plugin - Added checks to PluginManager to load the correct VFS plugin TTimo - made a mess with XML MAX_NETMESSAGE error, still not fixed - merged q3map 1.0r (TA update from Id) into the tree - important files modified: surfaceflags.h qfiles.h 08/12/2000 TTimo (shit I'm 24 now) - added gtk gensurf, VC6 project files are up to date, linux Makefile not checked - fix some WINAPI stuff on above code - add idata.h for raw access to editor data - new _QERAppShaderTable for shader module -> editor functions - added new entries in various tables (GL, parser etc.) - shader module is well under way 16/11/2000 - Added a color selection dialog function to the plugin API - Added profile read/write functions to the plugin API TTimo - MAX_NETMESSAGE bug: patched q3map so it sends in several messages if the problem occurs still need to update Radiant to recognize XML nodes split into several messages (using an input buffer) - added a test map for MAX_NETMESSAGE: sput.map - project file for vfspk3and win32 patching 15/11/2000 - More plugin cleanup - Added IsEqualGUID() to qerplugin.h TTimo - merged Alpha back in (didn't try to merge this CHANGES file) - backported some stuff from the trunk to here, the Sys_Printf, gtk_MessageBox and profile stuff - created VC project file for gtk-based gensurf plugin 14/11/2000 - Fixed DumpUnreferencedShaders() TTimo - added QE_CheckProjectEntity to check paths are following the right conventions 13/11/2000 - Fixed bugs in the vfs plugin - Added support to vfs plugins in Radiant TTimo - updated project file to libxml2-2.2.8, use libxml2 as the directory name for whatever version.. NOTE: libxml2-2.2.8 needs some patching to compile right.. 12/11/2000 TTimo - all Radiant functions that might be exported in interfaces need to use the WINAPI calling convention modified the GTK functions code accordingly - started writing the shaders module 10/11/2000 - Added new GTK functions to the plugin API - Added 'parent' parameter to MessageBox, file_dialog and dir_dialog - Fixed Help commands (Linux) 09/11/2000 - Fixed bug in the Z wnd code - Fixed copy text from the console (win32) TTimo - moved the libxml library out of the tree, updated the VC6 project files accordingly 08/11/2000 - ZWnd always on top (view #2, win32) TTimo - added Escape key to hide the entity inspector - S and Shift+S now act as toggles on the inspectors 07/11/2000 - Added ungroup command to right click menu - Fixed message box accelerator bug - Fixed GL error on win32 startup TTimo - additions to the BSP interface - fixed DestroyCursor error - clipper caulks faces (and prefs checkbox) 06/11/2000 - Cleaned PrtView and TexTool plugins - Fixed bug in texture menu names (#2506) - Added splitters to Entity dialog TTimo - started clipper caulk implementation - fix to the pointfile not drawing in 2D views - MAX_BUILD_SIDES in q3map debug stream 05/11/2000 - Merged Alpha branch with the trunk TTimo - more plugin interface for Q3Build, and plugin SDK additions - merged q3map Realloc back into Alpha branch 04/11/2000 - Fixed crash during startup if Zwnd was hidden in views #2 and #3 - Fixed ToggleConsole command - Fixed ToggleEntity and ToggleTexture commands in view #2 - Fixed plugin Makefiles - Removed -rdynamic from Radiant link options (crashes pk3man plugin) 03/11/2000 TTimo - directory reorganisation for the plugin SDK, added an interface/ directory 02/11/2000 - Save ZWnd state in views #2 and #3 - Entity dlg always on top (linux) - Fixed shortcuts.ini parsing bug - Fixed editpad crash if editpad not present (win32) - Fixed bugs in the internal shader editor - Fixed widget_show if window moved after gtk_widget_set_uposition ================================================================================ 1.1 beta ================================================================================ 31/10/2000 - Continue loading if glXGetProcAddressARB is not present (Utah-GLX fix) - Fix BSP commands not working if a map is not in "mapspath" (linux) 30/10/2000 - fixed the Region commands, "Region > Set brush" is working Region uses the camera as spawn point. - Fixed view/show menu initialization - Fixed warning when starting view #2 - Fixed z wnd in view #3 - Fixed win32 sleep mode crashes on views #2 and #3 - Added "Restart" message when changing texture quality in the preferences - Cleanup: removed radbsp.cpp (unused) and unzip.cpp (already in pak.a) 29/10/2000 - Fixed SIGCHLD handler - Built 1.1b setups 28/10/2000 - Fixed q3map bug visbytes > MAX_MAP_VISIBILITY - Fixed clipper display bug TTimo - updated quakev2.qe4 with -vlight options - added checks in q3map to prevent crashing on allocating a winding too big will stop with an error now. - added the corresponding editor support for debug messages if MAX_POINTS_ON_WINDING is exceeded G_Dewan - improved q3map, reducing minimal memory footprint by about 45Mb 27/10/2000 - Fixed crash in BSP debug window - Reorganized the preferences dialog - Fixed q3map Makefile - Fixed +/- bug in win32 (Gtk patch) - Fixed Alt shortcuts bug in win32 (Gtk patch) - Fixed q3map crash when visbytes > MAX_MAP_VISIBILITY TTimo - improved snapshots behaviour, doesn't snapshot non-modified maps 26/10/2000 - Fixed patch inspector not showing after it has been closed - Added 'Reset' button to entity dialog 25/10/2000 - Fixed more grid issues - Fixed load window position bug (saved pos greater than screen resolution) - Fixed selection nudge bug - Improved entity windows layout - Fixed GL font not being recreated when exiting sleep mode TTimo - cleaned m_nTextureTweak and m_bSnapTToGrid - improved the CycleCapTexturePatch command, now cycles across the 3 planes only and works on multiple patches at once 24/10/2000 - Added an overwrite prompt when saving files - Fixed 128 and 256 grid display - Commented-out grouping code (not functional yet) 23/10/2000 - Fixed q3map to load jpgs under Linux - Fixed wake-up crash when floating windows were closed (#2423) 21/10/2000 - More q3map and radiant Makefile fixes - Remember size/position of the entities dialog 20/10/2000 - Redirect Gdk warnings - Draw border around active XY wnd - Moved some scripts to the Makefile - Added shift+rclick to zoom in/out - Removed minimize/maximize buttons for z wnd in floating mode under win32 TTimo - Two new entries in View > Show: Show Outline and Show Axes Show Outline turns on/off colored outline of the current view Show Axes turns on/off display of a small axis base in the 2D view - fix q3map Makefile to use external libxml2 source G_DEWAN - Fix to bogus noshader error message in q3map 19/10/2000 - Added new console functions that support colors - Revised linux makefile for debug/release builds - Redirect Gtk warnings to the console TTimo - reorganized the entity inspector window, layout depends on the number of flags to get more space in the comment window. 18/10/2000 - Fixed add/remove bsp items in project settings dialog - Did some cleanup (removed #define WIN32_CONSOLE) - Fixed console not working in view #3 - Fixed warning when exiting in views #2 #3 TTimo - fix to entity inspector comment window for the eclass_t on win32 (removed the white squares) 17/10/2000 - Fixed texwindow not scrolling when last texture is large - Added LOD for patches - Fixed prefab path & user ini in preferences dialog 13/10/2000 TTimo (XML branch) - basic architecture for XML feedback is functional see radiant/feedback.cpp radiant/watchbsp.cpp q3tools/common2/inout.c merging back in alpha 04/10/2000 TTimo (XML branch) - sax interface is in Radiant, need to add a state machine and proper processing 04/10/2000 TTimo (XML branch) - experimental use of SAX interface to parse the stream on the server side, see q3tools/q3map/NetTest 03/10/2000 TTimo (XML branch) - adding libxml2 in the repository, based on libxml2-2.2.4 with project files and stuff to build on win32 31/09/2000 TTimo (XML branch) - new common2/ dir, output system rewritten through Sys_Printf - experimental use of libxml 28/09/2000 TTimo (Inspector branch) - shift+arrows matches the increments from the surface inspector - button 'Match Grid' in the SI to set the increment according to current grid 25/09/2000 TTimo (Inspector branch) - fixed crappy bug in SavedInfo.bin upgrade (when the struct sizes don't match) - surface inspector has inc step dialog boxes (+saved in prefs) - face selection is always on (was something weird from the prefs) - undo works better with the surface inspector 25/09/2000 - Added ARB_Multitexture support 21/09/2000 - Fixed preferences dialog warning - Added new grid sizes 20/09/2000 - Fixed small bugs reported from Fenris 17/09/2000 TTimo - fixed a bug with template project loading / path to the engine safecheck (a weird hidden one) G_Dewan & TTimo - fixes to the process spawning (Q_Exec in cmdlib) + appropriate warning and error messages Fishman - antialiased drawing in 2D views 14/09/2000 TTimo - radiant.log commandlist.txt and radiant.pid are create in g_strAppPath on win32 and g_strTempPath on linux - moved the splash screen after the .pid code - I suspect a bug in the .pid removal, added a check and message box - help works again on win32, spawning Word with the Q3Rad_Manual.doc (temporary solution of course) - surface inspector: removed all Q2 related stuff, fixed horizontal shift, reorganized the widgets layout hooked the widgets to apply the changes on the fly (the inspectors need a good chunk of work) - fixed a radiant.pid bug - added icon to MSVC6 project (with some help) G_Dewan - fix to BSP menu order getting mixed up - fix to the file dialog 11/09/2000 - Added splash screen 25/08/2000 TTimo - launch sleep mode before running game - fixed Map_Snapshot bug - going to sleep works on view n2, raising is still screwed (contexts) 24/08/2000 TTimo - fixed some sleep mode stuff - fixed map snapshot bug 21/08/2000 - fixed stuff to build on linux - Merged in q3map 1.0p 18/08/2000 - Removed "High Color Textures" option (always on) - Removed "Status Point Size" option 17/08/2000 - Fixed win32 console issues 16/08/2000 - added g_strTempPath - restore maximized window state - fixed logo.bmp 15/08/2000 TTimo - fixed keyboard shortcuts - fixed engine path in prefs (must use the file dialog to change) - fixed a bug related to engine path and project templates 15/08/2000 - Removed QE4 update model option (always on) - Removed Buggy ICD option (always off) - Reorganized the preferences dialog to take a bit less space 14/08/2000 TTimo - using profile.cpp code to read shortcut keys files - moved DevDocs/changelog.txt to data/changelog.txt (data/ should be used for user-side stuff and DevDocs/ for developpers) - added data/quickstart.txt with a beginning of info about the main differences between Q3Radiant 202 and GtkRadiant. to be used as a doc later. 13/08/2000 TTimo - added DevDocs/WIN32SETUP and DevDocs/changelog.txt changelog.txt is end user changes WIN32SETUP the TODO list for install specific stuff - wrapped a first version of the win32 installers (full and patch) 11/08/2000 TTimo - quickfix to put undo/redo back in - added DevDocs/WIN32SETUP, describes what I'm up to with the setup of win32 version 10/08/2000 TTimo - added back the window position saving code that was in earlier tree NOTE: would have rather have it done in prefs than hooked in mainframe_delete and MainFrame::Create (would have been cleaner IMO) NOTE: IT'S STILL BROKEN .. I ADDED THE CODE BUT I MUST BE MISSING SOMETHING NOTE: it doesn't remember the maximized state. It should. 08/08/2000 TTimo - fixed win32 build for GLWidget code, added WINAPI calling convention on all exported stuff - fixed TexTool to compile under win32 07/08/2000 TTimo - fixed some crash with the new jpeg lib - fixed console logging behaviour (was always turned on at startup) - added console logging checkbutton in prefs 07/08/2000 - Merged the GLWidget branch - Merged 202 patches - Fixed "clean" button in the preferences dialog - Added pid startup detection - Updated plugin interface with GLWidget functions - Updated TexTool plugin 04/08/2000 - Added "errno" string to the Error() message box - More 202 patches 03/08/2000 - Merged changes from MFC Radiant 202 - Fixed the win32 GLWidget stuff 02/08/2000 - new OpenGL widget to keep all platform specific code in only one file 01/08/2000 - Added code to restore the windows when coming out of sleep mode - Rewrote the TexTool plugin 31/07/2000 TTimo - added vc6 projects for PrtView - tested PrtView and Radiant against latest binary release of Gtk (works great) Leo: - Updated VC5 projects - Fixed plugin loading under win32 - Updated PrtView to compile under win32 - Radiant is now iconified when going in sleep mode 30/07/2000 TTimo - prefs dialog for BSP monitoring - Added data/ directory with entities.def and quakev2.qe4 - stabilized syntax of v2 project file, same project file for both platforms - added DevDocs/WIN32BETA with a list of stuff to do before going on public beta on win32 - added DevDocs/d2u .. handy script to remove linefeeds from DOS files - added radiant/radiant.proj, project file for source navigator (SN rules) Leo: - Fixed the logfile crash when ~/.q3a/radiant doesn't exist (fenris #1953) 28/07/2000 TTimo - Fix to the win32 console to use window's default font - Added File > Sleep for experimentation NOTE: we need to keep Radiant minimized when going into sleep mode 28/07/2000 - Finished the win32 console replacement - Fixed bug 1952 (map loading segfault) - Added a Makefile to the libs dir 26/07/2000 - Added PrtView plugin - Added qvm target to source/Makefile - Another release candidate sent to QA 18/07/2000 - Fixed the slow updates issue in the win32 version - Added 3 new variables to fix the paths issue 17/07/2000 - Fixed the plugin search directory (broken with the changes to g_strAppPath) 14/07/2000 - Increased the timer speed in MainFrame::RoutineProcessing - Added code to release and recreate the contexts to the win32 version - Fixed the mouse capture under win32 13/07/2000 - Fixed the new path and bsp problems - Sent new version to QA for testing/release 12/07/2000 - Added "tools/" back to g_strAppPath under linux 11/07/2000 - Added code to release and the recreate the GL contexts (linux) 10/07/2000 - Changed directory structure 09/07/2000 - Added CS_OWNDC for win32 with a GDK hack 07/07/2000 - Fixed "white textures" bug (gluBuild2DMipmaps bug) 03/07/2000 TTimo: - main.cpp l386, removed tools/ appending to g_strAppPath, g_strAppPath is expected to point to the app.. (hope it doesn't break anything) 02/07/2000 - Added precompiled headers for faster win32 builds 01/07/2000 - Finally got q3asm/lcc working 26/06/2000 - 201 patches - Added screenshot option - Added an error message if X is running in 8 bits 23/06/2000 - Updated with build 200 source 13/06/2000 - Remove --noshare option - Added --nofonts option to workaround a bug using glXUseXFonts in XFree 4.0 04/06/2000 - Fixed bug with the Ctrl-X accelerator for the File/Exit menu 02/06/2000 - Converting the TexTool plugin 30/05/2000 - Changes to the plugin loading code 28/05/2000 - Files with an underscore character are now correctly parsed in the MRU menu 25/05/2000 - Fixed _exit bugs - Fixed bug in CMapStringToString::SetAt - Fixed copy/paste/clone bug 24/05/2000 - Finished applying the 199 patches - Fixed a bug in CShaderArray::SortShaders() that was calling the wrong version of InsertAt() - Added numbers to the MRU menu items 23/05/2000 - Fixed the floating point bug in gluBuild2DMipmaps - Fixed the time display after a bsp command is executed - Applied several patches from the 199 version - The console is now visible by default 21/05/2000 - Added a replacement for gluBuild2DMipmaps 20/05/2000 - Fixed the repeating textures bug when playing a map, "brush_primit" must be set to "1". - Fixed the bug about no current GL context when exiting in computers with 3dfx cards. - Textures in the directory pointed by "texturepath" are now loaded correctly in Radiant. - Fixed bug in q3map where it would require a shaderlist.txt file in ~/.q3a/baseq3/scripts. 19/05/2000 - Fixed a bug in the multiple directories hack in libs/pakstuff.cc - Finished the filter in the texture window - The wait cursor is now correctly set in the XY window - Added replacements for gluPerspective and gluLookAt - Textures can now be stored in 2 places: * The path pointed by "texturepath" (defaults to ~/.q3a/baseq3/textures, but can be changed in the project settings) * The base texture path (/baseq3/textures) - Radiant and the q3map tool now looks for shaders in ~/.q3a/baseq3/shaderlist.txt and /baseq3/scripts/shaderlist.txt 18/05/2000 - Plugin menu fixes - Created a simple text editor to edit the shaders (instead of calling an external program) - Copy and paste now work - Fixed some bugs with the MRU menu - Some menu items are now enabled/disabled correctly in MainFrame::RoutineProcessing () - Added a new command line option (--cdpath) to set the CD-ROM path - Fixed some bugs in the entity window, now it's possible to add/edit/remove properties - New directory paths: * maps now default to ~/.q3a/baseq3/maps * autosave files are saved in ~/.q3a/baseq3/maps * .pk3 files can be in ~/.q3a/baseq3, /baseq3 and in the CD-ROM 17/05/2000 - Fixed bug deselecting a brush after the surface dialog is open - hide cursor when right-dragging XYWnd - files saved to /tmp are now saved in ~/.q3a/radiant - Disabled undo - Fixed a bug in FillTextureMenu - User can now correctly change the accelerators at run-time - Accelerators are read from ~/.q3a/radiant/radiant.ini 16/05/2000 - Finished the patch inspector - Finished the texture toolbar - more small bug fixes 11/05/2000 - Finished the GroupDlg stuff - Added support to read pak files from the Quake3 CD-ROM - moved /tmp/paklog.txt to ~/.q3a/radiant/paklog - added functions to replace GetKeyState and SetCursorPos - fixed the command key handlers for the mainwindow DarkRadiant-2.0.2/Doxyfile000066400000000000000000001515111245424655700154270ustar00rootroot00000000000000# Doxyfile 1.5.3 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file that # follow. The default is UTF-8 which is also the encoding used for all text before # the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into # libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of # possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = DarkRadiant # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = dox # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = YES # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, # Italian, Japanese, Japanese-en (Japanese with English messages), Korean, # Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, # Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to # include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be extracted # and appear in the documentation as a namespace called 'anonymous_namespace{file}', # where file will be replaced with the base name of the file that contains the anonymous # namespace. By default anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = NO # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = include libs radiant plugins # This tag can be used to specify the character encoding of the source files that # doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default # input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. # See http://www.gnu.org/software/libiconv for the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = plugins/dm.d3hook/boost \ plugins/dm.d3hook/RCF \ plugins/dm.d3hook/SF # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the output. # The symbol name can be a fully qualified name, a word, or if the wildcard * is used, # a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH # then you must also enable this option. If you don't then doxygen will produce # a warning and turn it on anyway SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to # produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to # specify the directory where the mscgen tool resides. If left empty the tool is assumed to # be found in the default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = NO # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = NO # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = NO # If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will # generate a caller dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected # functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = NO # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the number # of direct children of the root node in a graph is already larger than # MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO DarkRadiant-2.0.2/GPL000066400000000000000000000431331245424655700142660ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. DarkRadiant-2.0.2/LGPL000066400000000000000000000575051245424655700144120ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS DarkRadiant-2.0.2/LICENSE000066400000000000000000000016701245424655700147260ustar00rootroot00000000000000LICENSE ( last update: Wed Feb 8 17:16:40 CST 2006 ) ----------------------------------------------------- There are 3 license types used throughout GtkRadiant source code. BSD - modified Berkeley Software Distribution license ( each BSD licensed source file starts with the appropriate header ) LGPL - GNU Lesser General Public License v2.1 ( see LGPL at the root of the tree ) GPL - GNU General Public License ( see GPL at the root of the tree ) How do I check which license applies to a given part of the source code? Each source file in the tree comes with a license header which explains what license applies. To sum up shortly: GPL: ( except some files contributed by Loki Software under BSD license ) GtkRadiant Core GtkRadiant Modules GtkRadiant Libraries Quake III Tools Quake II Tools Background2D Plugin HydraToolz Plugin BSD: JPEG Library MD5 Library DDS Library PicoModel Library PrtView Plugin LGPL BobToolz Plugin GenSurf Plugin DarkRadiant-2.0.2/Makefile.am000066400000000000000000000024571245424655700157610ustar00rootroot00000000000000ACLOCAL_AMFLAGS = -I m4 SUBDIRS = libs radiant plugins install/i18n # Install data and stuff gamedir = $(pkgdatadir)/games game_DATA = $(top_srcdir)/install/games/*.game bitmapsdir = $(pkgdatadir)/bitmaps bitmaps_DATA = $(top_srcdir)/install/bitmaps/* applicationsdir = $(datadir)/applications applications_DATA = $(top_builddir)/install/darkradiant.desktop # Install XML config files pkgdata_DATA = $(top_srcdir)/install/colours.xml \ $(top_srcdir)/install/commandsystem.xml \ $(top_srcdir)/install/user.xml \ $(top_srcdir)/install/menu.xml \ $(top_srcdir)/install/input.xml \ $(top_srcdir)/install/debug.xml # Install GL programs glprogsdir = $(pkgdatadir)/gl glprogs_DATA = $(top_srcdir)/install/gl/* # Install fonts fontsdir = $(pkgdatadir)/ui/fonts fonts_DATA = $(top_srcdir)/install/ui/fonts/* # Install UI files uifilesdir = $(pkgdatadir)/ui uifiles_DATA = $(top_srcdir)/install/ui/*.xrc # Install python scripts scriptsdir = $(pkglibdir)/scripts scripts_DATA = $(top_srcdir)/install/scripts/*.py commandsdir = $(scriptsdir)/commands commands_DATA = $(top_srcdir)/install/scripts/commands/*.py # Install sourceviewer synax and colour files #sourceviewerdir = $(pkglibdir)/sourceviewer #sourceviewer_DATA = $(top_srcdir)/install/sourceviewer/* EXTRA_DIST = config.rpath DarkRadiant-2.0.2/Makefile.in000066400000000000000000001147231245424655700157720ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in \ $(top_srcdir)/install/darkradiant.desktop.in AUTHORS ChangeLog \ NEWS README compile config.guess config.rpath config.sub \ depcomp install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = install/darkradiant.desktop CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(applicationsdir)" \ "$(DESTDIR)$(bitmapsdir)" "$(DESTDIR)$(commandsdir)" \ "$(DESTDIR)$(fontsdir)" "$(DESTDIR)$(gamedir)" \ "$(DESTDIR)$(glprogsdir)" "$(DESTDIR)$(pkgdatadir)" \ "$(DESTDIR)$(scriptsdir)" "$(DESTDIR)$(uifilesdir)" DATA = $(applications_DATA) $(bitmaps_DATA) $(commands_DATA) \ $(fonts_DATA) $(game_DATA) $(glprogs_DATA) $(pkgdata_DATA) \ $(scripts_DATA) $(uifiles_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = libs radiant plugins install/i18n # Install data and stuff gamedir = $(pkgdatadir)/games game_DATA = $(top_srcdir)/install/games/*.game bitmapsdir = $(pkgdatadir)/bitmaps bitmaps_DATA = $(top_srcdir)/install/bitmaps/* applicationsdir = $(datadir)/applications applications_DATA = $(top_builddir)/install/darkradiant.desktop # Install XML config files pkgdata_DATA = $(top_srcdir)/install/colours.xml \ $(top_srcdir)/install/commandsystem.xml \ $(top_srcdir)/install/user.xml \ $(top_srcdir)/install/menu.xml \ $(top_srcdir)/install/input.xml \ $(top_srcdir)/install/debug.xml # Install GL programs glprogsdir = $(pkgdatadir)/gl glprogs_DATA = $(top_srcdir)/install/gl/* # Install fonts fontsdir = $(pkgdatadir)/ui/fonts fonts_DATA = $(top_srcdir)/install/ui/fonts/* # Install UI files uifilesdir = $(pkgdatadir)/ui uifiles_DATA = $(top_srcdir)/install/ui/*.xrc # Install python scripts scriptsdir = $(pkglibdir)/scripts scripts_DATA = $(top_srcdir)/install/scripts/*.py commandsdir = $(scriptsdir)/commands commands_DATA = $(top_srcdir)/install/scripts/commands/*.py # Install sourceviewer synax and colour files #sourceviewerdir = $(pkglibdir)/sourceviewer #sourceviewer_DATA = $(top_srcdir)/install/sourceviewer/* EXTRA_DIST = config.rpath all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install/darkradiant.desktop: $(top_builddir)/config.status $(top_srcdir)/install/darkradiant.desktop.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-applicationsDATA: $(applications_DATA) @$(NORMAL_INSTALL) @list='$(applications_DATA)'; test -n "$(applicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(applicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(applicationsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(applicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(applicationsdir)" || exit $$?; \ done uninstall-applicationsDATA: @$(NORMAL_UNINSTALL) @list='$(applications_DATA)'; test -n "$(applicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(applicationsdir)'; $(am__uninstall_files_from_dir) install-bitmapsDATA: $(bitmaps_DATA) @$(NORMAL_INSTALL) @list='$(bitmaps_DATA)'; test -n "$(bitmapsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bitmapsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bitmapsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(bitmapsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(bitmapsdir)" || exit $$?; \ done uninstall-bitmapsDATA: @$(NORMAL_UNINSTALL) @list='$(bitmaps_DATA)'; test -n "$(bitmapsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(bitmapsdir)'; $(am__uninstall_files_from_dir) install-commandsDATA: $(commands_DATA) @$(NORMAL_INSTALL) @list='$(commands_DATA)'; test -n "$(commandsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(commandsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(commandsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(commandsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(commandsdir)" || exit $$?; \ done uninstall-commandsDATA: @$(NORMAL_UNINSTALL) @list='$(commands_DATA)'; test -n "$(commandsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(commandsdir)'; $(am__uninstall_files_from_dir) install-fontsDATA: $(fonts_DATA) @$(NORMAL_INSTALL) @list='$(fonts_DATA)'; test -n "$(fontsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(fontsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(fontsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(fontsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(fontsdir)" || exit $$?; \ done uninstall-fontsDATA: @$(NORMAL_UNINSTALL) @list='$(fonts_DATA)'; test -n "$(fontsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(fontsdir)'; $(am__uninstall_files_from_dir) install-gameDATA: $(game_DATA) @$(NORMAL_INSTALL) @list='$(game_DATA)'; test -n "$(gamedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(gamedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(gamedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(gamedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(gamedir)" || exit $$?; \ done uninstall-gameDATA: @$(NORMAL_UNINSTALL) @list='$(game_DATA)'; test -n "$(gamedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(gamedir)'; $(am__uninstall_files_from_dir) install-glprogsDATA: $(glprogs_DATA) @$(NORMAL_INSTALL) @list='$(glprogs_DATA)'; test -n "$(glprogsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(glprogsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(glprogsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(glprogsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(glprogsdir)" || exit $$?; \ done uninstall-glprogsDATA: @$(NORMAL_UNINSTALL) @list='$(glprogs_DATA)'; test -n "$(glprogsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(glprogsdir)'; $(am__uninstall_files_from_dir) install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) install-scriptsDATA: $(scripts_DATA) @$(NORMAL_INSTALL) @list='$(scripts_DATA)'; test -n "$(scriptsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(scriptsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(scriptsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(scriptsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(scriptsdir)" || exit $$?; \ done uninstall-scriptsDATA: @$(NORMAL_UNINSTALL) @list='$(scripts_DATA)'; test -n "$(scriptsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(scriptsdir)'; $(am__uninstall_files_from_dir) install-uifilesDATA: $(uifiles_DATA) @$(NORMAL_INSTALL) @list='$(uifiles_DATA)'; test -n "$(uifilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(uifilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(uifilesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(uifilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(uifilesdir)" || exit $$?; \ done uninstall-uifilesDATA: @$(NORMAL_UNINSTALL) @list='$(uifiles_DATA)'; test -n "$(uifilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(uifilesdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(applicationsdir)" "$(DESTDIR)$(bitmapsdir)" "$(DESTDIR)$(commandsdir)" "$(DESTDIR)$(fontsdir)" "$(DESTDIR)$(gamedir)" "$(DESTDIR)$(glprogsdir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(scriptsdir)" "$(DESTDIR)$(uifilesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-applicationsDATA install-bitmapsDATA \ install-commandsDATA install-fontsDATA install-gameDATA \ install-glprogsDATA install-pkgdataDATA install-scriptsDATA \ install-uifilesDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-applicationsDATA uninstall-bitmapsDATA \ uninstall-commandsDATA uninstall-fontsDATA uninstall-gameDATA \ uninstall-glprogsDATA uninstall-pkgdataDATA \ uninstall-scriptsDATA uninstall-uifilesDATA .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-generic \ distclean-hdr distclean-libtool distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-applicationsDATA \ install-bitmapsDATA install-commandsDATA install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-fontsDATA install-gameDATA \ install-glprogsDATA install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgdataDATA install-ps install-ps-am \ install-scriptsDATA install-strip install-uifilesDATA \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-applicationsDATA \ uninstall-bitmapsDATA uninstall-commandsDATA \ uninstall-fontsDATA uninstall-gameDATA uninstall-glprogsDATA \ uninstall-pkgdataDATA uninstall-scriptsDATA \ uninstall-uifilesDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/NEWS000066400000000000000000000000001245424655700144020ustar00rootroot00000000000000DarkRadiant-2.0.2/README000066400000000000000000000053051245424655700146000ustar00rootroot00000000000000DarkRadiant =========== DarkRadiant is a level (map) editor for the The Dark Mod, an open-source Doom 3 modification which is available at http://www.thedarkmod.com Compiling on Windows ==================== Prerequisites ------------- DarkRadiant is built on Windows using Microsoft Visual C++ 2013. The free Express version can be obtained here: VC++ 2013: http://www.visualstudio.com/de-de/downloads (Choose Visual Studio Express 2013 for Windows Desktop) Since DarkRadiant uses a couple of open-source libraries that are not available on Windows by default, you will also need to download and install the dependencies. 7-Zip packages of the dependencies are available at the following URL(s). (Get 7-zip here: http://www.7-zip.org/) 32-bit only builds: https://github.com/codereader/DarkRadiant/releases/download/2.0.0/w32deps.7z 64-bit builds: https://github.com/codereader/DarkRadiant/releases/download/2.0.0/w32deps.7z https://github.com/codereader/DarkRadiant/releases/download/2.0.0/w64deps.7z Note that 64-bit builds need the 32-bit dependencies in addition to their own 64-bit dependencies. The dependencies packages need to be extracted into the main DarkRadiant source directory, i.e. alongside the include/ and radiant/ directories. Build ----- The main Visual C++ solution file is: Visual Studio 2013: tools/msvc2013/DarkRadiant.sln Open this file with Visual Studio and start a build by right-clicking on the top-level "Solution 'DarkRadiant'" item and choosing Build Solution. Compiling on Linux ================== Prerequisites ------------- To compile DarkRadiant, a number of libraries (with development headers) are required. On an Ubuntu system, the requirements may include any or all of the following packages: zlib1g-dev libjpeg62-dev libwxgtk3.0-dev libxml2-dev libsigc++-2.0-dev libpng12-dev ftgl-dev libglew-dev libboost-dev libboost-regex-dev libboost-filesystem-dev libboost-python-dev libboost-test-dev libalut-dev libvorbis-dev python-dev This does not include core development tools such as g++ or the git client to download the sources (use sudo apt-get install git for that). One possible set of packages might be: sudo apt-get install git automake libtool g++ Build ----- To build DarkRadiant the standard Autotools build process is used: $ ./configure $ make $ sudo make install The available configure options are listed with "./configure --help". There are options for debug builds, and enabling or disabling various optional components such as audio support and the Dark Mod-specific plugins. More Information ================ A more detailed compilation guide can be found on The Dark Mod's wiki: http://wiki.thedarkmod.com/index.php?title=DarkRadiant_-_Compilation_Guide DarkRadiant-2.0.2/aclocal.m4000066400000000000000000001451411245424655700155630ustar00rootroot00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # intlmacosx.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2004-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on Mac OS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in Mac OS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFPreferencesCopyAppValue(NULL, NULL)]])], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in Mac OS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFLocaleCopyCurrent();]])], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check for 'mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl FIXME we are no longer going to remove this! adjust warning dnl FIXME message accordingly. AC_DIAGNOSE([obsolete], [$0: this macro is deprecated, and will soon be removed. You should use the Autoconf-provided 'AC][_PROG_MKDIR_P' macro instead, and use '$(MKDIR_P)' instead of '$(mkdir_p)'in your Makefile.am files.]) dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/boost.m4]) m4_include([m4/gettext.m4]) m4_include([m4/iconv.m4]) m4_include([m4/lib-ld.m4]) m4_include([m4/lib-link.m4]) m4_include([m4/lib-prefix.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/nls.m4]) m4_include([m4/po.m4]) m4_include([m4/progtest.m4]) m4_include([m4/wxwin.m4]) DarkRadiant-2.0.2/autogen.sh000077500000000000000000000001571245424655700157210ustar00rootroot00000000000000#!/bin/sh aclocal -I m4 libtoolize --force --copy autoheader autoconf automake --add-missing --copy --foreign DarkRadiant-2.0.2/compile000066400000000000000000000162451245424655700153000ustar00rootroot00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: DarkRadiant-2.0.2/config.guess000077500000000000000000001270611245424655700162440ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2007-07-22' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa:Linux:*:*) echo xtensa-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: DarkRadiant-2.0.2/config.h.in000066400000000000000000000065431245424655700157500ustar00rootroot00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Defined if the requested minimum BOOST version is satisfied */ #undef HAVE_BOOST /* Define to 1 if you have */ #undef HAVE_BOOST_BIND_HPP /* Define to 1 if you have */ #undef HAVE_BOOST_FILESYSTEM_PATH_HPP /* Define to 1 if you have */ #undef HAVE_BOOST_FOREACH_HPP /* Define to 1 if you have */ #undef HAVE_BOOST_FORMAT_HPP /* Define to 1 if you have */ #undef HAVE_BOOST_FUNCTION_HPP /* Define to 1 if you have */ #undef HAVE_BOOST_PYTHON_HPP /* Define to 1 if you have */ #undef HAVE_BOOST_REGEX_HPP /* Define to 1 if you have */ #undef HAVE_BOOST_SCOPED_PTR_HPP /* Define to 1 if you have */ #undef HAVE_BOOST_SHARED_PTR_HPP /* Define to 1 if you have */ #undef HAVE_BOOST_SYSTEM_ERROR_CODE_HPP /* Define to 1 if you have */ #undef HAVE_BOOST_TEST_UNIT_TEST_HPP /* Define to 1 if you have */ #undef HAVE_BOOST_TOKENIZER_HPP /* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION DarkRadiant-2.0.2/config.rpath000077500000000000000000000440121245424655700162260ustar00rootroot00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2010 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's _LT_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in ecc*) wl='-Wl,' ;; icc* | ifort*) wl='-Wl,' ;; lf95*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's _LT_LINKER_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix[4-9]*) library_names_spec='$libname$shrext' ;; amigaos*) library_names_spec='$libname.a' ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32* | cegcc*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd1*) ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; nto-qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: DarkRadiant-2.0.2/configure000077500000000000000000026534111245424655700156400ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for darkradiant 2.0.1-1. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='darkradiant' PACKAGE_TARNAME='darkradiant' PACKAGE_VERSION='2.0.1-1' PACKAGE_STRING='darkradiant 2.0.1-1' PACKAGE_BUGREPORT='' PACKAGE_URL='' gt_needs= # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS AL_LIBS VORBIS_LIBS ALUT_LIBS sound_module DL_LIBS PYTHON_LIBS script_module BOOST_PYTHON_LDPATH BOOST_PYTHON_LIBS BOOST_PYTHON_LDFLAGS BOOST_PYTHON_CPPFLAGS PYTHON_CONFIG BOOST_UNIT_TEST_FRAMEWORK_LIBS BOOST_UNIT_TEST_FRAMEWORK_LDPATH BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS BOOST_FILESYSTEM_LIBS BOOST_FILESYSTEM_LDPATH BOOST_FILESYSTEM_LDFLAGS BOOST_SYSTEM_LIBS BOOST_SYSTEM_LDPATH BOOST_SYSTEM_LDFLAGS BOOST_REGEX_LIBS BOOST_LDPATH BOOST_REGEX_LDPATH BOOST_REGEX_LDFLAGS BOOST_CPPFLAGS DISTCHECK_CONFIGURE_FLAGS BOOST_ROOT GLU_LIBS GL_LIBS GLEW_LIBS FTGL_LIBS FTGL_CFLAGS PNG_LIBS PNG_CFLAGS LIBSIGC_LIBS LIBSIGC_CFLAGS XML_LIBS XML_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG WX_VERSION_MICRO WX_VERSION_MINOR WX_VERSION_MAJOR WX_RESCOMP WX_VERSION WX_LIBS_STATIC WX_LIBS WX_CXXFLAGS_ONLY WX_CFLAGS_ONLY WX_CXXFLAGS WX_CFLAGS WX_CPPFLAGS WX_CONFIG_PATH JPEG_LIBS Z_LIBS editing_plugin gui_plugin conv_plugin difficulty_plugin obj_plugin sr_plugin CXXCPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP SED LIBTOOL am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS EGREP GREP CPP host_os host_vendor host_cpu host build_os build_vendor build_cpu build am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC XGETTEXT_EXTRA_OPTIONS MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_015 MSGFMT_015 GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_nls enable_dependency_tracking with_gnu_ld enable_rpath with_libiconv_prefix with_libintl_prefix enable_static enable_shared with_pic enable_fast_install with_sysroot enable_libtool_lock enable_debug enable_darkmod_plugins enable_python with_wxdir with_wx_config with_wx_prefix with_wx_exec_prefix with_boost enable_static_boost ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR XML_CFLAGS XML_LIBS LIBSIGC_CFLAGS LIBSIGC_LIBS PNG_CFLAGS PNG_LIBS FTGL_CFLAGS FTGL_LIBS BOOST_ROOT' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures darkradiant 2.0.1-1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/darkradiant] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of darkradiant 2.0.1-1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --disable-nls do not use Native Language Support --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-rpath do not hardcode runtime library paths --enable-static[=PKGS] build static libraries [default=no] --enable-shared[=PKGS] build shared libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-debug enable debug build --enable-darkmod-plugins build Dark Mod plugins such as S/R editor --disable-python disable Python scripting functionality --enable-static-boost Prefer the static boost libraries over the shared ones [no] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH --with-wx-config=CONFIG wx-config script to use (optional) --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional) --with-wx-exec-prefix=PREFIX Exec prefix where wxWidgets is installed (optional) --with-boost=DIR prefix of Boost 1.46.1 [guess] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path XML_CFLAGS C compiler flags for XML, overriding pkg-config XML_LIBS linker flags for XML, overriding pkg-config LIBSIGC_CFLAGS C compiler flags for LIBSIGC, overriding pkg-config LIBSIGC_LIBS linker flags for LIBSIGC, overriding pkg-config PNG_CFLAGS C compiler flags for PNG, overriding pkg-config PNG_LIBS linker flags for PNG, overriding pkg-config FTGL_CFLAGS C compiler flags for FTGL, overriding pkg-config FTGL_LIBS linker flags for FTGL, overriding pkg-config BOOST_ROOT Location of Boost installation Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF darkradiant configure 2.0.1-1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by darkradiant $as_me 2.0.1-1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs " # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='darkradiant' VERSION='2.0.1-1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' # Initialise Gettext mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } GETTEXT_MACRO_VERSION=0.18 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 $as_echo_n "checking for 64-bit host... " >&6; } if ${gl_cv_solaris_64bit+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _LP64 sixtyfour bits #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "sixtyfour bits" >/dev/null 2>&1; then : gl_cv_solaris_64bit=yes else gl_cv_solaris_64bit=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 $as_echo "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if eval \${$gt_func_gnugettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libc=yes" else eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes else am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= HAVE_LIBINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if eval \${$gt_func_gnugettext_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libintl=yes" else eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" # Save user flags USER_CFLAGS=$CFLAGS USER_CXXFLAGS=$CXXFLAGS USER_CPPFLAGS=$CPPFLAGS USER_LDFLAGS=$LDFLAGS # Setup and defaults ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=no fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: # Optional features # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; debug_build=$enableval else debug_build='no' fi # Check whether --enable-darkmod-plugins was given. if test "${enable_darkmod_plugins+set}" = set; then : enableval=$enable_darkmod_plugins; darkmod_plugins=$enableval else darkmod_plugins='no' fi # Check whether --enable-python was given. if test "${enable_python+set}" = set; then : enableval=$enable_python; python_scripting=$enableval else python_scripting='yes' fi if [ "$darkmod_plugins" != 'no' ] then # Enable conditional directories (used by plugins/Makefile.am) sr_plugin="dm.stimresponse" obj_plugin="dm.objectives" difficulty_plugin="dm.difficulty" conv_plugin="dm.conversation" gui_plugin="dm.gui" editing_plugin="dm.editing" fi # Check for required libraries # Zlib ac_fn_cxx_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : else as_fn_error $? "ZLib not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflateEnd in -lz" >&5 $as_echo_n "checking for inflateEnd in -lz... " >&6; } if ${ac_cv_lib_z_inflateEnd+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inflateEnd (); int main () { return inflateEnd (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_z_inflateEnd=yes else ac_cv_lib_z_inflateEnd=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflateEnd" >&5 $as_echo "$ac_cv_lib_z_inflateEnd" >&6; } if test "x$ac_cv_lib_z_inflateEnd" = xyes; then : Z_LIBS='-lz' else as_fn_error $? "ZLib not found" "$LINENO" 5 fi # JPEG ac_fn_cxx_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" if test "x$ac_cv_header_jpeglib_h" = xyes; then : else as_fn_error $? "libjpeg header not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_start_compress in -ljpeg" >&5 $as_echo_n "checking for jpeg_start_compress in -ljpeg... " >&6; } if ${ac_cv_lib_jpeg_jpeg_start_compress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jpeg_start_compress (); int main () { return jpeg_start_compress (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jpeg_jpeg_start_compress=yes else ac_cv_lib_jpeg_jpeg_start_compress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_start_compress" >&5 $as_echo "$ac_cv_lib_jpeg_jpeg_start_compress" >&6; } if test "x$ac_cv_lib_jpeg_jpeg_start_compress" = xyes; then : JPEG_LIBS='-ljpeg' else as_fn_error $? "libjpeg library not found" "$LINENO" 5 fi # wxWidgets # Check whether --with-wxdir was given. if test "${with_wxdir+set}" = set; then : withval=$with_wxdir; wx_config_name="$withval/wx-config" wx_config_args="--inplace" fi # Check whether --with-wx-config was given. if test "${with_wx_config+set}" = set; then : withval=$with_wx_config; wx_config_name="$withval" fi # Check whether --with-wx-prefix was given. if test "${with_wx_prefix+set}" = set; then : withval=$with_wx_prefix; wx_config_prefix="$withval" else wx_config_prefix="" fi # Check whether --with-wx-exec-prefix was given. if test "${with_wx_exec_prefix+set}" = set; then : withval=$with_wx_exec_prefix; wx_config_exec_prefix="$withval" else wx_config_exec_prefix="" fi if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi if test -x "$WX_CONFIG_NAME" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5 $as_echo_n "checking for wx-config... " >&6; } WX_CONFIG_PATH="$WX_CONFIG_NAME" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args. set dummy $WX_CONFIG_NAME; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_WX_CONFIG_PATH+:} false; then : $as_echo_n "(cached) " >&6 else case $WX_CONFIG_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy=""$WX_LOOKUP_PATH:$PATH"" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no" ;; esac fi WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH if test -n "$WX_CONFIG_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=3.0.0 if test -z "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version ()" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version ()... " >&6; } fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args " WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $wx_requested_major_version; then wx_ver_ok=yes else if test $wx_config_major_version -eq $wx_requested_major_version; then if test $wx_config_minor_version -gt $wx_requested_minor_version; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $wx_requested_minor_version; then if test $wx_config_micro_version -ge $wx_requested_micro_version; then wx_ver_ok=yes fi fi fi fi fi fi if test -n "$wx_ver_ok"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5 $as_echo "yes (version $WX_VERSION)" >&6; } WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs std,gl,stc` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5 $as_echo_n "checking for wxWidgets static library... " >&6; } WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs std,gl,stc 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags std,gl,stc` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags std,gl,stc` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags std,gl,stc` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags std,gl,stc` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi wxWin=1 else if test "x$WX_VERSION" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5 $as_echo "no (version $WX_VERSION is not new enough)" >&6; } fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" if test ! -z ""; then wx_error_message=" The configuration you asked for $PACKAGE_NAME requires a wxWidgets build with the following settings: but such build is not available. To see the wxWidgets builds available on this system, please use 'wx-config --list' command. To use the default build, returned by 'wx-config --selected-config', use the options with their 'auto' default values." fi wx_error_message=" The requested wxWidgets build couldn't be found. $wx_error_message If you still get this error, then check that 'wx-config' is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is 3.0.0 or above." wxWin=0 fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" wxWin=0 fi WX_VERSION_MAJOR="$wx_config_major_version" WX_VERSION_MINOR="$wx_config_minor_version" WX_VERSION_MICRO="$wx_config_micro_version" if test "$wxWin" != 1; then as_fn_error $? " wxWidgets must be installed on your system but wx-config script could not be found. Please check that wx-config is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is 2.3.4 or above. " "$LINENO" 5 fi # GTK etc if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML" >&5 $as_echo_n "checking for XML... " >&6; } if test -n "$XML_CFLAGS"; then pkg_cv_XML_CFLAGS="$XML_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XML_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$XML_LIBS"; then pkg_cv_XML_LIBS="$XML_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XML_LIBS=`$PKG_CONFIG --libs "libxml-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then XML_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libxml-2.0" 2>&1` else XML_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libxml-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$XML_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libxml-2.0) were not met: $XML_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables XML_CFLAGS and XML_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables XML_CFLAGS and XML_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else XML_CFLAGS=$pkg_cv_XML_CFLAGS XML_LIBS=$pkg_cv_XML_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBSIGC" >&5 $as_echo_n "checking for LIBSIGC... " >&6; } if test -n "$LIBSIGC_CFLAGS"; then pkg_cv_LIBSIGC_CFLAGS="$LIBSIGC_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sigc++-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "sigc++-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBSIGC_CFLAGS=`$PKG_CONFIG --cflags "sigc++-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBSIGC_LIBS"; then pkg_cv_LIBSIGC_LIBS="$LIBSIGC_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sigc++-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "sigc++-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBSIGC_LIBS=`$PKG_CONFIG --libs "sigc++-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBSIGC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sigc++-2.0" 2>&1` else LIBSIGC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sigc++-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBSIGC_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (sigc++-2.0) were not met: $LIBSIGC_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBSIGC_CFLAGS and LIBSIGC_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBSIGC_CFLAGS and LIBSIGC_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBSIGC_CFLAGS=$pkg_cv_LIBSIGC_CFLAGS LIBSIGC_LIBS=$pkg_cv_LIBSIGC_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG" >&5 $as_echo_n "checking for PNG... " >&6; } if test -n "$PNG_CFLAGS"; then pkg_cv_PNG_CFLAGS="$PNG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_CFLAGS=`$PKG_CONFIG --cflags "libpng" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PNG_LIBS"; then pkg_cv_PNG_LIBS="$PNG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_LIBS=`$PKG_CONFIG --libs "libpng" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpng" 2>&1` else PNG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpng" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PNG_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpng) were not met: $PNG_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PNG_CFLAGS and PNG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PNG_CFLAGS and PNG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else PNG_CFLAGS=$pkg_cv_PNG_CFLAGS PNG_LIBS=$pkg_cv_PNG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FTGL" >&5 $as_echo_n "checking for FTGL... " >&6; } if test -n "$FTGL_CFLAGS"; then pkg_cv_FTGL_CFLAGS="$FTGL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ftgl\""; } >&5 ($PKG_CONFIG --exists --print-errors "ftgl") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FTGL_CFLAGS=`$PKG_CONFIG --cflags "ftgl" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FTGL_LIBS"; then pkg_cv_FTGL_LIBS="$FTGL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ftgl\""; } >&5 ($PKG_CONFIG --exists --print-errors "ftgl") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FTGL_LIBS=`$PKG_CONFIG --libs "ftgl" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FTGL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ftgl" 2>&1` else FTGL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ftgl" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FTGL_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (ftgl) were not met: $FTGL_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables FTGL_CFLAGS and FTGL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables FTGL_CFLAGS and FTGL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else FTGL_CFLAGS=$pkg_cv_FTGL_CFLAGS FTGL_LIBS=$pkg_cv_FTGL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # GTKSourceView #PKG_CHECK_MODULES([GTKSOURCEVIEWMM], # [gtksourceviewmm-2.0], # [AC_DEFINE([HAVE_GTKSOURCEVIEW], # [], # [Define if GtkSourceView is available])], # [true]) # GLEW ac_fn_cxx_check_header_mongrel "$LINENO" "GL/glew.h" "ac_cv_header_GL_glew_h" "$ac_includes_default" if test "x$ac_cv_header_GL_glew_h" = xyes; then : else as_fn_error $? "GLEW not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lGLEW" >&5 $as_echo_n "checking for main in -lGLEW... " >&6; } if ${ac_cv_lib_GLEW_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGLEW $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_GLEW_main=yes else ac_cv_lib_GLEW_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLEW_main" >&5 $as_echo "$ac_cv_lib_GLEW_main" >&6; } if test "x$ac_cv_lib_GLEW_main" = xyes; then : GLEW_LIBS='-lGLEW' else as_fn_error $? "GLEW not found" "$LINENO" 5 fi # OpenGL and GLU { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lGL" >&5 $as_echo_n "checking for main in -lGL... " >&6; } if ${ac_cv_lib_GL_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_GL_main=yes else ac_cv_lib_GL_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_main" >&5 $as_echo "$ac_cv_lib_GL_main" >&6; } if test "x$ac_cv_lib_GL_main" = xyes; then : GL_LIBS='-lGL' else as_fn_error $? "GL library not found." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluBuild2DMipmaps in -lGLU" >&5 $as_echo_n "checking for gluBuild2DMipmaps in -lGLU... " >&6; } if ${ac_cv_lib_GLU_gluBuild2DMipmaps+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGLU $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gluBuild2DMipmaps (); int main () { return gluBuild2DMipmaps (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_GLU_gluBuild2DMipmaps=yes else ac_cv_lib_GLU_gluBuild2DMipmaps=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluBuild2DMipmaps" >&5 $as_echo "$ac_cv_lib_GLU_gluBuild2DMipmaps" >&6; } if test "x$ac_cv_lib_GLU_gluBuild2DMipmaps" = xyes; then : GLU_LIBS="-lGLU" else as_fn_error $? "GLU library not found." "$LINENO" 5 fi # Boost echo "$as_me: this is boost.m4 serial 16" >&5 boost_save_IFS=$IFS boost_version_req=1.46.1 IFS=. set x $boost_version_req 0 0 0 IFS=$boost_save_IFS shift boost_version_req=`expr "$1" '*' 100000 + "$2" '*' 100 + "$3"` boost_version_req_string=$1.$2.$3 # Check whether --with-boost was given. if test "${with_boost+set}" = set; then : withval=$with_boost; fi # If BOOST_ROOT is set and the user has not provided a value to # --with-boost, then treat BOOST_ROOT as if it the user supplied it. if test x"$BOOST_ROOT" != x; then if test x"$with_boost" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: Detected BOOST_ROOT; continuing with --with-boost=$BOOST_ROOT" >&5 $as_echo "$as_me: Detected BOOST_ROOT; continuing with --with-boost=$BOOST_ROOT" >&6;} with_boost=$BOOST_ROOT else { $as_echo "$as_me:${as_lineno-$LINENO}: Detected BOOST_ROOT=$BOOST_ROOT, but overridden by --with-boost=$with_boost" >&5 $as_echo "$as_me: Detected BOOST_ROOT=$BOOST_ROOT, but overridden by --with-boost=$with_boost" >&6;} fi fi DISTCHECK_CONFIGURE_FLAGS="$DISTCHECK_CONFIGURE_FLAGS '--with-boost=$with_boost'" boost_save_CPPFLAGS=$CPPFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boost headers version >= $boost_version_req_string" >&5 $as_echo_n "checking for Boost headers version >= $boost_version_req_string... " >&6; } if ${boost_cv_inc_path+:} false; then : $as_echo_n "(cached) " >&6 else boost_cv_inc_path=no ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if !defined BOOST_VERSION # error BOOST_VERSION is not defined #elif BOOST_VERSION < $boost_version_req # error Boost headers version < $boost_version_req #endif int main () { ; return 0; } _ACEOF # If the user provided a value to --with-boost, use it and only it. case $with_boost in #( ''|yes) set x '' /opt/local/include /usr/local/include /opt/include \ /usr/include C:/Boost/include;; #( *) set x "$with_boost/include" "$with_boost";; esac shift for boost_dir do # Without --layout=system, Boost (or at least some versions) installs # itself in /include/boost-. This inner loop helps to # find headers in such directories. # # Any ${boost_dir}/boost-x_xx directories are searched in reverse version # order followed by ${boost_dir}. The final '.' is a sentinel for # searching $boost_dir" itself. Entries are whitespace separated. # # I didn't indent this loop on purpose (to avoid over-indented code) boost_layout_system_search_list=`cd "$boost_dir" 2>/dev/null \ && ls -1 | "${GREP}" '^boost-' | sort -rn -t- -k2 \ && echo .` for boost_inc in $boost_layout_system_search_list do if test x"$boost_inc" != x.; then boost_inc="$boost_dir/$boost_inc" else boost_inc="$boost_dir" # Uses sentinel in boost_layout_system_search_list fi if test x"$boost_inc" != x; then # We are going to check whether the version of Boost installed # in $boost_inc is usable by running a compilation that # #includes it. But if we pass a -I/some/path in which Boost # is not installed, the compiler will just skip this -I and # use other locations (either from CPPFLAGS, or from its list # of system include directories). As a result we would use # header installed on the machine instead of the /some/path # specified by the user. So in that precise case (trying # $boost_inc), make sure the version.hpp exists. # # Use test -e as there can be symlinks. test -e "$boost_inc/boost/version.hpp" || continue CPPFLAGS="$CPPFLAGS -I$boost_inc" fi if ac_fn_cxx_try_compile "$LINENO"; then : boost_cv_inc_path=yes else boost_cv_version=no fi rm -f core conftest.err conftest.$ac_objext if test x"$boost_cv_inc_path" = xyes; then if test x"$boost_inc" != x; then boost_cv_inc_path=$boost_inc fi break 2 fi done done ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_inc_path" >&5 $as_echo "$boost_cv_inc_path" >&6; } case $boost_cv_inc_path in #( no) boost_errmsg="cannot find Boost headers version >= $boost_version_req_string" as_fn_error $? "$boost_errmsg" "$LINENO" 5 ;;#( yes) BOOST_CPPFLAGS= ;;#( *) BOOST_CPPFLAGS="-I$boost_cv_inc_path" ;; esac if test x"$boost_cv_inc_path" != xno; then $as_echo "#define HAVE_BOOST 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boost's header version" >&5 $as_echo_n "checking for Boost's header version... " >&6; } if ${boost_cv_lib_version+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include boost-lib-version = BOOST_LIB_VERSION _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | tr -d '\r' | $SED -n -e "/^boost-lib-version = /{s///;s/\"//g;p;q;}" >conftest.i 2>&1; then : boost_cv_lib_version=`cat conftest.i` fi rm -rf conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_version" >&5 $as_echo "$boost_cv_lib_version" >&6; } # e.g. "134" for 1_34_1 or "135" for 1_35 boost_major_version=`echo "$boost_cv_lib_version" | sed 's/_//;s/_.*//'` case $boost_major_version in #( '' | *[!0-9]*) as_fn_error $? "invalid value: boost_major_version=$boost_major_version" "$LINENO" 5 ;; esac fi CPPFLAGS=$boost_save_CPPFLAGS # Check a load of common headers we use if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/bind.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/bind.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/bind.hpp" "ac_cv_header_boost_bind_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_bind_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_BIND_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/bind.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/foreach.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/foreach.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/foreach.hpp" "ac_cv_header_boost_foreach_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_foreach_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_FOREACH_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/foreach.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/format.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/format.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/format.hpp" "ac_cv_header_boost_format_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_format_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_FORMAT_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/format.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/function.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/function.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/function.hpp" "ac_cv_header_boost_function_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_function_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_FUNCTION_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/function.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/scoped_ptr.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/scoped_ptr.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/scoped_ptr.hpp" "ac_cv_header_boost_scoped_ptr_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_scoped_ptr_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_SCOPED_PTR_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/scoped_ptr.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/shared_ptr.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/shared_ptr.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/shared_ptr.hpp" "ac_cv_header_boost_shared_ptr_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_shared_ptr_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_SHARED_PTR_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/shared_ptr.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/tokenizer.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/tokenizer.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/tokenizer.hpp" "ac_cv_header_boost_tokenizer_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_tokenizer_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_TOKENIZER_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/tokenizer.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi # These ones require libraries too { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the toolset name used by Boost for $CXX" >&5 $as_echo_n "checking for the toolset name used by Boost for $CXX... " >&6; } if ${boost_cv_lib_tag+:} false; then : $as_echo_n "(cached) " >&6 else boost_cv_lib_tag=unknown if test x$boost_cv_inc_path != xno; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # The following tests are mostly inspired by boost/config/auto_link.hpp # The list is sorted to most recent/common to oldest compiler (in order # to increase the likelihood of finding the right compiler with the # least number of compilation attempt). # Beware that some tests are sensible to the order (for instance, we must # look for MinGW before looking for GCC3). # I used one compilation test per compiler with a #error to recognize # each compiler so that it works even when cross-compiling (let me know # if you know a better approach). # Known missing tags (known from Boost's tools/build/v2/tools/common.jam): # como, edg, kcc, bck, mp, sw, tru, xlc # I'm not sure about my test for `il' (be careful: Intel's ICC pre-defines # the same defines as GCC's). for i in \ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 6 && !defined __ICC @ gcc46" \ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 5 && !defined __ICC @ gcc45" \ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 4 && !defined __ICC @ gcc44" \ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 3 && !defined __ICC @ gcc43" \ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && !defined __ICC @ gcc42" \ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 1 && !defined __ICC @ gcc41" \ "defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ == 0 && !defined __ICC @ gcc40" \ "defined __GNUC__ && __GNUC__ == 3 && !defined __ICC \ && (defined WIN32 || defined WINNT || defined _WIN32 || defined __WIN32 \ || defined __WIN32__ || defined __WINNT || defined __WINNT__) @ mgw" \ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 4 && !defined __ICC @ gcc34" \ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 3 && !defined __ICC @ gcc33" \ "defined _MSC_VER && _MSC_VER >= 1500 @ vc90" \ "defined _MSC_VER && _MSC_VER == 1400 @ vc80" \ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 2 && !defined __ICC @ gcc32" \ "defined _MSC_VER && _MSC_VER == 1310 @ vc71" \ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 1 && !defined __ICC @ gcc31" \ "defined __GNUC__ && __GNUC__ == 3 && __GNUC_MINOR__ == 0 && !defined __ICC @ gcc30" \ "defined __BORLANDC__ @ bcb" \ "defined __ICC && (defined __unix || defined ) @ il" \ "defined __ICL @ iw" \ "defined _MSC_VER && _MSC_VER == 1300 @ vc7" \ "defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ == 95 && !defined __ICC @ gcc295" \ "defined __MWERKS__ && __MWERKS__ <= 0x32FF @ cw9" \ "defined _MSC_VER && _MSC_VER < 1300 && !defined UNDER_CE @ vc6" \ "defined _MSC_VER && _MSC_VER < 1300 && defined UNDER_CE @ evc4" \ "defined __MWERKS__ && __MWERKS__ <= 0x31FF @ cw8" do boost_tag_test=`expr "X$i" : 'X\([^@]*\) @ '` boost_tag=`expr "X$i" : 'X[^@]* @ \(.*\)'` cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if $boost_tag_test /* OK */ #else # error $boost_tag_test #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : boost_cv_lib_tag=$boost_tag; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu case $boost_cv_lib_tag in #( # Some newer (>= 1.35?) versions of Boost seem to only use "gcc" as opposed # to "gcc41" for instance. *-gcc | *'-gcc ') :;; #( Don't re-add -gcc: it's already in there. gcc*) boost_tag_x= case $host_os in #( darwin*) if test $boost_major_version -ge 136; then # The `x' added in r46793 of Boost. boost_tag_x=x fi;; esac # We can specify multiple tags in this variable because it's used by # BOOST_FIND_LIB that does a `for tag in -$boost_cv_lib_tag' ... boost_cv_lib_tag="$boost_tag_x$boost_cv_lib_tag -${boost_tag_x}gcc" ;; #( unknown) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not figure out which toolset name to use for $CXX" >&5 $as_echo "$as_me: WARNING: could not figure out which toolset name to use for $CXX" >&2;} boost_cv_lib_tag= ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_tag" >&5 $as_echo "$boost_cv_lib_tag" >&6; } # Check whether --enable-static-boost was given. if test "${enable_static_boost+set}" = set; then : enableval=$enable_static_boost; enable_static_boost=yes else enable_static_boost=no fi # Check whether we do better use `mt' even though we weren't ask to. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined _REENTRANT || defined _MT || defined __MT__ /* use -mt */ #else # error MT not needed #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : boost_guess_use_mt=: else boost_guess_use_mt=false fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost regex library" >&5 $as_echo "$as_me: Boost not available, not searching for the Boost regex library" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/regex.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/regex.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/regex.hpp" "ac_cv_header_boost_regex_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_regex_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_REGEX_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/regex.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" # Now let's try to find the library. The algorithm is as follows: first look # for a given library name according to the user's PREFERRED-RT-OPT. For each # library name, we prefer to use the ones that carry the tag (toolset name). # Each library is searched through the various standard paths were Boost is # usually installed. If we can't find the standard variants, we try to # enforce -mt (for instance on MacOSX, libboost_threads.dylib doesn't exist # but there's -obviously- libboost_threads-mt.dylib). { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the Boost regex library" >&5 $as_echo_n "checking for the Boost regex library... " >&6; } if ${boost_cv_lib_regex+:} false; then : $as_echo_n "(cached) " >&6 else boost_cv_lib_regex=no case "" in #( mt | mt-) boost_mt=-mt; boost_rtopt=;; #( mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #( *) boost_mt=; boost_rtopt=;; esac if test $enable_static_boost = yes; then boost_rtopt="s$boost_rtopt" fi # Find the proper debug variant depending on what we've been asked to find. case $boost_rtopt in #( *d*) boost_rt_d=$boost_rtopt;; #( *[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn') boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #( *) boost_rt_d='-d';; esac # If the PREFERRED-RT-OPT are not empty, prepend a `-'. test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt" $boost_guess_use_mt && boost_mt=-mt # Look for the abs path the static archive. # $libext is computed by Libtool but let's make sure it's non empty. test -z "$libext" && as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5 boost_save_ac_objext=$ac_objext # Generate the test file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { boost::regex exp("*"); boost::regex_match("foo", exp); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_objext=do_not_rm_me_plz else as_fn_error $? "cannot compile a test that uses Boost regex" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext ac_objext=$boost_save_ac_objext boost_failed_libs= # Don't bother to ident the 6 nested for loops, only the 2 innermost ones # matter. for boost_tag_ in -$boost_cv_lib_tag ''; do for boost_ver_ in -$boost_cv_lib_version ''; do for boost_mt_ in $boost_mt -mt ''; do for boost_rtopt_ in $boost_rtopt '' -d; do for boost_lib in \ boost_regex$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \ boost_regex$boost_tag_$boost_rtopt_$boost_ver_ \ boost_regex$boost_tag_$boost_mt_$boost_ver_ \ boost_regex$boost_tag_$boost_ver_ do # Avoid testing twice the same lib case $boost_failed_libs in #( *@$boost_lib@*) continue;; esac # If with_boost is empty, we'll search in /lib first, which is not quite # right so instead we'll try to a location based on where the headers are. boost_tmp_lib=$with_boost test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include} for boost_ldpath in "$boost_tmp_lib/lib" '' \ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \ "$with_boost" C:/Boost/lib /lib* do test -e "$boost_ldpath" || continue boost_save_LDFLAGS=$LDFLAGS # Are we looking for a static library? case $boost_ldpath:$boost_rtopt_ in #( *?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt) boost_cv_lib_regex_LIBS="$boost_ldpath/lib$boost_lib.$libext" test -e "$boost_cv_lib_regex_LIBS" || continue;; #( *) # No: use -lboost_foo to find the shared library. boost_cv_lib_regex_LIBS="-l$boost_lib";; esac boost_save_LIBS=$LIBS LIBS="$boost_cv_lib_regex_LIBS $LIBS" test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath" rm -f conftest$ac_exeext boost_save_ac_ext=$ac_ext boost_use_source=: # If we already have a .o, re-use it. We change $ac_ext so that $ac_link # tries to link the existing object file instead of compiling from source. test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false && $as_echo "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5 if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_executable_p conftest$ac_exeext }; then : boost_cv_lib_regex=yes else if $boost_use_source; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi boost_cv_lib_regex=no fi ac_objext=$boost_save_ac_objext ac_ext=$boost_save_ac_ext rm -f core conftest.err conftest_ipa8_conftest.oo \ conftest$ac_exeext ac_objext=$boost_save_ac_objext LDFLAGS=$boost_save_LDFLAGS LIBS=$boost_save_LIBS if test x"$boost_cv_lib_regex" = xyes; then boost_cv_lib_regex_LDFLAGS="-L$boost_ldpath -Wl,-R$boost_ldpath" boost_cv_lib_regex_LDPATH="$boost_ldpath" break 6 else boost_failed_libs="$boost_failed_libs@$boost_lib@" fi done done done done done done rm -f conftest.$ac_objext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_regex" >&5 $as_echo "$boost_cv_lib_regex" >&6; } case $boost_cv_lib_regex in #( no) $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 as_fn_error $? "cannot find the flags to link with Boost regex" "$LINENO" 5 ;; esac BOOST_REGEX_LDFLAGS=$boost_cv_lib_regex_LDFLAGS BOOST_REGEX_LDPATH=$boost_cv_lib_regex_LDPATH BOOST_LDPATH=$boost_cv_lib_regex_LDPATH BOOST_REGEX_LIBS=$boost_cv_lib_regex_LIBS CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi # Do we have to check for Boost.System? This link-time dependency was # added as of 1.35.0. If we have a version <1.35, we must not attempt to # find Boost.System as it didn't exist by then. if test $boost_major_version -ge 135; then if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost system library" >&5 $as_echo "$as_me: Boost not available, not searching for the Boost system library" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/system/error_code.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/system/error_code.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/system/error_code.hpp" "ac_cv_header_boost_system_error_code_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_system_error_code_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_SYSTEM_ERROR_CODE_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/system/error_code.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" # Now let's try to find the library. The algorithm is as follows: first look # for a given library name according to the user's PREFERRED-RT-OPT. For each # library name, we prefer to use the ones that carry the tag (toolset name). # Each library is searched through the various standard paths were Boost is # usually installed. If we can't find the standard variants, we try to # enforce -mt (for instance on MacOSX, libboost_threads.dylib doesn't exist # but there's -obviously- libboost_threads-mt.dylib). { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the Boost system library" >&5 $as_echo_n "checking for the Boost system library... " >&6; } if ${boost_cv_lib_system+:} false; then : $as_echo_n "(cached) " >&6 else boost_cv_lib_system=no case "" in #( mt | mt-) boost_mt=-mt; boost_rtopt=;; #( mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #( *) boost_mt=; boost_rtopt=;; esac if test $enable_static_boost = yes; then boost_rtopt="s$boost_rtopt" fi # Find the proper debug variant depending on what we've been asked to find. case $boost_rtopt in #( *d*) boost_rt_d=$boost_rtopt;; #( *[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn') boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #( *) boost_rt_d='-d';; esac # If the PREFERRED-RT-OPT are not empty, prepend a `-'. test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt" $boost_guess_use_mt && boost_mt=-mt # Look for the abs path the static archive. # $libext is computed by Libtool but let's make sure it's non empty. test -z "$libext" && as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5 boost_save_ac_objext=$ac_objext # Generate the test file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { boost::system::error_code e; e.clear(); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_objext=do_not_rm_me_plz else as_fn_error $? "cannot compile a test that uses Boost system" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext ac_objext=$boost_save_ac_objext boost_failed_libs= # Don't bother to ident the 6 nested for loops, only the 2 innermost ones # matter. for boost_tag_ in -$boost_cv_lib_tag ''; do for boost_ver_ in -$boost_cv_lib_version ''; do for boost_mt_ in $boost_mt -mt ''; do for boost_rtopt_ in $boost_rtopt '' -d; do for boost_lib in \ boost_system$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \ boost_system$boost_tag_$boost_rtopt_$boost_ver_ \ boost_system$boost_tag_$boost_mt_$boost_ver_ \ boost_system$boost_tag_$boost_ver_ do # Avoid testing twice the same lib case $boost_failed_libs in #( *@$boost_lib@*) continue;; esac # If with_boost is empty, we'll search in /lib first, which is not quite # right so instead we'll try to a location based on where the headers are. boost_tmp_lib=$with_boost test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include} for boost_ldpath in "$boost_tmp_lib/lib" '' \ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \ "$with_boost" C:/Boost/lib /lib* do test -e "$boost_ldpath" || continue boost_save_LDFLAGS=$LDFLAGS # Are we looking for a static library? case $boost_ldpath:$boost_rtopt_ in #( *?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt) boost_cv_lib_system_LIBS="$boost_ldpath/lib$boost_lib.$libext" test -e "$boost_cv_lib_system_LIBS" || continue;; #( *) # No: use -lboost_foo to find the shared library. boost_cv_lib_system_LIBS="-l$boost_lib";; esac boost_save_LIBS=$LIBS LIBS="$boost_cv_lib_system_LIBS $LIBS" test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath" rm -f conftest$ac_exeext boost_save_ac_ext=$ac_ext boost_use_source=: # If we already have a .o, re-use it. We change $ac_ext so that $ac_link # tries to link the existing object file instead of compiling from source. test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false && $as_echo "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5 if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_executable_p conftest$ac_exeext }; then : boost_cv_lib_system=yes else if $boost_use_source; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi boost_cv_lib_system=no fi ac_objext=$boost_save_ac_objext ac_ext=$boost_save_ac_ext rm -f core conftest.err conftest_ipa8_conftest.oo \ conftest$ac_exeext ac_objext=$boost_save_ac_objext LDFLAGS=$boost_save_LDFLAGS LIBS=$boost_save_LIBS if test x"$boost_cv_lib_system" = xyes; then boost_cv_lib_system_LDFLAGS="-L$boost_ldpath -Wl,-R$boost_ldpath" boost_cv_lib_system_LDPATH="$boost_ldpath" break 6 else boost_failed_libs="$boost_failed_libs@$boost_lib@" fi done done done done done done rm -f conftest.$ac_objext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_system" >&5 $as_echo "$boost_cv_lib_system" >&6; } case $boost_cv_lib_system in #( no) $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 as_fn_error $? "cannot find the flags to link with Boost system" "$LINENO" 5 ;; esac BOOST_SYSTEM_LDFLAGS=$boost_cv_lib_system_LDFLAGS BOOST_SYSTEM_LDPATH=$boost_cv_lib_system_LDPATH BOOST_LDPATH=$boost_cv_lib_system_LDPATH BOOST_SYSTEM_LIBS=$boost_cv_lib_system_LIBS CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi fi # end of the Boost.System check. boost_filesystem_save_LIBS=$LIBS boost_filesystem_save_LDFLAGS=$LDFLAGS LIBS="$LIBS $BOOST_SYSTEM_LIBS" LDFLAGS="$LDFLAGS $BOOST_SYSTEM_LDFLAGS" if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost filesystem library" >&5 $as_echo "$as_me: Boost not available, not searching for the Boost filesystem library" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/filesystem/path.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/filesystem/path.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/filesystem/path.hpp" "ac_cv_header_boost_filesystem_path_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_filesystem_path_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_FILESYSTEM_PATH_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/filesystem/path.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" # Now let's try to find the library. The algorithm is as follows: first look # for a given library name according to the user's PREFERRED-RT-OPT. For each # library name, we prefer to use the ones that carry the tag (toolset name). # Each library is searched through the various standard paths were Boost is # usually installed. If we can't find the standard variants, we try to # enforce -mt (for instance on MacOSX, libboost_threads.dylib doesn't exist # but there's -obviously- libboost_threads-mt.dylib). { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the Boost filesystem library" >&5 $as_echo_n "checking for the Boost filesystem library... " >&6; } if ${boost_cv_lib_filesystem+:} false; then : $as_echo_n "(cached) " >&6 else boost_cv_lib_filesystem=no case "" in #( mt | mt-) boost_mt=-mt; boost_rtopt=;; #( mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #( *) boost_mt=; boost_rtopt=;; esac if test $enable_static_boost = yes; then boost_rtopt="s$boost_rtopt" fi # Find the proper debug variant depending on what we've been asked to find. case $boost_rtopt in #( *d*) boost_rt_d=$boost_rtopt;; #( *[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn') boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #( *) boost_rt_d='-d';; esac # If the PREFERRED-RT-OPT are not empty, prepend a `-'. test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt" $boost_guess_use_mt && boost_mt=-mt # Look for the abs path the static archive. # $libext is computed by Libtool but let's make sure it's non empty. test -z "$libext" && as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5 boost_save_ac_objext=$ac_objext # Generate the test file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { boost::filesystem::path p; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_objext=do_not_rm_me_plz else as_fn_error $? "cannot compile a test that uses Boost filesystem" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext ac_objext=$boost_save_ac_objext boost_failed_libs= # Don't bother to ident the 6 nested for loops, only the 2 innermost ones # matter. for boost_tag_ in -$boost_cv_lib_tag ''; do for boost_ver_ in -$boost_cv_lib_version ''; do for boost_mt_ in $boost_mt -mt ''; do for boost_rtopt_ in $boost_rtopt '' -d; do for boost_lib in \ boost_filesystem$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \ boost_filesystem$boost_tag_$boost_rtopt_$boost_ver_ \ boost_filesystem$boost_tag_$boost_mt_$boost_ver_ \ boost_filesystem$boost_tag_$boost_ver_ do # Avoid testing twice the same lib case $boost_failed_libs in #( *@$boost_lib@*) continue;; esac # If with_boost is empty, we'll search in /lib first, which is not quite # right so instead we'll try to a location based on where the headers are. boost_tmp_lib=$with_boost test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include} for boost_ldpath in "$boost_tmp_lib/lib" '' \ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \ "$with_boost" C:/Boost/lib /lib* do test -e "$boost_ldpath" || continue boost_save_LDFLAGS=$LDFLAGS # Are we looking for a static library? case $boost_ldpath:$boost_rtopt_ in #( *?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt) boost_cv_lib_filesystem_LIBS="$boost_ldpath/lib$boost_lib.$libext" test -e "$boost_cv_lib_filesystem_LIBS" || continue;; #( *) # No: use -lboost_foo to find the shared library. boost_cv_lib_filesystem_LIBS="-l$boost_lib";; esac boost_save_LIBS=$LIBS LIBS="$boost_cv_lib_filesystem_LIBS $LIBS" test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath" rm -f conftest$ac_exeext boost_save_ac_ext=$ac_ext boost_use_source=: # If we already have a .o, re-use it. We change $ac_ext so that $ac_link # tries to link the existing object file instead of compiling from source. test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false && $as_echo "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5 if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_executable_p conftest$ac_exeext }; then : boost_cv_lib_filesystem=yes else if $boost_use_source; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi boost_cv_lib_filesystem=no fi ac_objext=$boost_save_ac_objext ac_ext=$boost_save_ac_ext rm -f core conftest.err conftest_ipa8_conftest.oo \ conftest$ac_exeext ac_objext=$boost_save_ac_objext LDFLAGS=$boost_save_LDFLAGS LIBS=$boost_save_LIBS if test x"$boost_cv_lib_filesystem" = xyes; then boost_cv_lib_filesystem_LDFLAGS="-L$boost_ldpath -Wl,-R$boost_ldpath" boost_cv_lib_filesystem_LDPATH="$boost_ldpath" break 6 else boost_failed_libs="$boost_failed_libs@$boost_lib@" fi done done done done done done rm -f conftest.$ac_objext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_filesystem" >&5 $as_echo "$boost_cv_lib_filesystem" >&6; } case $boost_cv_lib_filesystem in #( no) $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 as_fn_error $? "cannot find the flags to link with Boost filesystem" "$LINENO" 5 ;; esac BOOST_FILESYSTEM_LDFLAGS=$boost_cv_lib_filesystem_LDFLAGS BOOST_FILESYSTEM_LDPATH=$boost_cv_lib_filesystem_LDPATH BOOST_LDPATH=$boost_cv_lib_filesystem_LDPATH BOOST_FILESYSTEM_LIBS=$boost_cv_lib_filesystem_LIBS CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test $enable_static_boost = yes && test $boost_major_version -ge 135; then BOOST_FILESYSTEM_LIBS="$BOOST_FILESYSTEM_LIBS $BOOST_SYSTEM_LIBS" fi LIBS=$boost_filesystem_save_LIBS LDFLAGS=$boost_filesystem_save_LDFLAGS if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost system library" >&5 $as_echo "$as_me: Boost not available, not searching for the Boost system library" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/system/error_code.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/system/error_code.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/system/error_code.hpp" "ac_cv_header_boost_system_error_code_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_system_error_code_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_SYSTEM_ERROR_CODE_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/system/error_code.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" # Now let's try to find the library. The algorithm is as follows: first look # for a given library name according to the user's PREFERRED-RT-OPT. For each # library name, we prefer to use the ones that carry the tag (toolset name). # Each library is searched through the various standard paths were Boost is # usually installed. If we can't find the standard variants, we try to # enforce -mt (for instance on MacOSX, libboost_threads.dylib doesn't exist # but there's -obviously- libboost_threads-mt.dylib). { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the Boost system library" >&5 $as_echo_n "checking for the Boost system library... " >&6; } if ${boost_cv_lib_system+:} false; then : $as_echo_n "(cached) " >&6 else boost_cv_lib_system=no case "" in #( mt | mt-) boost_mt=-mt; boost_rtopt=;; #( mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #( *) boost_mt=; boost_rtopt=;; esac if test $enable_static_boost = yes; then boost_rtopt="s$boost_rtopt" fi # Find the proper debug variant depending on what we've been asked to find. case $boost_rtopt in #( *d*) boost_rt_d=$boost_rtopt;; #( *[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn') boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #( *) boost_rt_d='-d';; esac # If the PREFERRED-RT-OPT are not empty, prepend a `-'. test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt" $boost_guess_use_mt && boost_mt=-mt # Look for the abs path the static archive. # $libext is computed by Libtool but let's make sure it's non empty. test -z "$libext" && as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5 boost_save_ac_objext=$ac_objext # Generate the test file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { boost::system::error_code e; e.clear(); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_objext=do_not_rm_me_plz else as_fn_error $? "cannot compile a test that uses Boost system" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext ac_objext=$boost_save_ac_objext boost_failed_libs= # Don't bother to ident the 6 nested for loops, only the 2 innermost ones # matter. for boost_tag_ in -$boost_cv_lib_tag ''; do for boost_ver_ in -$boost_cv_lib_version ''; do for boost_mt_ in $boost_mt -mt ''; do for boost_rtopt_ in $boost_rtopt '' -d; do for boost_lib in \ boost_system$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \ boost_system$boost_tag_$boost_rtopt_$boost_ver_ \ boost_system$boost_tag_$boost_mt_$boost_ver_ \ boost_system$boost_tag_$boost_ver_ do # Avoid testing twice the same lib case $boost_failed_libs in #( *@$boost_lib@*) continue;; esac # If with_boost is empty, we'll search in /lib first, which is not quite # right so instead we'll try to a location based on where the headers are. boost_tmp_lib=$with_boost test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include} for boost_ldpath in "$boost_tmp_lib/lib" '' \ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \ "$with_boost" C:/Boost/lib /lib* do test -e "$boost_ldpath" || continue boost_save_LDFLAGS=$LDFLAGS # Are we looking for a static library? case $boost_ldpath:$boost_rtopt_ in #( *?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt) boost_cv_lib_system_LIBS="$boost_ldpath/lib$boost_lib.$libext" test -e "$boost_cv_lib_system_LIBS" || continue;; #( *) # No: use -lboost_foo to find the shared library. boost_cv_lib_system_LIBS="-l$boost_lib";; esac boost_save_LIBS=$LIBS LIBS="$boost_cv_lib_system_LIBS $LIBS" test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath" rm -f conftest$ac_exeext boost_save_ac_ext=$ac_ext boost_use_source=: # If we already have a .o, re-use it. We change $ac_ext so that $ac_link # tries to link the existing object file instead of compiling from source. test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false && $as_echo "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5 if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_executable_p conftest$ac_exeext }; then : boost_cv_lib_system=yes else if $boost_use_source; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi boost_cv_lib_system=no fi ac_objext=$boost_save_ac_objext ac_ext=$boost_save_ac_ext rm -f core conftest.err conftest_ipa8_conftest.oo \ conftest$ac_exeext ac_objext=$boost_save_ac_objext LDFLAGS=$boost_save_LDFLAGS LIBS=$boost_save_LIBS if test x"$boost_cv_lib_system" = xyes; then boost_cv_lib_system_LDFLAGS="-L$boost_ldpath -Wl,-R$boost_ldpath" boost_cv_lib_system_LDPATH="$boost_ldpath" break 6 else boost_failed_libs="$boost_failed_libs@$boost_lib@" fi done done done done done done rm -f conftest.$ac_objext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_system" >&5 $as_echo "$boost_cv_lib_system" >&6; } case $boost_cv_lib_system in #( no) $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 as_fn_error $? "cannot find the flags to link with Boost system" "$LINENO" 5 ;; esac BOOST_SYSTEM_LDFLAGS=$boost_cv_lib_system_LDFLAGS BOOST_SYSTEM_LDPATH=$boost_cv_lib_system_LDPATH BOOST_LDPATH=$boost_cv_lib_system_LDPATH BOOST_SYSTEM_LIBS=$boost_cv_lib_system_LIBS CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost unit_test_framework library" >&5 $as_echo "$as_me: Boost not available, not searching for the Boost unit_test_framework library" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/test/unit_test.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/test/unit_test.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/test/unit_test.hpp" "ac_cv_header_boost_test_unit_test_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_test_unit_test_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_TEST_UNIT_TEST_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/test/unit_test.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" # Now let's try to find the library. The algorithm is as follows: first look # for a given library name according to the user's PREFERRED-RT-OPT. For each # library name, we prefer to use the ones that carry the tag (toolset name). # Each library is searched through the various standard paths were Boost is # usually installed. If we can't find the standard variants, we try to # enforce -mt (for instance on MacOSX, libboost_threads.dylib doesn't exist # but there's -obviously- libboost_threads-mt.dylib). { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the Boost unit_test_framework library" >&5 $as_echo_n "checking for the Boost unit_test_framework library... " >&6; } if ${boost_cv_lib_unit_test_framework+:} false; then : $as_echo_n "(cached) " >&6 else boost_cv_lib_unit_test_framework=no case "" in #( mt | mt-) boost_mt=-mt; boost_rtopt=;; #( mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #( *) boost_mt=; boost_rtopt=;; esac if test $enable_static_boost = yes; then boost_rtopt="s$boost_rtopt" fi # Find the proper debug variant depending on what we've been asked to find. case $boost_rtopt in #( *d*) boost_rt_d=$boost_rtopt;; #( *[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn') boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #( *) boost_rt_d='-d';; esac # If the PREFERRED-RT-OPT are not empty, prepend a `-'. test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt" $boost_guess_use_mt && boost_mt=-mt # Look for the abs path the static archive. # $libext is computed by Libtool but let's make sure it's non empty. test -z "$libext" && as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5 boost_save_ac_objext=$ac_objext # Generate the test file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include using boost::unit_test::test_suite; test_suite* init_unit_test_suite(int argc, char ** argv) { return NULL; } int main () { BOOST_CHECK(2 == 2); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_objext=do_not_rm_me_plz else as_fn_error $? "cannot compile a test that uses Boost unit_test_framework" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext ac_objext=$boost_save_ac_objext boost_failed_libs= # Don't bother to ident the 6 nested for loops, only the 2 innermost ones # matter. for boost_tag_ in -$boost_cv_lib_tag ''; do for boost_ver_ in -$boost_cv_lib_version ''; do for boost_mt_ in $boost_mt -mt ''; do for boost_rtopt_ in $boost_rtopt '' -d; do for boost_lib in \ boost_unit_test_framework$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \ boost_unit_test_framework$boost_tag_$boost_rtopt_$boost_ver_ \ boost_unit_test_framework$boost_tag_$boost_mt_$boost_ver_ \ boost_unit_test_framework$boost_tag_$boost_ver_ do # Avoid testing twice the same lib case $boost_failed_libs in #( *@$boost_lib@*) continue;; esac # If with_boost is empty, we'll search in /lib first, which is not quite # right so instead we'll try to a location based on where the headers are. boost_tmp_lib=$with_boost test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include} for boost_ldpath in "$boost_tmp_lib/lib" '' \ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \ "$with_boost" C:/Boost/lib /lib* do test -e "$boost_ldpath" || continue boost_save_LDFLAGS=$LDFLAGS # Are we looking for a static library? case $boost_ldpath:$boost_rtopt_ in #( *?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt) boost_cv_lib_unit_test_framework_LIBS="$boost_ldpath/lib$boost_lib.$libext" test -e "$boost_cv_lib_unit_test_framework_LIBS" || continue;; #( *) # No: use -lboost_foo to find the shared library. boost_cv_lib_unit_test_framework_LIBS="-l$boost_lib";; esac boost_save_LIBS=$LIBS LIBS="$boost_cv_lib_unit_test_framework_LIBS $LIBS" test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath" rm -f conftest$ac_exeext boost_save_ac_ext=$ac_ext boost_use_source=: # If we already have a .o, re-use it. We change $ac_ext so that $ac_link # tries to link the existing object file instead of compiling from source. test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false && $as_echo "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5 if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_executable_p conftest$ac_exeext }; then : boost_cv_lib_unit_test_framework=yes else if $boost_use_source; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi boost_cv_lib_unit_test_framework=no fi ac_objext=$boost_save_ac_objext ac_ext=$boost_save_ac_ext rm -f core conftest.err conftest_ipa8_conftest.oo \ conftest$ac_exeext ac_objext=$boost_save_ac_objext LDFLAGS=$boost_save_LDFLAGS LIBS=$boost_save_LIBS if test x"$boost_cv_lib_unit_test_framework" = xyes; then boost_cv_lib_unit_test_framework_LDFLAGS="-L$boost_ldpath -Wl,-R$boost_ldpath" boost_cv_lib_unit_test_framework_LDPATH="$boost_ldpath" break 6 else boost_failed_libs="$boost_failed_libs@$boost_lib@" fi done done done done done done rm -f conftest.$ac_objext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_unit_test_framework" >&5 $as_echo "$boost_cv_lib_unit_test_framework" >&6; } case $boost_cv_lib_unit_test_framework in #( no) $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 as_fn_error $? "cannot find the flags to link with Boost unit_test_framework" "$LINENO" 5 ;; esac BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS=$boost_cv_lib_unit_test_framework_LDFLAGS BOOST_UNIT_TEST_FRAMEWORK_LDPATH=$boost_cv_lib_unit_test_framework_LDPATH BOOST_LDPATH=$boost_cv_lib_unit_test_framework_LDPATH BOOST_UNIT_TEST_FRAMEWORK_LIBS=$boost_cv_lib_unit_test_framework_LIBS CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi # Boost.Python if required if test "$python_scripting" = 'yes' then for ac_prog in python2-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PYTHON_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PYTHON_CONFIG"; then ac_cv_prog_PYTHON_CONFIG="$PYTHON_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PYTHON_CONFIG="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PYTHON_CONFIG=$ac_cv_prog_PYTHON_CONFIG if test -n "$PYTHON_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_CONFIG" >&5 $as_echo "$PYTHON_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYTHON_CONFIG" && break done if test ! -z "$PYTHON_CONFIG" then PYTHON_LIBS=`$PYTHON_CONFIG --libs` BOOST_PYTHON_CPPFLAGS=`python2-config --includes 2>/dev/null` boost_python_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_PYTHON_CPPFLAGS" BOOST_PYTHON_LDFLAGS=`python2-config --ldflags 2>/dev/null` boost_python_save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $BOOST_PYTHON_LDFLAGS" BOOST_PYTHON_LIBS=`python2-config --libs 2>/dev/null` boost_python_save_LIBS=$LIBS LIBS="$LIBS $BOOST_PYTHON_LIBS" if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for the Boost python library" >&5 $as_echo "$as_me: Boost not available, not searching for the Boost python library" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test x"$boost_cv_inc_path" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Boost not available, not searching for boost/python.hpp" >&5 $as_echo "$as_me: Boost not available, not searching for boost/python.hpp" >&6;} else ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "boost/python.hpp" "ac_cv_header_boost_python_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_python_hpp" = xyes; then : $as_echo "#define HAVE_BOOST_PYTHON_HPP 1" >>confdefs.h else as_fn_error $? "cannot find boost/python.hpp" "$LINENO" 5 fi CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi boost_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" # Now let's try to find the library. The algorithm is as follows: first look # for a given library name according to the user's PREFERRED-RT-OPT. For each # library name, we prefer to use the ones that carry the tag (toolset name). # Each library is searched through the various standard paths were Boost is # usually installed. If we can't find the standard variants, we try to # enforce -mt (for instance on MacOSX, libboost_threads.dylib doesn't exist # but there's -obviously- libboost_threads-mt.dylib). { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the Boost python library" >&5 $as_echo_n "checking for the Boost python library... " >&6; } if ${boost_cv_lib_python+:} false; then : $as_echo_n "(cached) " >&6 else boost_cv_lib_python=no case "" in #( mt | mt-) boost_mt=-mt; boost_rtopt=;; #( mt* | mt-*) boost_mt=-mt; boost_rtopt=`expr "X" : 'Xmt-*\(.*\)'`;; #( *) boost_mt=; boost_rtopt=;; esac if test $enable_static_boost = yes; then boost_rtopt="s$boost_rtopt" fi # Find the proper debug variant depending on what we've been asked to find. case $boost_rtopt in #( *d*) boost_rt_d=$boost_rtopt;; #( *[sgpn]*) # Insert the `d' at the right place (in between `sg' and `pn') boost_rt_d=`echo "$boost_rtopt" | sed 's/\(s*g*\)\(p*n*\)/\1\2/'`;; #( *) boost_rt_d='-d';; esac # If the PREFERRED-RT-OPT are not empty, prepend a `-'. test -n "$boost_rtopt" && boost_rtopt="-$boost_rtopt" $boost_guess_use_mt && boost_mt=-mt # Look for the abs path the static archive. # $libext is computed by Libtool but let's make sure it's non empty. test -z "$libext" && as_fn_error $? "the libext variable is empty, did you invoke Libtool?" "$LINENO" 5 boost_save_ac_objext=$ac_objext # Generate the test file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include BOOST_PYTHON_MODULE(empty) {} int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_objext=do_not_rm_me_plz else as_fn_error $? "cannot compile a test that uses Boost python" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext ac_objext=$boost_save_ac_objext boost_failed_libs= # Don't bother to ident the 6 nested for loops, only the 2 innermost ones # matter. for boost_tag_ in -$boost_cv_lib_tag ''; do for boost_ver_ in -$boost_cv_lib_version ''; do for boost_mt_ in $boost_mt -mt ''; do for boost_rtopt_ in $boost_rtopt '' -d; do for boost_lib in \ boost_python$boost_tag_$boost_mt_$boost_rtopt_$boost_ver_ \ boost_python$boost_tag_$boost_rtopt_$boost_ver_ \ boost_python$boost_tag_$boost_mt_$boost_ver_ \ boost_python$boost_tag_$boost_ver_ do # Avoid testing twice the same lib case $boost_failed_libs in #( *@$boost_lib@*) continue;; esac # If with_boost is empty, we'll search in /lib first, which is not quite # right so instead we'll try to a location based on where the headers are. boost_tmp_lib=$with_boost test x"$with_boost" = x && boost_tmp_lib=${boost_cv_inc_path%/include} for boost_ldpath in "$boost_tmp_lib/lib" '' \ /opt/local/lib* /usr/local/lib* /opt/lib* /usr/lib* \ "$with_boost" C:/Boost/lib /lib* do test -e "$boost_ldpath" || continue boost_save_LDFLAGS=$LDFLAGS # Are we looking for a static library? case $boost_ldpath:$boost_rtopt_ in #( *?*:*s*) # Yes (Non empty boost_ldpath + s in rt opt) boost_cv_lib_python_LIBS="$boost_ldpath/lib$boost_lib.$libext" test -e "$boost_cv_lib_python_LIBS" || continue;; #( *) # No: use -lboost_foo to find the shared library. boost_cv_lib_python_LIBS="-l$boost_lib";; esac boost_save_LIBS=$LIBS LIBS="$boost_cv_lib_python_LIBS $LIBS" test x"$boost_ldpath" != x && LDFLAGS="$LDFLAGS -L$boost_ldpath" rm -f conftest$ac_exeext boost_save_ac_ext=$ac_ext boost_use_source=: # If we already have a .o, re-use it. We change $ac_ext so that $ac_link # tries to link the existing object file instead of compiling from source. test -f conftest.$ac_objext && ac_ext=$ac_objext && boost_use_source=false && $as_echo "$as_me:${as_lineno-$LINENO}: re-using the existing conftest.$ac_objext" >&5 if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_executable_p conftest$ac_exeext }; then : boost_cv_lib_python=yes else if $boost_use_source; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi boost_cv_lib_python=no fi ac_objext=$boost_save_ac_objext ac_ext=$boost_save_ac_ext rm -f core conftest.err conftest_ipa8_conftest.oo \ conftest$ac_exeext ac_objext=$boost_save_ac_objext LDFLAGS=$boost_save_LDFLAGS LIBS=$boost_save_LIBS if test x"$boost_cv_lib_python" = xyes; then boost_cv_lib_python_LDFLAGS="-L$boost_ldpath -Wl,-R$boost_ldpath" boost_cv_lib_python_LDPATH="$boost_ldpath" break 6 else boost_failed_libs="$boost_failed_libs@$boost_lib@" fi done done done done done done rm -f conftest.$ac_objext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boost_cv_lib_python" >&5 $as_echo "$boost_cv_lib_python" >&6; } case $boost_cv_lib_python in #( no) $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 as_fn_error $? "cannot find the flags to link with Boost python" "$LINENO" 5 ;; esac BOOST_PYTHON_LDFLAGS=$boost_cv_lib_python_LDFLAGS BOOST_PYTHON_LDPATH=$boost_cv_lib_python_LDPATH BOOST_LDPATH=$boost_cv_lib_python_LDPATH BOOST_PYTHON_LIBS=$boost_cv_lib_python_LIBS CPPFLAGS=$boost_save_CPPFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi CPPFLAGS=$boost_python_save_CPPFLAGS LDFLAGS=$boost_python_save_LDFLAGS LIBS=$boost_python_save_LIBS script_module='script' fi fi # dynamic link library { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -ldl" >&5 $as_echo_n "checking for main in -ldl... " >&6; } if ${ac_cv_lib_dl_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dl_main=yes else ac_cv_lib_dl_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_main" >&5 $as_echo "$ac_cv_lib_dl_main" >&6; } if test "x$ac_cv_lib_dl_main" = xyes; then : DL_LIBS='-ldl' else as_fn_error $? "DL library not found" "$LINENO" 5 fi # Dependent Boost headers ac_fn_cxx_check_header_mongrel "$LINENO" "boost/serialization/access.hpp" "ac_cv_header_boost_serialization_access_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_serialization_access_hpp" = xyes; then : else as_fn_error $? "Boost.Serialization headers not found" "$LINENO" 5 fi # OpenAL and vorbis ac_fn_cxx_check_header_mongrel "$LINENO" "AL/alut.h" "ac_cv_header_AL_alut_h" "$ac_includes_default" if test "x$ac_cv_header_AL_alut_h" = xyes; then : sound_module='sound' else sound_module='' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ov_clear in -lvorbisfile" >&5 $as_echo_n "checking for ov_clear in -lvorbisfile... " >&6; } if ${ac_cv_lib_vorbisfile_ov_clear+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lvorbisfile $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ov_clear (); int main () { return ov_clear (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_vorbisfile_ov_clear=yes else ac_cv_lib_vorbisfile_ov_clear=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_vorbisfile_ov_clear" >&5 $as_echo "$ac_cv_lib_vorbisfile_ov_clear" >&6; } if test "x$ac_cv_lib_vorbisfile_ov_clear" = xyes; then : VORBIS_LIBS='-lvorbisfile' else sound_module='' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alGetError in -lopenal" >&5 $as_echo_n "checking for alGetError in -lopenal... " >&6; } if ${ac_cv_lib_openal_alGetError+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lopenal $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char alGetError (); int main () { return alGetError (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_openal_alGetError=yes else ac_cv_lib_openal_alGetError=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openal_alGetError" >&5 $as_echo "$ac_cv_lib_openal_alGetError" >&6; } if test "x$ac_cv_lib_openal_alGetError" = xyes; then : AL_LIBS='-lopenal' else sound_module='' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lalut" >&5 $as_echo_n "checking for main in -lalut... " >&6; } if ${ac_cv_lib_alut_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lalut $AL_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_alut_main=yes else ac_cv_lib_alut_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_alut_main" >&5 $as_echo "$ac_cv_lib_alut_main" >&6; } if test "x$ac_cv_lib_alut_main" = xyes; then : ALUT_LIBS='-lalut' else sound_module='' fi # Configure global flags, cancelling any modifications we may have made during # configuration WARNING_FLAGS="-Wall -Wno-unused-variable -Werror=return-type" CFLAGS="$USER_CFLAGS $WARNING_FLAGS $WX_CFLAGS" CXXFLAGS="$USER_CXXFLAGS $WARNING_FLAGS $WX_CXXFLAGS_ONLY" CPPFLAGS="$USER_CPPFLAGS -DPOSIX -std=c++0x $WX_CPPFLAGS $LIBSIGC_CFLAGS -DWXINTL_NO_GETTEXT_MACRO" LDFLAGS="$USER_LDFLAGS $LIBSIGC_LIBS -Wl,-z,defs" # Debug/optimisation if test "$debug_build" != 'no' then CPPFLAGS="-D_DEBUG $CPPFLAGS" CFLAGS="-g -O0 $CFLAGS" CXXFLAGS="-g -O0 $CXXFLAGS" else CFLAGS="-g -O2 -DNDEBUG $CFLAGS" CXXFLAGS="-g -O2 -DNDEBUG $CXXFLAGS" fi # Generate output files ac_config_headers="$ac_config_headers config.h" ac_config_files="$ac_config_files install/darkradiant.desktop install/i18n//Makefile.in Makefile radiant/Makefile install/i18n/Makefile.in libs/Makefile libs/ddslib/Makefile libs/wxutil/Makefile libs/math/Makefile libs/picomodel/Makefile libs/scene/Makefile libs/xmlutil/Makefile plugins/Makefile plugins/archivezip/Makefile plugins/commandsystem/Makefile plugins/eclassmgr/Makefile plugins/eclasstree/Makefile plugins/entity/Makefile plugins/entitylist/Makefile plugins/eventmanager/Makefile plugins/filetypes/Makefile plugins/filters/Makefile plugins/fonts/Makefile plugins/grid/Makefile plugins/image/Makefile plugins/mapdoom3/Makefile plugins/md5model/Makefile plugins/model/Makefile plugins/particles/Makefile plugins/scenegraph/Makefile plugins/script/Makefile plugins/shaders/Makefile plugins/skins/Makefile plugins/sound/Makefile plugins/uimanager/Makefile plugins/undo/Makefile plugins/vfspk3/Makefile plugins/wavefront/Makefile plugins/xmlregistry/Makefile plugins/dm.stimresponse/Makefile plugins/dm.objectives/Makefile plugins/dm.difficulty/Makefile plugins/dm.gui/Makefile plugins/dm.editing/Makefile plugins/dm.conversation/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by darkradiant $as_me 2.0.1-1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ darkradiant config.status 2.0.1-1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "install/darkradiant.desktop") CONFIG_FILES="$CONFIG_FILES install/darkradiant.desktop" ;; "install/i18n//Makefile.in") CONFIG_FILES="$CONFIG_FILES install/i18n//Makefile.in" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "radiant/Makefile") CONFIG_FILES="$CONFIG_FILES radiant/Makefile" ;; "install/i18n/Makefile.in") CONFIG_FILES="$CONFIG_FILES install/i18n/Makefile.in" ;; "libs/Makefile") CONFIG_FILES="$CONFIG_FILES libs/Makefile" ;; "libs/ddslib/Makefile") CONFIG_FILES="$CONFIG_FILES libs/ddslib/Makefile" ;; "libs/wxutil/Makefile") CONFIG_FILES="$CONFIG_FILES libs/wxutil/Makefile" ;; "libs/math/Makefile") CONFIG_FILES="$CONFIG_FILES libs/math/Makefile" ;; "libs/picomodel/Makefile") CONFIG_FILES="$CONFIG_FILES libs/picomodel/Makefile" ;; "libs/scene/Makefile") CONFIG_FILES="$CONFIG_FILES libs/scene/Makefile" ;; "libs/xmlutil/Makefile") CONFIG_FILES="$CONFIG_FILES libs/xmlutil/Makefile" ;; "plugins/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/Makefile" ;; "plugins/archivezip/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/archivezip/Makefile" ;; "plugins/commandsystem/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/commandsystem/Makefile" ;; "plugins/eclassmgr/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/eclassmgr/Makefile" ;; "plugins/eclasstree/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/eclasstree/Makefile" ;; "plugins/entity/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/entity/Makefile" ;; "plugins/entitylist/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/entitylist/Makefile" ;; "plugins/eventmanager/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/eventmanager/Makefile" ;; "plugins/filetypes/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/filetypes/Makefile" ;; "plugins/filters/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/filters/Makefile" ;; "plugins/fonts/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/fonts/Makefile" ;; "plugins/grid/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/grid/Makefile" ;; "plugins/image/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/image/Makefile" ;; "plugins/mapdoom3/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/mapdoom3/Makefile" ;; "plugins/md5model/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/md5model/Makefile" ;; "plugins/model/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/model/Makefile" ;; "plugins/particles/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/particles/Makefile" ;; "plugins/scenegraph/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/scenegraph/Makefile" ;; "plugins/script/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/script/Makefile" ;; "plugins/shaders/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/shaders/Makefile" ;; "plugins/skins/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/skins/Makefile" ;; "plugins/sound/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/sound/Makefile" ;; "plugins/uimanager/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/uimanager/Makefile" ;; "plugins/undo/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/undo/Makefile" ;; "plugins/vfspk3/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/vfspk3/Makefile" ;; "plugins/wavefront/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/wavefront/Makefile" ;; "plugins/xmlregistry/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/xmlregistry/Makefile" ;; "plugins/dm.stimresponse/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/dm.stimresponse/Makefile" ;; "plugins/dm.objectives/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/dm.objectives/Makefile" ;; "plugins/dm.difficulty/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/dm.difficulty/Makefile" ;; "plugins/dm.gui/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/dm.gui/Makefile" ;; "plugins/dm.editing/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/dm.editing/Makefile" ;; "plugins/dm.conversation/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/dm.conversation/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Whether or not to build static libraries. build_old_libs=$enable_static # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi # Display configured options echo " Configuration options:" echo " Installation prefix: $prefix" if test -n "$sound_module" then echo " Sound: yes" else echo " Sound: no" fi if test "$darkmod_plugins" != 'no' then echo " Darkmod plugins: yes" else echo " Darkmod plugins: no" fi if test -z "$script_module" then echo " Python scripting: no" else echo " Python scripting: yes" fi DarkRadiant-2.0.2/configure.ac000066400000000000000000000176021245424655700162110ustar00rootroot00000000000000AC_INIT([darkradiant], [2.0.1-1]) AM_INIT_AUTOMAKE([subdir-objects]) AM_SILENT_RULES([yes]) AC_CONFIG_MACRO_DIR([m4]) # Initialise Gettext AM_GNU_GETTEXT([external]) # Save user flags USER_CFLAGS=$CFLAGS USER_CXXFLAGS=$CXXFLAGS USER_CPPFLAGS=$CPPFLAGS USER_LDFLAGS=$LDFLAGS # Setup and defaults AC_LANG(C++) AC_PROG_CXX AC_DISABLE_STATIC AC_PROG_LIBTOOL # Optional features AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug], [enable debug build])], [debug_build=$enableval], [debug_build='no']) AC_ARG_ENABLE([darkmod-plugins], [AS_HELP_STRING([--enable-darkmod-plugins], [build Dark Mod plugins such as S/R editor])], [darkmod_plugins=$enableval], [darkmod_plugins='no']) AC_ARG_ENABLE([python], [AS_HELP_STRING([--disable-python], [disable Python scripting functionality])], [python_scripting=$enableval], [python_scripting='yes']) if [[ "$darkmod_plugins" != 'no' ]] then # Enable conditional directories (used by plugins/Makefile.am) sr_plugin="dm.stimresponse" obj_plugin="dm.objectives" difficulty_plugin="dm.difficulty" conv_plugin="dm.conversation" gui_plugin="dm.gui" editing_plugin="dm.editing" fi AC_SUBST([sr_plugin]) AC_SUBST([obj_plugin]) AC_SUBST([difficulty_plugin]) AC_SUBST([conv_plugin]) AC_SUBST([gui_plugin]) AC_SUBST([editing_plugin]) # Check for required libraries # Zlib AC_CHECK_HEADER([zlib.h], [], [AC_MSG_ERROR([ZLib not found])]) AC_CHECK_LIB([z], [inflateEnd], [Z_LIBS='-lz'], [AC_MSG_ERROR([ZLib not found])]) AC_SUBST([Z_LIBS]) # JPEG AC_CHECK_HEADER([jpeglib.h], [], [AC_MSG_ERROR([libjpeg header not found])]) AC_CHECK_LIB([jpeg], [jpeg_start_compress], [JPEG_LIBS='-ljpeg'], [AC_MSG_ERROR([libjpeg library not found])]) AC_SUBST([JPEG_LIBS]) # wxWidgets WX_CONFIG_OPTIONS WX_CONFIG_CHECK([3.0.0], [wxWin=1], [wxWin=0], [std,gl,stc]) if test "$wxWin" != 1; then AC_MSG_ERROR([ wxWidgets must be installed on your system but wx-config script could not be found. Please check that wx-config is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is 2.3.4 or above. ]) fi # GTK etc PKG_CHECK_MODULES([XML], [libxml-2.0]) PKG_CHECK_MODULES([LIBSIGC], [sigc++-2.0]) PKG_CHECK_MODULES([PNG], [libpng]) PKG_CHECK_MODULES([FTGL], [ftgl]) # GTKSourceView #PKG_CHECK_MODULES([GTKSOURCEVIEWMM], # [gtksourceviewmm-2.0], # [AC_DEFINE([HAVE_GTKSOURCEVIEW], # [], # [Define if GtkSourceView is available])], # [true]) # GLEW AC_CHECK_HEADER([GL/glew.h], [], [AC_MSG_ERROR([GLEW not found])]) AC_CHECK_LIB([GLEW], [main], [GLEW_LIBS='-lGLEW'], [AC_MSG_ERROR([GLEW not found])]) AC_SUBST([GLEW_LIBS]) # OpenGL and GLU AC_CHECK_LIB([GL], [main], [GL_LIBS='-lGL'], [AC_MSG_ERROR([GL library not found.])]) AC_CHECK_LIB([GLU], [gluBuild2DMipmaps], [GLU_LIBS="-lGLU"], [AC_MSG_ERROR([GLU library not found.])]) AC_SUBST([GL_LIBS]) AC_SUBST([GLU_LIBS]) # Boost BOOST_REQUIRE([1.46.1]) # Check a load of common headers we use BOOST_BIND BOOST_FOREACH BOOST_FORMAT BOOST_FUNCTION BOOST_SMART_PTR BOOST_TOKENIZER # These ones require libraries too BOOST_REGEX BOOST_FILESYSTEM BOOST_SYSTEM BOOST_TEST # Boost.Python if required if test "$python_scripting" = 'yes' then AC_CHECK_PROGS([PYTHON_CONFIG], [python2-config], []) if test ! -z "$PYTHON_CONFIG" then PYTHON_LIBS=`$PYTHON_CONFIG --libs` BOOST_PYTHON script_module='script' AC_SUBST([script_module]) AC_SUBST([PYTHON_LIBS]) fi fi # dynamic link library AC_CHECK_LIB([dl], [main], [DL_LIBS='-ldl'], [AC_MSG_ERROR([DL library not found])]) AC_SUBST([DL_LIBS]) # Dependent Boost headers AC_CHECK_HEADER([boost/serialization/access.hpp], [], [AC_MSG_ERROR([Boost.Serialization headers not found])]) # OpenAL and vorbis AC_CHECK_HEADER([AL/alut.h], [sound_module='sound'], [sound_module='']) AC_CHECK_LIB([vorbisfile], [ov_clear], [VORBIS_LIBS='-lvorbisfile'], [sound_module='']) AC_CHECK_LIB([openal], [alGetError], [AL_LIBS='-lopenal'], [sound_module='']) AC_CHECK_LIB([alut], [main], [ALUT_LIBS='-lalut'], [sound_module=''], [$AL_LIBS]) AC_SUBST([sound_module]) AC_SUBST([ALUT_LIBS]) AC_SUBST([VORBIS_LIBS]) AC_SUBST([AL_LIBS]) # Configure global flags, cancelling any modifications we may have made during # configuration WARNING_FLAGS="-Wall -Wno-unused-variable -Werror=return-type" CFLAGS="$USER_CFLAGS $WARNING_FLAGS $WX_CFLAGS" CXXFLAGS="$USER_CXXFLAGS $WARNING_FLAGS $WX_CXXFLAGS_ONLY" CPPFLAGS="$USER_CPPFLAGS -DPOSIX -std=c++0x $WX_CPPFLAGS $LIBSIGC_CFLAGS -DWXINTL_NO_GETTEXT_MACRO" LDFLAGS="$USER_LDFLAGS $LIBSIGC_LIBS -Wl,-z,defs" # Debug/optimisation if test "$debug_build" != 'no' then CPPFLAGS="-D_DEBUG $CPPFLAGS" CFLAGS="-g -O0 $CFLAGS" CXXFLAGS="-g -O0 $CXXFLAGS" else CFLAGS="-g -O2 -DNDEBUG $CFLAGS" CXXFLAGS="-g -O2 -DNDEBUG $CXXFLAGS" fi AC_SUBST([CPPFLAGS]) AC_SUBST([CFLAGS]) AC_SUBST([CXXFLAGS]) AC_SUBST([LDFLAGS]) # Generate output files AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([install/darkradiant.desktop install/i18n//Makefile.in Makefile radiant/Makefile install/i18n/Makefile.in libs/Makefile libs/ddslib/Makefile libs/wxutil/Makefile libs/math/Makefile libs/picomodel/Makefile libs/scene/Makefile libs/xmlutil/Makefile plugins/Makefile plugins/archivezip/Makefile plugins/commandsystem/Makefile plugins/eclassmgr/Makefile plugins/eclasstree/Makefile plugins/entity/Makefile plugins/entitylist/Makefile plugins/eventmanager/Makefile plugins/filetypes/Makefile plugins/filters/Makefile plugins/fonts/Makefile plugins/grid/Makefile plugins/image/Makefile plugins/mapdoom3/Makefile plugins/md5model/Makefile plugins/model/Makefile plugins/particles/Makefile plugins/scenegraph/Makefile plugins/script/Makefile plugins/shaders/Makefile plugins/skins/Makefile plugins/sound/Makefile plugins/uimanager/Makefile plugins/undo/Makefile plugins/vfspk3/Makefile plugins/wavefront/Makefile plugins/xmlregistry/Makefile plugins/dm.stimresponse/Makefile plugins/dm.objectives/Makefile plugins/dm.difficulty/Makefile plugins/dm.gui/Makefile plugins/dm.editing/Makefile plugins/dm.conversation/Makefile]) AC_OUTPUT # Display configured options echo " Configuration options:" echo " Installation prefix: $prefix" if test -n "$sound_module" then echo " Sound: yes" else echo " Sound: no" fi if test "$darkmod_plugins" != 'no' then echo " Darkmod plugins: yes" else echo " Darkmod plugins: no" fi if test -z "$script_module" then echo " Python scripting: no" else echo " Python scripting: yes" fi DarkRadiant-2.0.2/darkradiant.spec000066400000000000000000000031151245424655700170550ustar00rootroot00000000000000Name: darkradiant Version: 0.9.12 Release: 2%{?dist} Summary: Level editor for Doom 3 and The Dark Mod Group: Applications/Editors License: GPLv2 and LGPLv2 and BSD URL: http://darkradiant.sourceforge.net/ Source0: %{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: automake, autoconf, libtool, desktop-file-utils %description DarkRadiant is a 3D level editor for Doom 3 and The Dark Mod, based on the GPL release of GtkRadiant. %prep %setup -q %build %configure --enable-darkmod-plugins --enable-debug --prefix=/usr make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT desktop-file-install \ --dir=${RPM_BUILD_ROOT}%{_datadir}/applications \ ${RPM_BUILD_ROOT}%{_datadir}/applications/darkradiant.desktop %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc README %{_bindir}/* %{_libdir}/darkradiant/lib* %{_libdir}/darkradiant/modules %{_libdir}/darkradiant/scripts %{_libdir}/darkradiant/plugins/eclasstree* %{_datadir}/* %package plugins-darkmod Summary: DarkMod-specific plugins for DarkRadiant Group: Applications/Editors Requires: darkradiant %description plugins-darkmod These plugins are used for editing Dark Mod missions. %files plugins-darkmod %defattr(-,root,root,-) %doc README.linux %{_libdir}/darkradiant/plugins/dm_* %changelog * Tue Mar 26 2009 ibix - 0.9.12-2 - patches upstream. Removed here. * Tue Mar 24 2009 ibix - 0.9.12-1 - spec file. - patch for sound detection on fedora. - patch for valid desktop entry. DarkRadiant-2.0.2/debian/000077500000000000000000000000001245424655700151375ustar00rootroot00000000000000DarkRadiant-2.0.2/debian/README000066400000000000000000000002441245424655700160170ustar00rootroot00000000000000The Debian Package darkradiant ---------------------------- Comments regarding the Package -- orbweaver Sat, 21 Jun 2008 15:25:20 +0100 DarkRadiant-2.0.2/debian/changelog000066400000000000000000000055401245424655700170150ustar00rootroot00000000000000darkradiant (2.0.1-1~trusty1) trusty; urgency=medium * Fix for crash/assertion when trying to show Add Property dialog. * Added .game file for The Dark Mod standalone that does not include a base/ subdirectory. * Various other bugfixes. -- Matthew Mott Wed, 24 Dec 2014 14:41:12 +0000 darkradiant (2.0.1~trusty2) trusty; urgency=low * 2.0 series release for Linux, including the switch from GTK to wxWidgets. * 2.0.1 contains numerous bug-fixes over the original 2.0 version. -- Matthew Mott Mon, 17 Nov 2014 19:55:17 +0000 darkradiant (1.8.0~trusty1) trusty; urgency=low * This release contains numerous bug and stability fixes as well as one new feature for flooring objects. Some improvements have also been made to better support different game types. * Fix for patch mesh rendering on nVidia hardware with recent drivers. -- Matthew Mott Sat, 28 Jun 2014 10:02:35 +0100 darkradiant (1.7.3~raring1) raring; urgency=low * Fixed progressive corruption of non-worldspawn brush geometry over multiple save operations (#3272) -- Matthew Mott Sat, 02 Feb 2013 09:15:03 +0000 darkradiant (1.7.2~raring1) raring; urgency=low * Fixed incorrect renaming of entities when importing a map (#2733). -- Matthew Mott Mon, 22 Oct 2012 18:35:36 +0100 darkradiant (1.7.1~raring2) raring; urgency=low * Fixed black render artifacts in model preview window (#2939). * Fixed lighting view turning black when certain models are in view (#2969). * Fixed crash on exit after changing view layout (#2954). * Fixed sky box textures failing to render. * Fixed inability to move vertices with arrow keys in camera view (#2938). * Fixed crash after Save As in Particle Editor (now renamed to Copy to better reflect its behaviour). * Fixed crash in Readables editor if certain font resources were missing from the mod assets tree. * Re-designed model chooser allows control over visibility of model's component materials. * Improved performance of map loading and population of certain asset tree views (#2987). * Splitter position in certain dialogs is persistent. * Linux build does not fail if GtkSourceView is not available, this is now an optional dependency. * Updated GTK and related library versions on Windows (#2945) -- Matthew Mott Sun, 13 May 2012 11:25:18 +0100 darkradiant (1.7.0.1~raring1) raring; urgency=low * Fixed possible crash in displaying particle editor on Linux. * Fixed failure to find user-local mod assets in (e.g.) ~/.doom3/darkmod -- Matthew Mott Tue, 29 Nov 2011 19:51:12 +0000 darkradiant (1.7.0~raring1) raring; urgency=low * 1.7.0 release. -- Matthew Mott Mon, 14 Nov 2011 11:13:41 +0000 DarkRadiant-2.0.2/debian/compat000066400000000000000000000000021245424655700163350ustar00rootroot000000000000005 DarkRadiant-2.0.2/debian/control000066400000000000000000000023421245424655700165430ustar00rootroot00000000000000Source: darkradiant Section: editors Priority: extra Maintainer: Matthew Mott Build-Depends: debhelper (>= 5), autotools-dev, libgtkmm-2.4-dev, libgtkglextmm-x11-1.2-dev, libxml2-dev, libglew-dev, libboost-regex-dev, libboost-filesystem-dev, libboost-serialization-dev, libboost-test-dev, libboost-python-dev, python-dev, libvorbis-dev, libopenal-dev, libalut-dev, libjpeg-dev, ftgl-dev, libwxbase3.0-dev, libwxgtk3.0-dev Standards-Version: 3.9.1 Package: darkradiant Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: Level editor for Doom 3 and The Dark Mod DarkRadiant is a 3D level editor for Doom 3 and The Dark Mod, based on the GPL release of GtkRadiant. Package: darkradiant-plugins-darkmod Architecture: any Depends: darkradiant, ${shlibs:Depends}, ${misc:Depends} Description: DarkMod-specific plugins for DarkRadiant These plugins are used for editing Dark Mod missions. Package: darkradiant-i18n Architecture: any Depends: darkradiant, ${shlibs:Depends}, ${misc:Depends} Description: Internationalisation files for DarkRadiant. This package includes the translated strings for localising DarkRadiant into different languages. The currently-available languages are: . de (German) DarkRadiant-2.0.2/debian/copyright000066400000000000000000000036551245424655700171030ustar00rootroot00000000000000Copyright Notice: © 2006 - 2010 OrbWeaver , greebo & other DarkRadiant authors listed below. © 2006 GtkRadiant authors listed below. Authors: DarkRadiant portions: OrbWeaver greebo STiFU mohij angua Crispy Gildoran Jesps (Bulge patch algorithm) GtkRadiant portions: Leonardo Zide leo@lokigames.com Mike Phillips (Loki QA) Bernd Kreimeier (overall coordination) TTimo timo@idsoftware.com ^Fishman (Pablo Zurita) fish@gamedesign.net RR2DO2 rr2do2@q3f.com SmallPileofGibs spog@planetquake.com Mike "mickey" Jackman Tim "Maj" Rennie Geoffrey DeWan David Hyde seaw0lf with assist by ydnar Randy 'ydnar' Reddig Jean-Francois "Eutectic" Groleau Jan Paul "MrElusive" van Waveren Robert Duffy Forest "LordHavoc" Wroncy-Hale Nurail AcidDeath Chronos Michael Schlueter Jamie Wilkinson Robert "Tr3B" Beckebans Licence: This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA On Debian systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL'. DarkRadiant-2.0.2/debian/darkradiant-i18n.install000066400000000000000000000000211245424655700215610ustar00rootroot00000000000000usr/share/locale DarkRadiant-2.0.2/debian/darkradiant-plugins-darkmod.install000066400000000000000000000000411245424655700241040ustar00rootroot00000000000000usr/lib/darkradiant/plugins/dm_* DarkRadiant-2.0.2/debian/darkradiant.install000066400000000000000000000002561245424655700210160ustar00rootroot00000000000000usr/bin usr/lib/darkradiant/lib* usr/lib/darkradiant/modules usr/lib/darkradiant/scripts usr/lib/darkradiant/plugins/eclasstree* usr/share/darkradiant usr/share/applications DarkRadiant-2.0.2/debian/darkradiant.manpages000066400000000000000000000000221245424655700211320ustar00rootroot00000000000000man/darkradiant.1 DarkRadiant-2.0.2/debian/dirs000066400000000000000000000000321245424655700160160ustar00rootroot00000000000000usr/bin usr/lib usr/share DarkRadiant-2.0.2/debian/docs000066400000000000000000000000071245424655700160070ustar00rootroot00000000000000README DarkRadiant-2.0.2/debian/rules000077500000000000000000000033161245424655700162220ustar00rootroot00000000000000#!/usr/bin/make -f # -*- makefile -*- # Sample debian/rules that uses debhelper. # This file was originally written by Joey Hess and Craig Small. # As a special exception, when this file is copied by dh-make into a # dh-make output file, you may use that output file without restriction. # This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # Handle some DEB_BUILD_OPTIONS standards ifneq (,$(filter noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 endif INSTALL_TARGET=install-strip ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_TARGET=install endif config.status: configure dh_testdir ./configure --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --enable-darkmod-plugins build: build-stamp build-stamp: config.status dh_testdir # Add here commands to compile the package. $(MAKE) touch $@ clean: dh_testdir dh_testroot rm -f build-stamp # Add here commands to clean up after the build process. [ ! -f Makefile ] || $(MAKE) distclean dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs $(MAKE) DESTDIR=$(CURDIR)/debian/tmp $(INSTALL_TARGET) # Build architecture-independent files here. binary-indep: build install # Nothing here # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installchangelogs ChangeLog dh_installdocs dh_installman dh_install --sourcedir=debian/tmp dh_strip dh_compress dh_fixperms dh_makeshlibs --noscripts dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install DarkRadiant-2.0.2/debian/source/000077500000000000000000000000001245424655700164375ustar00rootroot00000000000000DarkRadiant-2.0.2/debian/source/format000066400000000000000000000000151245424655700176460ustar00rootroot000000000000003.0 (native) DarkRadiant-2.0.2/depcomp000077500000000000000000000427131245424655700153010ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2007-03-29.01 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software # Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: DarkRadiant-2.0.2/include/000077500000000000000000000000001245424655700153405ustar00rootroot00000000000000DarkRadiant-2.0.2/include/Bounded.h000066400000000000000000000005731245424655700170760ustar00rootroot00000000000000#ifndef BOUNDED_H_ #define BOUNDED_H_ #include /* FOWARD DECLS */ class AABB; /** * Interface for bounded objects, which maintain a local AABB. */ class Bounded { public: virtual ~Bounded() {} /** * Return the local AABB for this object. */ virtual const AABB& localAABB() const = 0; }; typedef std::shared_ptr BoundedPtr; #endif /*BOUNDED_H_*/ DarkRadiant-2.0.2/include/GLProgramAttributes.h000066400000000000000000000004711245424655700214140ustar00rootroot00000000000000#ifndef GLPROGRAMATTRIBUTES_H_ #define GLPROGRAMATTRIBUTES_H_ /** * Enumeration for vertex attributes to be bound to a GLProgram, to avoid using * magic numbers. */ enum GLProgramAttributes { ATTR_TEXCOORD = 8, ATTR_TANGENT = 9, ATTR_BITANGENT = 10, ATTR_NORMAL = 11 }; #endif /*GLPROGRAMATTRIBUTES_H_*/ DarkRadiant-2.0.2/include/ModResource.h000066400000000000000000000013001245424655700177320ustar00rootroot00000000000000#ifndef MODRESOURCE_H_ #define MODRESOURCE_H_ #include /** * Interface for objects representing resources which were defined within * either a directory or a PK4 archive belonging to a particular mod. Provides * a single method to retrieve the name of the mod that contains this particular * resource. */ class ModResource { public: /** * Destructor */ virtual ~ModResource() {} /** * Return the name of the mod which owns this resource object. Objects that * are not part of a separate mod are found in the base/ directory, and will * return "base" from this function. */ virtual std::string getModName() const = 0; }; #endif /*MODRESOURCE_H_*/ DarkRadiant-2.0.2/include/Rotatable.h000066400000000000000000000004041245424655700174240ustar00rootroot00000000000000#pragma once #include "math/Quaternion.h" /// Interface for an object which can be rotated class Rotatable { public: virtual ~Rotatable() {} /// Rotate the object by the given Quaternion virtual void rotate(const Quaternion& rotation) = 0; }; DarkRadiant-2.0.2/include/Scalable.h000066400000000000000000000003641245424655700172220ustar00rootroot00000000000000#pragma once #include "math/Vector3.h" /// Interface for an object which can be scaled class Scalable { public: virtual ~Scalable() {} /// Scale the object by the given vector virtual void scale(const Vector3& scaling) = 0; }; DarkRadiant-2.0.2/include/ShaderLayer.h000066400000000000000000000143361245424655700177230ustar00rootroot00000000000000#pragma once #include "Texture.h" #include #include #include "math/Vector2.h" #include "math/Vector4.h" #include "render/Colour4.h" class IRenderEntity; // Texture repeat types enum ClampType { CLAMP_REPEAT = 1 << 0, // default = no clamping CLAMP_NOREPEAT = 1 << 1, // "clamp" CLAMP_ZEROCLAMP = 1 << 2, // "zeroclamp" CLAMP_ALPHAZEROCLAMP = 1 << 3, // "alphazeroclamp" }; /** * \brief * Representation of a GL blend function. * * A GL blend function consists of two GLenums representing the operations that * should be performed on the source and destination pixel colours respectively, * before the two results are added together into a final pixel colour. */ class BlendFunc { public: // Source pixel function GLenum src; // Destination pixel function GLenum dest; // Constructor BlendFunc(GLenum s, GLenum d) : src(s), dest(d) { } }; /** * \brief * A single layer of a material shader. * * Each shader layer contains an image texture, a blend mode (e.g. add, * modulate) and various other data. */ class ShaderLayer { public: /** * \brief * Enumeration of layer types. */ enum Type { DIFFUSE, BUMP, SPECULAR, BLEND }; // Stage flags enum Flags { FLAG_IGNORE_ALPHATEST = 1 << 0, FLAG_FILTER_NEAREST = 1 << 1, FLAG_FILTER_LINEAR = 1 << 2, FLAG_HIGHQUALITY = 1 << 3, // "uncompressed" FLAG_FORCE_HIGHQUALITY = 1 << 4, FLAG_NO_PICMIP = 1 << 5, FLAG_MASK_RED = 1 << 6, FLAG_MASK_GREEN = 1 << 7, FLAG_MASK_BLUE = 1 << 8, FLAG_MASK_ALPHA = 1 << 9, FLAG_MASK_DEPTH = 1 << 10, FLAG_CENTERSCALE = 1 << 11, // whether to translate -0.5, scale and translate +0.5 }; enum TexGenType { TEXGEN_NORMAL = 1 << 0, TEXGEN_REFLECT = 1 << 1, TEXGEN_SKYBOX = 1 << 2, TEXGEN_WOBBLESKY = 1 << 3, }; /** * \brief * Destructor */ virtual ~ShaderLayer() {} /** * \brief * Return the layer type. */ virtual Type getType() const = 0; /** * \brief * Return the Texture object corresponding to this layer (may be NULL). */ virtual TexturePtr getTexture() const = 0; /** * Evaluate all shader expressions used in this stage. Call this once (each frame) * before requesting things like getAlphaTest(), getColour() or isVisible() */ virtual void evaluateExpressions(std::size_t time) = 0; /** * Like evaluateExpressions(time), but with an additional renderentity as argument * to give this stage the ability to resolve parm0..parm11 values. */ virtual void evaluateExpressions(std::size_t time, const IRenderEntity& entity) = 0; /** * The flags set on this stage. */ virtual int getStageFlags() const = 0; /** * Each stage can have its own clamp type, overriding the per-material one. */ virtual ClampType getClampType() const = 0; /** * Returns the texgen type: normal, reflect, skybox, etc. * Use getTexGenParam(i) to retrieve the wobblesky parameters [0..2] */ virtual TexGenType getTexGenType() const = 0; /** * TexGen type wobblesky has 3 parameters, get them here, with index in [0..2] */ virtual float getTexGenParam(std::size_t index) const = 0; /** * \brief * Return the GL blend function for this layer. * * Only layers of type BLEND use a BlendFunc. Layers of type DIFFUSE, BUMP * and SPECULAR do not use blend functions. */ virtual BlendFunc getBlendFunc() const = 0; /** * \brief * Multiplicative layer colour (set with "red 0.6", "green 0.2" etc) */ virtual Colour4 getColour() const = 0; /** * \brief * Vertex colour blend mode enumeration. */ enum VertexColourMode { VERTEX_COLOUR_NONE, // no vertex colours VERTEX_COLOUR_MULTIPLY, // "vertexColor" VERTEX_COLOUR_INVERSE_MULTIPLY // "inverseVertexColor" }; /** * \brief * Get the vertex colour mode for this layer. */ virtual VertexColourMode getVertexColourMode() const = 0; /** * \brief * Enumeration of cube map modes for this layer. */ enum CubeMapMode { CUBE_MAP_NONE, CUBE_MAP_CAMERA, // cube map in camera space ("cameraCubeMap") CUBE_MAP_OBJECT // cube map in object space ("cubeMap") }; /** * \brief * Get the cube map mode for this layer. */ virtual CubeMapMode getCubeMapMode() const = 0; /** * Returns the value of the scale expressions of this stage. */ virtual Vector2 getScale() = 0; /** * Returns the value of the translate expressions of this stage. */ virtual Vector2 getTranslation() = 0; /** * Returns the value of the rotate expression of this stage. */ virtual float getRotation() = 0; /** * Returns the value of the 'shear' expressions of this stage. */ virtual Vector2 getShear() = 0; /** * \brief * Get the alpha test value for this layer. * * \return * The alpha test value, within (0..1] if it is set. If no alpha test * value is set, 0 will be returned. */ virtual float getAlphaTest() const = 0; /** * Whether this stage is active. Unconditional stages always return true, * conditional ones return the result of the most recent condition expression evaluation. */ virtual bool isVisible() const = 0; /** * Returns the name of this stage's fragment program. */ virtual const std::string& getVertexProgram() = 0; /** * Returns the name of this stage's fragment program. */ virtual const std::string& getFragmentProgram() = 0; /** * Returns the 4 parameter values for the vertexParm index . */ virtual Vector4 getVertexParm(int parm) = 0; /** * Returns the number of fragment maps in this stage. */ virtual std::size_t getNumFragmentMaps() = 0; /** * Returns the fragment map with the given index. */ virtual TexturePtr getFragmentMap(int index) = 0; /** * Stage-specific polygon offset, overriding the "global" one defined on the material. */ virtual float getPrivatePolygonOffset() = 0; }; /** * \brief * Shader pointer for ShaderLayer, */ typedef std::shared_ptr ShaderLayerPtr; /** * \brief * Vector of ShaderLayer pointers. */ typedef std::vector ShaderLayerVector; DarkRadiant-2.0.2/include/StringSerialisable.h000066400000000000000000000011141245424655700212740ustar00rootroot00000000000000#pragma once #include #include /** * \brief * Interface for an object which can serialise itself to/from a string. */ class StringSerialisable { public: /** * \brief * Destructor */ virtual ~StringSerialisable() {} /** * \brief * Export this object's state to a string. */ virtual std::string exportToString() const = 0; /** * \brief * Import this object's state from a given string. */ virtual void importFromString(const std::string& str) = 0; }; typedef std::shared_ptr StringSerialisablePtr; DarkRadiant-2.0.2/include/Texture.h000066400000000000000000000024121245424655700171500ustar00rootroot00000000000000#pragma once #include #include #include /** * \brief * Basic interface for all GL textures. * * This interface represents a texture which is bound to OpenGL, with an OpenGL * texture number (as returned from glGenTextures()). This may be a 2D, 3D, cube * map or any other kind of texture object supported by OpenGL. */ class Texture { public: /** * \brief * Destructor */ virtual ~Texture() {} /** * \brief * Constant indicating an invalid texture size. */ const static std::size_t INVALID_SIZE = 0; /** * \brief * Return the string name of this texture. */ virtual std::string getName() const = 0; /** * \brief * Return the GL texture identifier for this texture. */ virtual GLuint getGLTexNum() const = 0; /** * \brief * Return the width of this texture in pixels. May return INVALID_SIZE if * this texture does not have a valid size. */ virtual std::size_t getWidth() const = 0; /** * \brief * Return the height of this texture in pixels. May return INVALID_SIZE if * this texture does not have a valid size. */ virtual std::size_t getHeight() const = 0; }; typedef std::shared_ptr TexturePtr; DarkRadiant-2.0.2/include/Translatable.h000066400000000000000000000004151245424655700201250ustar00rootroot00000000000000#pragma once #include "math/Vector3.h" /// Interface for an object which can be translated class Translatable { public: virtual ~Translatable() {} /// Translate this object by the given vector virtual void translate(const Vector3& translation) = 0; }; DarkRadiant-2.0.2/include/VolumeIntersectionValue.h000066400000000000000000000003031245424655700223400ustar00rootroot00000000000000#pragma once /** * \brief * Enumeration of possible intersection results between two volumes. */ enum VolumeIntersectionValue { VOLUME_OUTSIDE, VOLUME_INSIDE, VOLUME_PARTIAL }; DarkRadiant-2.0.2/include/editable.h000066400000000000000000000043761245424655700172740ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_EDITABLE_H) #define INCLUDED_EDITABLE_H template class BasicVector3; typedef BasicVector3 Vector3; template class BasicVector4; typedef BasicVector4 Vector4; class Matrix4; class Quaternion; #include "inode.h" class Editable { public: virtual ~Editable() {} virtual const Matrix4& getLocalPivot() const = 0; }; typedef std::shared_ptr EditablePtr; inline EditablePtr Node_getEditable(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } class Snappable { public: virtual ~Snappable() {} virtual void snapto(float snap) = 0; }; typedef std::shared_ptr SnappablePtr; inline SnappablePtr Node_getSnappable(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } class ComponentEditable { public: virtual ~ComponentEditable() {} virtual const AABB& getSelectedComponentsBounds() const = 0; }; typedef std::shared_ptr ComponentEditablePtr; inline ComponentEditablePtr Node_getComponentEditable(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } class ComponentSnappable { public: virtual ~ComponentSnappable() {} virtual void snapComponents(float snap) = 0; }; typedef std::shared_ptr ComponentSnappablePtr; inline ComponentSnappablePtr Node_getComponentSnappable(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } #endif DarkRadiant-2.0.2/include/i18n.h000066400000000000000000000005571245424655700162770ustar00rootroot00000000000000#pragma once #define GETTEXT_PACKAGE "darkradiant" // Redefine the _() macro to return a std::string for convenience #ifndef WXINTL_NO_GETTEXT_MACRO #define WXINTL_NO_GETTEXT_MACRO #endif #include // Custom translation macros #define _(s) (wxGetTranslation((s)).ToStdString()) #define N_(str) str #ifndef C_ #define C_(context,text) _(text) #endif DarkRadiant-2.0.2/include/iarchive.h000066400000000000000000000124371245424655700173120ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_IARCHIVE_H) #define INCLUDED_IARCHIVE_H /** * \file iarchive.h * Types relating to the use of ZIP archives (PK4 files) and their contents. * \ingroup vfs */ #include "ModResource.h" #include "imodule.h" #include #include "itextstream.h" #include class InputStream; /** * A file opened in binary mode. * \ingroup vfs */ class ArchiveFile { public: /// \brief destructor virtual ~ArchiveFile() {} /// \brief Returns the size of the file data in bytes. virtual std::size_t size() const = 0; /// \brief Returns the path to this file (relative to the filesystem root) virtual const std::string& getName() const = 0; /// \brief Returns the stream associated with this file. /// Subsequent calls return the same stream. /// The stream may be read forwards until it is exhausted. /// The stream remains valid for the lifetime of the file. virtual InputStream& getInputStream() = 0; }; typedef std::shared_ptr ArchiveFilePtr; /** * A file opened in text mode. * \ingroup vfs */ class ArchiveTextFile : public ModResource { public: /// \brief Returns the path to this file (relative to the filesystem root) virtual const std::string& getName() const = 0; /// \brief Returns the stream associated with this file. /// Subsequent calls return the same stream. /// The stream may be read forwards until it is exhausted. /// The stream remains valid for the lifetime of the file. virtual TextInputStream& getInputStream() = 0; }; typedef std::shared_ptr ArchiveTextFilePtr; class CustomArchiveVisitor; /** * Representation of a ZIP archive. * * \ingroup vfs */ class Archive { public: /** * Visitor class for traversing files within an Archive. */ class Visitor { public: virtual ~Visitor() {} virtual void visit(const std::string& name) = 0; }; typedef CustomArchiveVisitor VisitorFunc; enum EMode { eFiles = 0x01, eDirectories = 0x02, eFilesAndDirectories = 0x03, }; /// \brief destructor virtual ~Archive() {} /// \brief Returns a new object associated with the file identified by \p name, or 0 if the file cannot be opened. /// Name comparisons are case-insensitive. virtual ArchiveFilePtr openFile(const std::string& name) = 0; /// \brief Returns a new object associated with the file identified by \p name, or 0 if the file cannot be opened. /// Name comparisons are case-insensitive. virtual ArchiveTextFilePtr openTextFile(const std::string& name) = 0; /// Returns true if the file identified by \p name can be opened. /// Name comparisons are case-insensitive. virtual bool containsFile(const std::string& name) = 0; /// \brief Performs a depth-first traversal of the archive tree starting at \p root. /// Traverses the entire tree if \p root is "". /// When a file is encountered, calls \c visitor.file passing the file name. /// When a directory is encountered, calls \c visitor.directory passing the directory name. /// Skips the directory if \c visitor.directory returned true. /// Root comparisons are case-insensitive. /// Names are mixed-case. virtual void forEachFile(VisitorFunc visitor, const std::string& root) = 0; }; typedef std::shared_ptr ArchivePtr; class CustomArchiveVisitor { Archive::Visitor* m_visitor; Archive::EMode m_mode; std::size_t m_depth; public: CustomArchiveVisitor(Archive::Visitor& visitor, Archive::EMode mode, std::size_t depth) : m_visitor(&visitor), m_mode(mode), m_depth(depth) { } void file(const std::string& name) { if((m_mode & Archive::eFiles) != 0) m_visitor->visit(name); } bool directory(const std::string& name, std::size_t depth) { if ((m_mode & Archive::eDirectories) != 0) { m_visitor->visit(name); } if (depth == m_depth) { return true; } return false; } }; const std::string MODULE_ARCHIVE("Archive"); /** * Loader module for ZIP archives. * * \ingroup vfs */ class ArchiveLoader : public RegisterableModule { public: // greebo: Returns the opened file or NULL if failed. virtual ArchivePtr openArchive(const std::string& name) = 0; // get the supported file extension virtual const std::string& getExtension() = 0; }; /** * Return an ArchiveLoader module for the specified filetype. * * \ingroup vfs */ inline ArchiveLoader& GlobalArchive(const std::string& fileType) { // Cache the reference locally static ArchiveLoader& _archive( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_ARCHIVE + fileType) // e.g. ArchivePK4 ) ); return _archive; } #endif DarkRadiant-2.0.2/include/ibrush.h000066400000000000000000000144101245424655700170050ustar00rootroot00000000000000#pragma once #include "inode.h" #include "imodule.h" #include "math/Vector2.h" #include "math/Vector3.h" #include class Matrix4; class Plane3; const std::string RKEY_ENABLE_TEXTURE_LOCK("user/ui/brush/textureLock"); class BrushCreator : public RegisterableModule { public: virtual scene::INodePtr createBrush() = 0; }; // The structure defining a single corner point of an IWinding struct WindingVertex { Vector3 vertex; // The 3D coordinates of the point Vector2 texcoord; // The UV coordinates Vector3 tangent; // The tangent Vector3 bitangent; // The bitangent Vector3 normal; // The normals std::size_t adjacent; // The index of the adjacent WindingVertex // greebo: This operator is needed to enable scripting support // using boost::python's vector_indexing_suite. bool operator==(const WindingVertex& other) const { return (vertex == other.vertex && texcoord == other.texcoord && tangent == other.tangent && bitangent == other.bitangent && normal == other.normal && adjacent == other.adjacent); } }; // A Winding consists of several connected WindingVertex objects, // each of which holding information about a single corner point. typedef std::vector IWinding; // Interface for a face plane class IFace { public: // Destructor virtual ~IFace() {} // Submits the current state to the UndoSystem, to make further actions undo-able virtual void undoSave() = 0; // Shader accessors virtual const std::string& getShader() const = 0; virtual void setShader(const std::string& name) = 0; // Shifts the texture by the given s,t amount in texture space virtual void shiftTexdef(float s, float t) = 0; // Scales the tex def by the given factors in texture space virtual void scaleTexdef(float s, float t) = 0; // Rotates the texture by the given angle virtual void rotateTexdef(float angle) = 0; // Fits the texture on this face virtual void fitTexture(float s_repeat, float t_repeat) = 0; // Flips the texture by the given flipAxis (0 == x-axis, 1 == y-axis) virtual void flipTexture(unsigned int flipAxis) = 0; // This translates the texture as much towards the origin in texture space as possible without changing the world appearance. virtual void normaliseTexture() = 0; // Get access to the actual Winding object virtual IWinding& getWinding() = 0; virtual const IWinding& getWinding() const = 0; virtual const Plane3& getPlane3() const = 0; /** * Returns the 3x3 texture matrix for this face, containing shift, scale and rotation. * * xx, yx, xy and yy hold the scale and rotation * tx and ty hold the shift */ virtual Matrix4 getTexDefMatrix() const = 0; }; // Brush Interface class IBrush { public: virtual ~IBrush() {} // Returns the number of faces for this brush virtual std::size_t getNumFaces() const = 0; // Get a reference to the face by index in [0..getNumFaces). virtual IFace& getFace(std::size_t index) = 0; // Const variant of the above virtual const IFace& getFace(std::size_t index) const = 0; // Add a new face to this brush, using the given plane object, returns a reference to the new face virtual IFace& addFace(const Plane3& plane) = 0; // Add a new face to this brush, using the given plane, texdef matrix and shader name virtual IFace& addFace(const Plane3& plane, const Matrix4& texDef, const std::string& shader) = 0; // Returns true when this brush has no faces virtual bool empty() const = 0; // Returns true if any face of the brush contributes to the final B-Rep. virtual bool hasContributingFaces() const = 0; // Removes faces that do not contribute to the brush. // This is useful for cleaning up after CSG operations on the brush. // Note: removal of empty faces is not performed during direct brush manipulations, // because it would make a manipulation irreversible if it created an empty face. virtual void removeEmptyFaces() = 0; // Sets the shader of all faces to the given name virtual void setShader(const std::string& newShader) = 0; // Returns TRUE if any of the faces has the given shader virtual bool hasShader(const std::string& name) = 0; // Returns TRUE if any of the brush's faces has a visible material, FALSE if all faces are effectively hidden virtual bool hasVisibleMaterial() const = 0; /** * greebo: This is used by the filter system (for example) to trigger * an update of the cached visibility flags. This enables a brush * to quickly cull its hidden faces without issuing lots of internal calls. */ virtual void updateFaceVisibility() = 0; // Saves the current state to the undo stack. // Call this before manipulating the brush to make your action undo-able. virtual void undoSave() = 0; enum DetailFlag { Structural = 0, Detail = 1 << 27, // 134217728 }; /** * Q3-compatibility feature, get the value of the detail/structural flag */ virtual DetailFlag getDetailFlag() const = 0; /** * Q3-compatibility feature, set the detail/structural flag */ virtual void setDetailFlag(DetailFlag newValue) = 0; }; // Forward-declare the Brush object, only accessible from main binary class Brush; class IBrushNode { public: virtual ~IBrushNode() {} /** greebo: Retrieves the contained Brush from the BrushNode */ virtual Brush& getBrush() = 0; // Returns the IBrush interface virtual IBrush& getIBrush() = 0; }; typedef std::shared_ptr IBrushNodePtr; inline bool Node_isBrush(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node) != NULL; } // Casts the node onto a BrushNode and returns the Brush pointer inline Brush* Node_getBrush(const scene::INodePtr& node) { IBrushNodePtr brushNode = std::dynamic_pointer_cast(node); if (brushNode != NULL) { return &brushNode->getBrush(); } return NULL; } // Casts the node onto a BrushNode and returns the IBrush pointer inline IBrush* Node_getIBrush(const scene::INodePtr& node) { IBrushNodePtr brushNode = std::dynamic_pointer_cast(node); if (brushNode != NULL) { return &brushNode->getIBrush(); } return NULL; } const std::string MODULE_BRUSHCREATOR("Doom3BrushCreator"); inline BrushCreator& GlobalBrushCreator() { // Cache the reference locally static BrushCreator& _brushCreator( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_BRUSHCREATOR) ) ); return _brushCreator; } DarkRadiant-2.0.2/include/icamera.h000066400000000000000000000021461245424655700171150ustar00rootroot00000000000000#pragma once #include "imodule.h" #include "math/Vector3.h" namespace ui { enum { CAMERA_PITCH = 0, // up / down CAMERA_YAW = 1, // left / right CAMERA_ROLL = 2, // fall over }; /** * The "global" interface of DarkRadiant's camera module. */ class ICamera : public RegisterableModule { public: /** * greebo: Sets the camera origin to the given using the given . */ virtual void focusCamera(const Vector3& point, const Vector3& angles) = 0; }; typedef std::shared_ptr ICameraPtr; } // namespace const std::string MODULE_CAMERA("Camera"); // Accessor // (this is named CameraView to avoid name conflicts with the existing GlobalCamera() accessor) inline ui::ICamera& GlobalCameraView() { // Cache the reference locally static ui::ICamera& _camera( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_CAMERA) ) ); return _camera; } class Matrix4; class CameraView { public: virtual ~CameraView() {} virtual void setModelview(const Matrix4& modelview) = 0; virtual void setFieldOfView(float fieldOfView) = 0; }; DarkRadiant-2.0.2/include/icameraview.h000066400000000000000000000005731245424655700200120ustar00rootroot00000000000000#pragma once #include "iinteractiveview.h" // Abstract class used when handling mouse events // see also: class IOrthoView in iorthoview.h class ICameraView : public IInteractiveView { public: virtual ~ICameraView() {} // Freemove mode virtual void enableFreeMove() = 0; virtual void disableFreeMove() = 0; virtual bool freeMoveEnabled() const = 0; }; DarkRadiant-2.0.2/include/iclipper.h000066400000000000000000000050231245424655700173200ustar00rootroot00000000000000#ifndef ICLIPPER_H_ #define ICLIPPER_H_ #include "imodule.h" #include "iorthoview.h" #include "math/Vector3.h" /** Abstract base class for the clipper module */ // The possible split modes enum EBrushSplit { eFront, eBack, eFrontAndBack, }; enum PlaneClassification { ePlaneFront = 0, ePlaneBack = 1, ePlaneOn = 2, }; struct BrushSplitType { std::size_t counts[3]; BrushSplitType() { counts[0] = 0; counts[1] = 0; counts[2] = 0; } BrushSplitType& operator+=(const BrushSplitType& other) { counts[0] += other.counts[0]; counts[1] += other.counts[1]; counts[2] += other.counts[2]; return *this; } }; class ClipPoint; const std::string MODULE_CLIPPER("Clipper"); /* greebo: This is the interface the clipper module has to provide. */ class IClipper : public RegisterableModule { public: // Gets called if the clip mode is toggled on/off virtual void onClipMode(bool enabled) = 0; // Returns true if the clip mode is enabled virtual bool clipMode() const = 0; // Methods to clip the selected brush or to split it (keeping both parts) virtual void clip() = 0; virtual void splitClip() = 0; // Inverts the clip plane "direction" to determine which part of the brush is kept after clipping virtual void flipClip() = 0; // True when new faces should get caulked virtual bool useCaulkForNewFaces() const = 0; // Returns the name of the caulk shader to be used for clip-created planes virtual const std::string& getCaulkShader() const = 0; // Return or set the view type of the xy view (needed for the projections). virtual EViewType getViewType() const = 0; virtual void setViewType(EViewType viewType) = 0; // Returns the pointer to the currently moved clip point virtual ClipPoint* getMovingClip() = 0; virtual void setMovingClip(ClipPoint* clipPoint) = 0; // Retrieves the reference to the coordinates of the currently "selected" clip point virtual Vector3& getMovingClipCoords() = 0; virtual ClipPoint* find(const Vector3& point, EViewType viewtype, float scale) = 0; // Adds the given point as new clip point. virtual void newClipPoint(const Vector3& point) = 0; // Draws the clip points into the XYView virtual void draw(float scale) = 0; // Updates the clip plane information virtual void update() = 0; }; // This is the accessor for the registry inline IClipper& GlobalClipper() { // Cache the reference locally static IClipper& _clipper( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_CLIPPER) ) ); return _clipper; } #endif /*ICLIPPER_H_*/ DarkRadiant-2.0.2/include/icommandsystem.h000066400000000000000000000211741245424655700205520ustar00rootroot00000000000000#ifndef _ICOMMANDSYSTEM_H_ #define _ICOMMANDSYSTEM_H_ #include #include #include "math/Vector2.h" #include "math/Vector3.h" #include "imodule.h" #include "string/convert.h" namespace cmd { // Use these to define argument types enum ArgumentTypeFlags { ARGTYPE_VOID = 0, ARGTYPE_STRING = 1 << 0, ARGTYPE_INT = 1 << 1, ARGTYPE_DOUBLE = 1 << 2, ARGTYPE_VECTOR3 = 1 << 3, ARGTYPE_VECTOR2 = 1 << 4, // future types go here ARGTYPE_OPTIONAL = 1 << 16, }; // One command argument, provides several getter methods class Argument { std::string _strValue; double _doubleValue; int _intValue; Vector3 _vector3Value; Vector2 _vector2Value; // The type flags std::size_t _type; public: Argument() : _doubleValue(0), _intValue(0), _vector3Value(0,0,0), _vector2Value(0,0), _type(ARGTYPE_VOID) {} // String => Argument constructor Argument(const std::string& str) : _strValue(str), _doubleValue(string::convert(str)), _intValue(string::convert(str)), _vector3Value(string::convert(str)), _vector2Value(Vector2(str)), _type(ARGTYPE_STRING) { tryNumberConversion(); tryVectorConversion(); } // Double => Argument constructor Argument(const double d) : _strValue(string::to_string(d)), _doubleValue(d), _intValue(static_cast(d)), _vector3Value(d,d,d), _vector2Value(d,d), _type(ARGTYPE_DOUBLE) { // Enable INT flag if double value is rounded if (lrint(_doubleValue) == _intValue) { _type |= ARGTYPE_INT; } } // Int => Argument constructor Argument(const int i) : _strValue(string::to_string(i)), _doubleValue(static_cast(i)), _intValue(i), _vector3Value(i,i,i), _vector2Value(i,i), _type(ARGTYPE_INT|ARGTYPE_DOUBLE) // INT can be used as DOUBLE too {} // Vector3 => Argument constructor Argument(const Vector3& v) : _strValue(string::to_string(v[0]) + " " + string::to_string(v[1]) + " " + string::to_string(v[2])), _doubleValue(v.getLength()), _intValue(static_cast(v.getLength())), _vector3Value(v), _vector2Value(v[0], v[1]), _type(ARGTYPE_VECTOR3) {} // Vector2 => Argument constructor Argument(const Vector2& v) : _strValue(string::to_string(v[0]) + " " + string::to_string(v[1]) + " " + string::to_string(v[2])), _doubleValue(v.getLength()), _intValue(static_cast(v.getLength())), _vector3Value(v[0], v[1], 0), _vector2Value(v), _type(ARGTYPE_VECTOR2) {} // Copy Constructor Argument(const Argument& other) : _strValue(other._strValue), _doubleValue(other._doubleValue), _intValue(other._intValue), _vector3Value(other._vector3Value), _vector2Value(other._vector2Value), _type(other._type) {} std::size_t getType() const { return _type; } std::string getString() const { return _strValue; } int getInt() const { return _intValue; } double getDouble() const { return _doubleValue; } Vector3 getVector3() const { return _vector3Value; } Vector2 getVector2() const { return _vector2Value; } private: void tryNumberConversion() { // Try to cast the string value to numbers try { _intValue = boost::lexical_cast(_strValue); // cast succeeded _type |= ARGTYPE_INT; } catch (boost::bad_lexical_cast) {} try { _doubleValue = boost::lexical_cast(_strValue); // cast succeeded _type |= ARGTYPE_DOUBLE; } catch (boost::bad_lexical_cast) {} } void tryVectorConversion() { // Use a stringstream to parse the string std::stringstream strm(_strValue); strm << std::skipws; // Try converting the first two values strm >> _vector2Value.x(); strm >> _vector2Value.y(); if (!strm.fail()) { _type |= ARGTYPE_VECTOR2; // Try to parse the third value strm >> _vector3Value.z(); if (!strm.fail()) { // Third value successfully parsed _type |= ARGTYPE_VECTOR3; // Copy the two values from the parsed Vector2 _vector3Value.x() = _vector2Value.x(); _vector3Value.y() = _vector2Value.y(); } } } }; typedef std::vector ArgumentList; /** * greebo: A command target must take an ArgumentList argument, like this: * * void doSomething(const ArgumentList& args); * * This can be both a free function and a member function. */ typedef std::function Function; // A command signature consists just of arguments, no return types class Signature : public std::vector { public: Signature() {} // Additional convenience constructors Signature(std::size_t type1) { push_back(type1); } Signature(std::size_t type1, std::size_t type2) { push_back(type1); push_back(type2); } Signature(std::size_t type1, std::size_t type2, std::size_t type3) { push_back(type1); push_back(type2); push_back(type3); } Signature(std::size_t type1, std::size_t type2, std::size_t type3, std::size_t type4) { push_back(type1); push_back(type2); push_back(type3); push_back(type4); } }; /** * greebo: Auto-completion information returned by the CommandSystem * when the user is entering a partial command. */ struct AutoCompletionInfo { // The command prefix this info is referring to std::string prefix; // The candidaes, alphabetically ordered, case-insensitively typedef std::vector Candidates; Candidates candidates; }; class ICommandSystem : public RegisterableModule { public: /** * Visit each command/bind using the given lambda. The functor is going to be called * with the command name as argument. */ virtual void foreachCommand(const std::function& functor) = 0; /** * greebo: Declares a new command with the given signature. */ virtual void addCommand(const std::string& name, Function func, const Signature& signature = Signature()) = 0; /** * Remove a named command. */ virtual void removeCommand(const std::string& name) = 0; /** * greebo: Define a new statement, which consists of a name and a * string to execute. * * Consider this as some sort of macro. * * @statementName: The name of the statement, e.g. "exportASE" * @string: The string to execute. * @saveStatementToRegistry: when TRUE (default) this statement/bind * is saved to the registry at program shutdown. Pass FALSE if you * don't want to let this statement persist between sessions. */ virtual void addStatement(const std::string& statementName, const std::string& string, bool saveStatementToRegistry = true) = 0; /** * Visit each statement (bind) using the given lambda. The functor is going to be called * with the statement name as argument. */ virtual void foreachStatement(const std::function& functor, bool customStatementsOnly = false) = 0; /** * Returns the signature for the named command or bind. Statements * always have an empty signature. */ virtual Signature getSignature(const std::string& name) = 0; /** * greebo: Executes the given string as if the user had typed it * in the command console. The passed string can be a sequence of * statements separated by semicolon ';' characters. Each statement * can have zero or more arguments, separated by spaces. * * It is possible to pass string arguments by using * double- or single-quote characters. * e.g. "This; string; will be; treated as a whole". * * The last command needs not to be delimited by a semicolon. * * Example: nudgeLeft; nudgeRight -1 0 0; write "Bla! Test" */ virtual void execute(const std::string& input) = 0; /** * Execute the named command with the given arguments. */ virtual void executeCommand(const std::string& name) = 0; virtual void executeCommand(const std::string& name, const Argument& arg1) = 0; virtual void executeCommand(const std::string& name, const Argument& arg1, const Argument& arg2) = 0; virtual void executeCommand(const std::string& name, const Argument& arg1, const Argument& arg2, const Argument& arg3) = 0; // For more than 3 arguments, use this method to pass a vector of arguments virtual void executeCommand(const std::string& name, const ArgumentList& args) = 0; /** * greebo: Returns autocompletion info for the given prefix. */ virtual AutoCompletionInfo getAutoCompletionInfo(const std::string& prefix) = 0; }; typedef std::shared_ptr ICommandSystemPtr; } // namespace cmd const std::string MODULE_COMMANDSYSTEM("CommandSystem"); // This is the accessor for the commandsystem inline cmd::ICommandSystem& GlobalCommandSystem() { // Cache the reference locally static cmd::ICommandSystem& _cmdSystem( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_COMMANDSYSTEM) ) ); return _cmdSystem; } #endif /* _ICOMMANDSYSTEM_H_ */ DarkRadiant-2.0.2/include/icounter.h000066400000000000000000000023231245424655700173410ustar00rootroot00000000000000#ifndef ICOUNTER_H_ #define ICOUNTER_H_ #include #include "imodule.h" class ICounter { public: class Observer { public: virtual ~Observer() {} // Gets called by the Counter class on count change virtual void countChanged() = 0; }; /** Destructor */ virtual ~ICounter() {} /** greebo: Decrements/increments the counter. */ virtual void increment() = 0; virtual void decrement() = 0; /** greebo: Returns the current count. */ virtual std::size_t get() const = 0; }; // Known counters enum CounterType { counterBrushes, counterPatches, counterEntities, }; const std::string MODULE_COUNTER("Counters"); /** greebo: This abstract class defines the interface to the core application. * Use this to access methods from the main codebase in radiant/ */ class ICounterManager : public RegisterableModule { public: // Returns the Counter object of the given type virtual ICounter& getCounter(CounterType counter) = 0; }; inline ICounterManager& GlobalCounters() { // Cache the reference locally static ICounterManager& _counters( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_COUNTER) ) ); return _counters; } #endif /*ICOUNTER_H_*/ DarkRadiant-2.0.2/include/icurve.h000066400000000000000000000020661245424655700170120ustar00rootroot00000000000000#ifndef ICURVE_H_ #define ICURVE_H_ #include "inode.h" class CurveNode { public: /** destructor */ virtual ~CurveNode() {} /** greebo: Returns true if the curve has 0 control points. */ virtual bool hasEmptyCurve() = 0; /** greebo: Appends a control point at the end of the chain. */ virtual void appendControlPoints(unsigned int numPoints) = 0; /** greebo: As the name states, this removes the selected * control points from the curve. */ virtual void removeSelectedControlPoints() = 0; /** greebo: This inserts a control point BEFORE each * selected control point of the curve. * Naturally, this doesn't work if the first vertex * is selected. */ virtual void insertControlPointsAtSelected() = 0; /** greebo: Converts the type of the curve from CatmullRom * to NURBS and vice versa. */ virtual void convertCurveType() = 0; }; typedef std::shared_ptr CurveNodePtr; inline CurveNodePtr Node_getCurve(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } #endif /*ICURVE_H_*/ DarkRadiant-2.0.2/include/idatastream.h000066400000000000000000000046261245424655700200170ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_IDATASTREAM_H) #define INCLUDED_IDATASTREAM_H #include class StreamBase { public: virtual ~StreamBase() {} typedef std::size_t size_type; typedef unsigned char byte_type; }; /// \brief A read-only byte-stream. class InputStream : public StreamBase { public: /// \brief Attempts to read the next \p length bytes from the stream to \p buffer. /// Returns the number of bytes actually stored in \p buffer. virtual size_type read(byte_type* buffer, size_type length) = 0; }; /// \brief A write-only byte-stream. class OutputStream : public StreamBase { public: /// \brief Attempts to write \p length bytes to the stream from \p buffer. /// Returns the number of bytes actually read from \p buffer. virtual size_type write(const byte_type* buffer, size_type length) = 0; }; class SeekableStream { public: typedef int offset_type; typedef std::size_t position_type; enum seekdir { beg, cur, end, }; virtual ~SeekableStream() {} /// \brief Sets the current \p position of the stream relative to the start. virtual position_type seek(position_type position) = 0; /// \brief Sets the current \p position of the stream relative to either the start, end or current position. virtual position_type seek(offset_type offset, seekdir direction) = 0; /// \brief Returns the current position of the stream. virtual position_type tell() const = 0; }; /// \brief A seekable read-only byte-stream. class SeekableInputStream : public InputStream, public SeekableStream { }; /// \brief A seekable write-only byte-stream. class SeekableOutputStream : public OutputStream, public SeekableStream { }; #endif DarkRadiant-2.0.2/include/idialogmanager.h000066400000000000000000000114271245424655700204610ustar00rootroot00000000000000#pragma once #include "iuimanager.h" #include namespace ui { class IDialog { public: virtual ~IDialog() {} enum Result { RESULT_CANCELLED = 0, RESULT_OK, RESULT_NO, RESULT_YES, }; /// Possible message types (used for IDialogManager::createMessageBox()) enum MessageType { /// Just a plain message with an OK button MESSAGE_CONFIRM, // Queries Yes//No from the user MESSAGE_ASK, /// Displays a warning message MESSAGE_WARNING, /// Displays an error message MESSAGE_ERROR, /// Has three options: Yes, No or Cancel MESSAGE_YESNOCANCEL, /// Save confirmation as per HIG 2.32/3.4.6.1 MESSAGE_SAVECONFIRMATION }; // Sets the dialog title virtual void setTitle(const std::string& title) = 0; // A handle to access dialog elements after addition typedef std::size_t Handle; typedef std::vector ComboBoxOptions; // ------------------- Elements ----------------------- /** * Adds a simple label at the current position in the dialog. * A unique handle is returned to allow for later value retrieval. * The elements are inserted in the order of calls, top to bottom. * In case of errors an invalid handle (==0) is returned. */ virtual Handle addLabel(const std::string& text) = 0; virtual Handle addComboBox(const std::string& label, const ComboBoxOptions& options) = 0; virtual Handle addEntryBox(const std::string& label) = 0; virtual Handle addPathEntry(const std::string& label, bool foldersOnly = false) = 0; virtual Handle addSpinButton(const std::string& label, double min, double max, double step, unsigned int digits) = 0; virtual Handle addCheckbox(const std::string& label) = 0; // ----------------- Element Value -------------------- // Retrieve or set an element's value by string virtual void setElementValue(const Handle& handle, const std::string& value) = 0; virtual std::string getElementValue(const Handle& handle) = 0; // ---------------------------------------------------- /** * Run the dialog an enter the main loop (block the application). * Returns the Dialog::Result, corresponding to the user's action. */ virtual Result run() = 0; }; typedef std::shared_ptr IDialogPtr; const IDialog::Handle INVALID_HANDLE = 0; class IFileChooser; typedef std::shared_ptr IFileChooserPtr; class IDirChooser; typedef std::shared_ptr IDirChooserPtr; class IDialogManager { public: // Virtual destructor virtual ~IDialogManager() {} /** * Create a new dialog. Note that the DialogManager will hold a reference * to this dialog internally to allow scripts to reference the Dialog class * without holding the shared_ptr on their own or using wrapper classes doing so. * * Every dialog features an OK and a Cancel button by default. * * @title: The string displayed on the dialog's window bar. * @type: the dialog type to create, determines e.g. which buttons are shown. * @parent: optional top-level widget this dialog should be parented to, defaults to * GlobalMainFrame's toplevel window if left at NULL. */ virtual IDialogPtr createDialog(const std::string& title, wxWindow* parent = NULL) = 0; /** * Create a simple message box, which can either notify the user about something, * queries "Yes"/"No" or displays an error message. It usually features * an icon according to the the MessageType passed (exclamation mark, error sign). * * @title: The string displayed on the message box window bar. * @text: The text/question to be displayed. * @type: the message type this dialog represents. * @parent: optional top-level widget this dialog should be parented to, defaults to * GlobalMainFrame().getMainWindow(). */ virtual IDialogPtr createMessageBox(const std::string& title, const std::string& text, IDialog::MessageType type, wxWindow* parent = NULL) = 0; /** * Acquire a new filechooser instance with the given parameters. * * @title: The dialog title. * @open: if TRUE this is asking for "Open" files, FALSE generates a "Save" dialog. * @pattern: the type "map", "prefab", this determines the file extensions. * @defaultExt: The default extension appended when the user enters * filenames without extension. */ virtual IFileChooserPtr createFileChooser(const std::string& title, bool open, const std::string& pattern = "", const std::string& defaultExt = "") = 0; /** * Acquire a new folder chooser instance with the given parameters. * * @title: The dialog title. */ virtual IDirChooserPtr createDirChooser(const std::string& title) = 0; }; } // namespace ui // Shortcut method inline ui::IDialogManager& GlobalDialogManager() { return GlobalUIManager().getDialogManager(); } DarkRadiant-2.0.2/include/ieclass.h000066400000000000000000000272311245424655700171410ustar00rootroot00000000000000/* Copyright (C) 1999-2006 Id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /** * \defgroup eclass Entity class manager * \file ieclass.h * \brief Entity Class definition loader API. * \ingroup eclass */ #pragma once #include "ModResource.h" #include "imodule.h" #include "math/Vector3.h" #include #include #include #include #include /* FORWARD DECLS */ class Shader; typedef std::shared_ptr ShaderPtr; class AABB; /** * Data structure representing a single attribute on an entity class. * * \ingroup eclass */ class EntityClassAttribute { private: /** * String references are shared_ptrs to save memory. * The actual string might be owned by another entity class we're inheriting from. */ typedef std::shared_ptr StringPtr; // Reference to the name string StringPtr _typeRef; // Reference to the name string StringPtr _nameRef; // Reference to the attribute value string StringPtr _valueRef; // Reference to the description string StringPtr _descRef; public: /** * The key type (string, bool etc.). */ const std::string& getType() const { return *_typeRef; } const StringPtr& getTypeRef() const { return _typeRef; } void setType(const std::string& type) { _typeRef.reset(new std::string(type)); } void setType(const StringPtr& typeRef) { _typeRef = typeRef; } /// The attribute key name, e.g. "model", "editor_displayFolder" etc const std::string& getName() const { return *_nameRef; } const StringPtr& getNameRef() const { return _nameRef; } /** * Direct reference to the value for easy access to the value. This reference * is pointing directly at the string owned by the ValueRef shared_ptr, * which in turn might be owned by a class we're inheriting from. */ const std::string& getValue() const { return *_valueRef; } const StringPtr& getValueRef() const { return _valueRef; } /** * Sets the value of this entity class attribute. This will break up any * inheritance and make this instance owner of its value string. */ void setValue(const std::string& value) { _valueRef.reset(new std::string(value)); } void setValue(const StringPtr& valueRef) { _valueRef = valueRef; } /** * The help text associated with the key (in the DEF file). */ const std::string& getDescription() const { return *_descRef; } const StringPtr& getDescriptionRef() const { return _descRef; } void setDescription(const std::string& desc) { _descRef.reset(new std::string(desc)); } void setDescription(const StringPtr& descRef) { _descRef = descRef; } /** * Is TRUE for inherited keyvalues. */ bool inherited; /** * Construct a non-inherited EntityClassAttribute, passing the actual strings * which will be owned by this class instance. */ EntityClassAttribute(const std::string& type_, const std::string& name_, const std::string& value_, const std::string& description_ = "") : _typeRef(new std::string(type_)), _nameRef(new std::string(name_)), _valueRef(new std::string(value_)), _descRef(new std::string(description_)), inherited(false) {} /** * Construct a inherited EntityClassAttribute with a true inherited flag. * The strings are taken from the inherited attribute. * Note: this is not a copy-constructor on purpose, to allow STL assignments to * copy the actual instance values. */ EntityClassAttribute(const EntityClassAttribute& parentAttr, bool inherited_) : _typeRef(parentAttr._typeRef), // take type string, _nameRef(parentAttr._nameRef), // name string, _valueRef(parentAttr._valueRef), // value string _descRef(parentAttr._descRef), // and description from the parent attribute inherited(inherited_) {} }; /** * IEntityClass shared pointer. */ class IEntityClass; typedef std::shared_ptr IEntityClassPtr; typedef std::shared_ptr IEntityClassConstPtr; /** * Entity class interface. An entity class represents a single type * of entity that can be created by the EntityCreator. Entity classes are parsed * from .DEF files during startup. * * Entity class attribute names are compared case-insensitively, as in the * Entity class. * * \ingroup eclass */ class IEntityClass : public ModResource { public: /// Signal emitted when entity class contents are changed or reloaded virtual sigc::signal changedSignal() const = 0; /// Get the name of this entity class virtual std::string getName() const = 0; /// Get the parent entity class or NULL if there is no parent virtual const IEntityClass* getParent() const = 0; /// Query whether this entity class represents a light. virtual bool isLight() const = 0; /* ENTITY CLASS SIZE */ /** * Query whether this entity has a fixed size. */ virtual bool isFixedSize() const = 0; /** * Return an AABB representing the declared size of this entity. This is * only valid for fixed size entities. * * @returns * AABB enclosing the "editor_mins" and "editor_maxs" points defined in the * entityDef. */ virtual AABB getBounds() const = 0; /* ENTITY CLASS COLOURS */ /// Return the display colour of this entity class virtual const Vector3& getColour() const = 0; /** * Get the named Shader used for rendering this entity class in * wireframe mode. */ virtual const std::string& getWireShader() const = 0; /** * Get the Shader used for rendering this entity class in * filled mode. */ virtual const std::string& getFillShader() const = 0; /* ENTITY CLASS ATTRIBUTES */ /** * Return a single named EntityClassAttribute from this EntityClass. * * @param name * The name of the EntityClassAttribute to find, interpreted case-insensitively. * * @return * A reference to the named EntityClassAttribute. If the named attribute is * not found, an empty EntityClassAttribute is returned. */ virtual EntityClassAttribute& getAttribute(const std::string& name) = 0; virtual const EntityClassAttribute& getAttribute(const std::string& name) const = 0; /** * Enumerate the EntityClassAttibutes in turn. * * \param visitor * Function that will be invoked for each EntityClassAttibute. * * \param editorKeys * true if editor keys (those which start with "editor_") should be passed * to the visitor, false if they should be skipped. */ virtual void forEachClassAttribute( std::function visitor, bool editorKeys = false ) const = 0; /* MODEL AND SKIN */ /** Retrieve the model path for this entity. * * @returns * The VFS model path, or the empty string if there is no model. */ virtual const std::string& getModelPath() const = 0; /** Get the model skin, or the empty string if there is no skin. */ virtual const std::string& getSkin() const = 0; /** * Returns true if this entity is of type or inherits from the * given entity class name. className is treated case-sensitively. */ virtual bool isOfType(const std::string& className) = 0; }; /** * Structure ontains the information of a model {} block as defined in a * Doom3 .def file. * * \ingroup eclass */ class IModelDef : public ModResource { public: bool resolved; std::string name; std::string mesh; std::string skin; std::string parent; typedef std::map Anims; Anims anims; std::string modName; IModelDef() : resolved(false), modName("base") {} std::string getModName() const { return modName; } }; typedef std::shared_ptr IModelDefPtr; /** * EntityClass visitor interface. * * \ingroup eclass */ class EntityClassVisitor { public: virtual ~EntityClassVisitor() {} virtual void visit(const IEntityClassPtr& eclass) = 0; }; /** * ModelDef visitor interface. * * \ingroup eclass */ class ModelDefVisitor { public: virtual ~ModelDefVisitor() {} virtual void visit(const IModelDefPtr& modelDef) = 0; }; const char* const MODULE_ECLASSMANAGER("EntityClassManager"); /** * EntityClassManager interface. The entity class manager is responsible for * maintaining a list of available entity classes which the EntityCreator can * insert into a map. * * \ingroup eclass */ class IEntityClassManager : public RegisterableModule { public: /// Signal emitted when all DEFs are reloaded virtual sigc::signal defsReloadedSignal() const = 0; /** * Return the IEntityClass corresponding to the given name, creating it if * necessary. If it is created, the has_brushes parameter will be used to * determine whether the new entity class should be brush-based or not. * * @deprecated * Use findClass() instead. */ virtual IEntityClassPtr findOrInsert(const std::string& name, bool has_brushes) = 0; /** * Lookup an entity class by name. If the class is not found, a null pointer * is returned. * * @param name * Name of the entity class to look up. */ virtual IEntityClassPtr findClass(const std::string& name) const = 0; /** * Iterate over all entity defs using the given visitor. */ virtual void forEachEntityClass(EntityClassVisitor& visitor) = 0; virtual void realise() = 0; virtual void unrealise() = 0; /** * greebo: This reloads the entityDefs and modelDefs from all files. Does not * change the scenegraph, only the contents of the EClass objects are * re-parsed. All IEntityClassPtrs remain valid, no entityDefs are removed. * * Note: This is NOT the same as unrealise + realise */ virtual void reloadDefs() = 0; /** * greebo: Finds the model def with the given name. Might return NULL if not found. */ virtual IModelDefPtr findModel(const std::string& name) const = 0; /** * Iterate over each ModelDef using the given visitor class. */ virtual void forEachModelDef(ModelDefVisitor& visitor) = 0; }; /** * Return the global EntityClassManager to the application. * * \ingroup eclass */ inline IEntityClassManager& GlobalEntityClassManager() { // Cache the reference locally static IEntityClassManager& _eclassMgr( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_ECLASSMANAGER) ) ); return _eclassMgr; } DarkRadiant-2.0.2/include/ientity.h000066400000000000000000000253531245424655700172060ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_IENTITY_H) #define INCLUDED_IENTITY_H #include "inode.h" #include "ipath.h" #include "imodule.h" #include "irender.h" #include "inameobserver.h" class IEntityClass; typedef std::shared_ptr IEntityClassPtr; typedef std::shared_ptr IEntityClassConstPtr; // Observes a single entity key value and gets notified on change class KeyObserver { public: virtual ~KeyObserver() {} /** * This event gets called when the observed keyvalue changes. * The new value is passed as argument, which can be an empty string. */ virtual void onKeyValueChanged(const std::string& newValue) = 0; }; class EntityKeyValue : public NameObserver { public: virtual ~EntityKeyValue() {} /** greebo: Retrieves the actual value of this key */ virtual const std::string& get() const = 0; /** greebo: Sets the value of this key */ virtual void assign(const std::string& other) = 0; /** greebo: Attaches/detaches a callback to get notified about * the key change. */ virtual void attach(KeyObserver& observer) = 0; virtual void detach(KeyObserver& observer) = 0; }; typedef std::shared_ptr EntityKeyValuePtr; /** * Interface for a map entity. The Entity is the main building block of a * map, and the uppermost layer in the scenegraph under the root node. Each * entity contains a arbitrary dictionary of strings ("properties" or * "spawnargs") containing information about this entity which is used by the * game engine to modify its behaviour, and may additionally contain child * primitives (brushes and patches) depending on its type. * * At the minimum, each Entity must contain three properties: "name" which * contains a map-unique string identifier, "classname" which identifies the * entity class to the game, and "origin" which stores the location of the * entity in 3-dimensional world space. * * A valid Id Tech 4 map must contain at least one entity: the * "worldspawn" which is the parent of all map geometry primitives. * * greebo: Note that keys are treated case-insensitively in Doom 3, so * the Entity class will return the same result for "MYKeY" as for "mykey". */ class Entity { public: // A container with key => value pairs typedef std::vector< std::pair > KeyValuePairs; /** * \brief * Abstract base class for entity observers. * * An entity observer receives notifications when keyvalues are inserted or * deleted on the entity it is observing. */ class Observer { public: virtual ~Observer() {} /** * \brief * Notification that a new key value has been inserted on the entity. */ virtual void onKeyInsert(const std::string& key, EntityKeyValue& value) { } /** * \brief * Notification that a key value has changed on the entity. */ virtual void onKeyChange(const std::string& key, const std::string& val) { } /** * \brief * Notification that a key value has been removed from the entity. */ virtual void onKeyErase(const std::string& key, EntityKeyValue& value) { } }; /** * Visitor class for keyvalues on an entity. An Entity::Visitor is provided * to an Entity via the Entity::forEachKeyValue() method, after which the * visitor's visit() method will be invoked for each keyvalue on the * Entity. */ struct Visitor { virtual ~Visitor() {} /** * The visit function which must be implemented by subclasses. * * @param key * The current key being visited. * * @param value * The value associated with the current key. */ virtual void visit(const std::string& key, const std::string& value) = 0; }; /** * Visitor class for keyvalues on an entity. An Entity::KeyValueVisitor is provided * to an Entity via the Entity::forEachKeyValue() method, after which the * visitor's visit() method will be invoked for each keyvalue on the Entity. */ struct KeyValueVisitor { virtual ~KeyValueVisitor() {} /** * The visit function which must be implemented by subclasses. * * @param key * The current key being visited. * * @param value * The actual keyvalue object associated with the current key. */ virtual void visit(const std::string& key, EntityKeyValue& value) = 0; }; virtual ~Entity() {} /** * Return the entity class object for this entity. */ virtual IEntityClassPtr getEntityClass() const = 0; /** * Enumerate key values on this entity using a Entity::Visitor class. */ virtual void forEachKeyValue(Visitor& visitor) const = 0; // Same as above, but this one is visiting the KeyValues itself, not just strings. virtual void forEachKeyValue(KeyValueVisitor& visitor) = 0; /** Set a key value on this entity. Setting the value to "" will * remove the key. * * @param key * The key to set. * * @param value * Value to give the key, or the empty string to remove the key. */ virtual void setKeyValue(const std::string& key, const std::string& value) = 0; /* Retrieve a key value from the entity. * * @param key * The key to retrieve. * * @returns * The current value for this key, or the empty string if it does not * exist. */ virtual std::string getKeyValue(const std::string& key) const = 0; /** * greebo: Checks whether the given key is inherited or not. * * @returns: TRUE if the value is inherited, * FALSE when it is not or when the key doesn't exist at all. */ virtual bool isInherited(const std::string& key) const = 0; /** * Return the list of Key/Value pairs matching the given prefix, case ignored. * * This method performs a search for all spawnargs whose key * matches the given prefix, with a suffix consisting of zero or more * arbitrary characters. For example, if "target" were specified as the * prefix, the list would include "target", "target0", "target127" etc. * * This operation may not have high performance, due to the need to scan * for matching names, therefore should not be used in performance-critical * code. * * @param prefix * The prefix to search for, interpreted case-insensitively. * * @return * A list of KeyValue pairs matching the provided prefix. This * list will be empty if there were no matches. */ virtual KeyValuePairs getKeyValuePairs(const std::string& prefix) const = 0; /** greebo: Returns true if the entity is a model. For Doom3, this is * usually true when the classname == "func_static" and * the non-empty spawnarg "model" != "name". */ virtual bool isModel() const = 0; virtual bool isContainer() const = 0; /** * \brief * Attach an Entity::Observer to this Entity. */ virtual void attachObserver(Observer* observer) = 0; /** * \brief * Detach an Entity::Observer from this Entity. */ virtual void detachObserver(Observer* observer) = 0; /** * Returns true if this entity is of type or inherits from the * given entity class name. className is treated case-sensitively. */ virtual bool isOfType(const std::string& className) = 0; }; /// Interface for a INode subclass that contains an Entity class IEntityNode : public virtual IRenderEntity, public virtual scene::INode { public: virtual ~IEntityNode() {} /// Get a modifiable reference to the contained Entity virtual Entity& getEntity() = 0; /** * greebo: Tells the entity to reload the child model. This usually * includes removal of the child model node and triggering * a "skin changed" event. */ virtual void refreshModel() = 0; }; typedef std::shared_ptr IEntityNodePtr; inline Entity* Node_getEntity(const scene::INodePtr& node) { IEntityNodePtr entityNode = std::dynamic_pointer_cast(node); if (entityNode != NULL) { return &(entityNode->getEntity()); } return NULL; } inline bool Node_isEntity(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node) != NULL; } /** * greebo: This is a visitor class copying all visited spawnargs to * the target entity passed to the constructor (except classname). */ class EntityCopyingVisitor : public Entity::Visitor { // the target entity Entity& _entity; public: EntityCopyingVisitor(Entity& entity) : _entity(entity) {} virtual ~EntityCopyingVisitor() {} // Required visit function, copies keyvalues (except classname) between // entities void visit(const std::string& key, const std::string& value) { if (key != "classname") { _entity.setKeyValue(key, value); } } }; const std::string MODULE_ENTITYCREATOR("Doom3EntityCreator"); /** * \brief * Interface for the entity creator module. */ class EntityCreator : public RegisterableModule { public: virtual ~EntityCreator() {} /// Create an entity node with the given entity class. virtual IEntityNodePtr createEntity(const IEntityClassPtr& eclass) = 0; /// Connect the two given entity nodes using the "target" system. virtual void connectEntities(const scene::INodePtr& source, const scene::INodePtr& target) = 0; }; inline EntityCreator& GlobalEntityCreator() { // Cache the reference locally static EntityCreator& _entityCreator( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_ENTITYCREATOR) ) ); return _entityCreator; } #endif DarkRadiant-2.0.2/include/ientityinspector.h000066400000000000000000000053351245424655700211330ustar00rootroot00000000000000#pragma once #include "imodule.h" class Entity; class wxPanel; class wxWindow; namespace ui { /** * greebo: Some entity property editors may implement this interface, * to allow modules to call their dialog windows directly. */ class IPropertyEditorDialog { public: virtual ~IPropertyEditorDialog() {} /** * greebo: Run the dialog, returning the new value for the named property. */ virtual std::string runDialog(Entity* entity, const std::string& key) = 0; }; typedef std::shared_ptr IPropertyEditorDialogPtr; class IPropertyEditor; typedef std::shared_ptr IPropertyEditorPtr; /** * Abstract base for a PropertyEditor which provides * a user interface for editing spawnargs (entity keyvalues). */ class IPropertyEditor { public: virtual ~IPropertyEditor() {} /** * greebo: Retrieve the widget for packing this into a parent container. */ virtual wxPanel* getWidget() = 0; /** * Clone method for virtual construction. This method must create a new * PropertyEditor of the same type as the derive class which is implementing * the method. * * @param parent * The parent window, needed by the code to pack the widgets of this editor. * * @param entity * The Entity to edit. * * @param key * The key name which this PropertyEditor is displaying. * * @param options * PropertyEditor-specific options string, from the .game file. */ virtual IPropertyEditorPtr createNew(wxWindow* parent, Entity* entity, const std::string& key, const std::string& options) = 0; }; class IEntityInspector : public RegisterableModule { public: /** * greebo: Retrieve the widget for packing this into a parent container. */ virtual wxPanel* getWidget() = 0; /** * Registers the given property editor and associates it with the given entity key. * (The string key is interpreted as regular expression.) */ virtual void registerPropertyEditor(const std::string& key, const IPropertyEditorPtr& editor) = 0; /** * Looks up a property editor for the given key. */ virtual IPropertyEditorPtr getRegisteredPropertyEditor(const std::string& key) = 0; /** * Removes the property editor for the given key. */ virtual void unregisterPropertyEditor(const std::string& key) = 0; // Lets the EntityInspector restore its settings from the Registry virtual void restoreSettings() = 0; }; } // namespace ui const std::string MODULE_ENTITYINSPECTOR("EntityInspector"); inline ui::IEntityInspector& GlobalEntityInspector() { // Cache the reference locally static ui::IEntityInspector& _inspector( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_ENTITYINSPECTOR) ) ); return _inspector; } DarkRadiant-2.0.2/include/ieventmanager.h000066400000000000000000000147431245424655700203470ustar00rootroot00000000000000#pragma once #include #include #include #include #include "imodule.h" #include class wxWindow; class wxMenuItem; class wxToolBarToolBase; class wxButton; class wxToggleButton; class wxMouseEvent; class wxKeyEvent; class wxToolBar; class wxTopLevelWindow; /* greebo: Below are the actual events that are "read" by the views/observers to * interpret the mouseclicks. */ namespace ui { // Enum used for events tracking the key state enum KeyEventType { KeyPressed, KeyReleased, }; typedef std::function KeyStateChangeCallback; } // namespace ui class IEvent { public: // destructor virtual ~IEvent() {} // Handles the incoming keyUp / keyDown calls virtual void keyUp() = 0; virtual void keyDown() = 0; // Enables/disables this event virtual void setEnabled(const bool enabled) = 0; // Connect a wxTopLevelWindow to this event virtual void connectTopLevelWindow(wxTopLevelWindow* widget) = 0; virtual void disconnectTopLevelWindow(wxTopLevelWindow* widget) = 0; virtual void connectToolItem(wxToolBarToolBase* item) = 0; virtual void disconnectToolItem(wxToolBarToolBase* item) = 0; virtual void connectMenuItem(wxMenuItem* item) = 0; virtual void disconnectMenuItem(wxMenuItem* item) = 0; virtual void connectButton(wxButton* button) = 0; virtual void disconnectButton(wxButton* button) = 0; virtual void connectToggleButton(wxToggleButton* button) = 0; virtual void disconnectToggleButton(wxToggleButton* button) = 0; // Exports the current state to the widgets virtual void updateWidgets() = 0; // Returns true if this event could be toggled (returns false if the event is not a Toggle). virtual bool setToggled(const bool toggled) = 0; /** greebo: Returns true if the event is a Toggle (or a subtype of a Toggle) */ virtual bool isToggle() const = 0; // Returns true, if this is any empty Event (no command attached) virtual bool empty() const = 0; }; typedef std::shared_ptr IEventPtr; class IAccelerator { public: // destructor virtual ~IAccelerator() {} // Get/set the GDK key value virtual void setKey(const unsigned int key) = 0; virtual unsigned int getKey() const = 0; // Get/Set the modifier flags virtual void setModifiers(const unsigned int modifiers) = 0; virtual unsigned int getModifiers() const = 0; // Connect this IEvent to this accelerator virtual void connectEvent(const IEventPtr& event) = 0; }; // Event visitor class class IEventVisitor { public: // destructor virtual ~IEventVisitor() {} virtual void visit(const std::string& eventName, const IEventPtr& event) = 0; }; const std::string MODULE_EVENTMANAGER("EventManager"); // The function object invoked when a ToggleEvent is changing states // The passed boolean indicates the new toggle state (true = active/toggled) typedef std::function ToggleCallback; class IEventManager : public RegisterableModule { public: /* Create an accelerator using the given arguments and add it to the list * * @key: The symbolic name of the key, e.g. "A", "Esc" * @modifierStr: A string containing the modifiers, e.g. "Shift+Control" or "Shift" * * @returns: the pointer to the newly created accelerator object */ virtual IAccelerator& addAccelerator(const std::string& key, const std::string& modifierStr) = 0; // The same as above, but with GDK event values as argument (event->keyval, event->state) virtual IAccelerator& addAccelerator(wxKeyEvent& ev) = 0; virtual IAccelerator& findAccelerator(const IEventPtr& event) = 0; virtual std::string getAcceleratorStr(const IEventPtr& event, bool forMenu) = 0; // Add a command and specify the statement to execute when triggered virtual IEventPtr addCommand(const std::string& name, const std::string& statement, bool reactOnKeyUp = false) = 0; // Creates a new keyevent that calls the given callback when invoked virtual IEventPtr addKeyEvent(const std::string& name, const ui::KeyStateChangeCallback& keyStateChangeCallback) = 0; // Creates a new toggle event that calls the given callback when toggled virtual IEventPtr addToggle(const std::string& name, const ToggleCallback& onToggled) = 0; virtual IEventPtr addWidgetToggle(const std::string& name) = 0; virtual IEventPtr addRegistryToggle(const std::string& name, const std::string& registryKey) = 0; // Set the according Toggle command (identified by ) to the bool virtual void setToggled(const std::string& name, const bool toggled) = 0; // Returns the pointer to the command specified by the commandName virtual IEventPtr findEvent(const std::string& name) = 0; virtual IEventPtr findEvent(wxKeyEvent& ev) = 0; // Retrieves the event name for the given IEventPtr virtual std::string getEventName(const IEventPtr& event) = 0; // Connects the given accelerator to the given command (identified by the string) virtual void connectAccelerator(IAccelerator& accelerator, const std::string& command) = 0; // Disconnects the given command from any accelerators virtual void disconnectAccelerator(const std::string& command) = 0; // Before destruction, it's advisable to disconnect any events from a toolbar's items virtual void disconnectToolbar(wxToolBar* toolbar) = 0; // Loads the shortcut->command associations from the XMLRegistry virtual void loadAccelerators() = 0; // Enables/Disables the specified command virtual void enableEvent(const std::string& eventName) = 0; virtual void disableEvent(const std::string& eventName) = 0; // Removes the given event and disconnects all accelerators from it virtual void removeEvent(const std::string& eventName) = 0; // Visit each event with the given class virtual void foreachEvent(IEventVisitor& eventVisitor) = 0; /* greebo: Retrieves a string representation of the modifiers set in * (This is used internally by Modifers class) * * @forMenu: * yields a string of type: Ctrl-Shift * results in a string of type: CTRL+SHIFT */ virtual std::string getModifierStr(const unsigned int modifierFlags, bool forMenu = false) = 0; /* greebo: Retrieves the string representation of the given event */ virtual std::string getEventStr(wxKeyEvent& ev) = 0; }; typedef std::shared_ptr IEventManagerPtr; // This is the accessor for the event manager inline IEventManager& GlobalEventManager() { // Cache the reference locally static IEventManager& _eventManager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_EVENTMANAGER) ) ); return _eventManager; } DarkRadiant-2.0.2/include/ifilechooser.h000066400000000000000000000032251245424655700201660ustar00rootroot00000000000000#pragma once #include #include class wxWindow; namespace ui { /** * The FileChooser class can be used to query a path from the user. * Use the GlobalDialogManager module to acquire a new instance of this class. */ class IFileChooser { public: virtual ~IFileChooser() {} // Lets the dialog start at a certain path virtual void setCurrentPath(const std::string& path) = 0; // Pre-fills the currently selected file virtual void setCurrentFile(const std::string& file) = 0; /** * Returns the selected filename (default extension * will be added if appropriate). */ virtual std::string getSelectedFileName() = 0; /** * greebo: Displays the dialog and enters the main loop. * Returns the filename or "" if the user hit cancel. * * The returned file name is normalised using the os::standardPath() method. */ virtual std::string display() = 0; }; typedef std::shared_ptr IFileChooserPtr; /** * The DirChooser class can be used to query a directory from the user. * Use the GlobalDialogManager module to acquire a new instance of this class. */ class IDirChooser { public: virtual ~IDirChooser() {} // Lets the dialog start at a certain path virtual void setCurrentPath(const std::string& path) = 0; /** * Returns the selected folder name. */ virtual std::string getSelectedFolderName() = 0; /** * greebo: Displays the dialog and enters the main loop. * Returns the filename or "" if the user hit cancel. * * The returned file name is normalised using the os::standardPath() method. */ virtual std::string display() = 0; }; typedef std::shared_ptr IDirChooserPtr; } // namespace ui DarkRadiant-2.0.2/include/ifilesystem.h000066400000000000000000000123411245424655700200470ustar00rootroot00000000000000#pragma once /** * \defgroup vfs Virtual filesystem * \file ifilesystem.h * Interface types for the VFS module. */ #include #include #include #include "imodule.h" class ArchiveFile; typedef std::shared_ptr ArchiveFilePtr; class ArchiveTextFile; typedef std::shared_ptr ArchiveTextFilePtr; class Archive; class ModuleObserver; const std::string MODULE_VIRTUALFILESYSTEM("VirtualFileSystem"); /** * Main interface for the virtual filesystem. * * The virtual filesystem provides a unified view of the contents of Doom 3's * base and mod subdirectories, including the contents of PK4 files. Assets can * be retrieved using a single unique path, without needing to know whereabouts * in the physical filesystem the asset is located. * * \ingroup vfs */ class VirtualFileSystem : public RegisterableModule { public: // Functor taking the filename as argument. The filename is relative // to the base path passed to the GlobalFileSystem().foreach*() method. typedef std::function VisitorFunc; /** * Interface for VFS observers. * * A VFS observer is automatically notified of events relating to the * VFS, including startup and shutdown. */ class Observer { public: virtual ~Observer() {} /** * Notification of VFS initialisation. * * This method is invoked for all VFS observers when the VFS is * initialised. An empty default implementation is provided. */ virtual void onFileSystemInitialise() {} /** * Notification of VFS shutdown. * * This method is invoked for all VFS observers when the VFS is shut * down. An empty default implementation is provided. */ virtual void onFileSystemShutdown() {} }; /// \brief Adds a root search \p path. /// Called before \c initialise. virtual void initDirectory(const std::string& path) = 0; /// \brief Initialises the filesystem. /// Called after all root search paths have been added. virtual void initialise() = 0; /// \brief Shuts down the filesystem. virtual void shutdown() = 0; // greebo: Adds/removes observers to/from the VFS virtual void addObserver(Observer& observer) = 0; virtual void removeObserver(Observer& observer) = 0; // Returns the number of files in the VFS matching the given filename virtual int getFileCount(const std::string& filename) = 0; /// \brief Returns the file identified by \p filename opened in binary mode, or 0 if not found. // greebo: Note: expects the filename to be normalised (forward slashes, trailing slash). virtual ArchiveFilePtr openFile(const std::string& filename) = 0; /// \brief Returns the file identified by \p filename opened in binary mode, or 0 if not found. // This is a variant of openFile taking an absolute path as argument. virtual ArchiveFilePtr openFileInAbsolutePath(const std::string& filename) = 0; /// \brief Returns the file identified by \p filename opened in text mode, or 0 if not found. virtual ArchiveTextFilePtr openTextFile(const std::string& filename) = 0; /// \brief Returns the file identified by \p filename opened in text mode, or NULL if not found. /// This is a variant of openTextFile taking an absolute path as argument. virtual ArchiveTextFilePtr openTextFileInAbsolutePath(const std::string& filename) = 0; /// \brief Opens the file identified by \p filename and reads it into \p buffer, or sets *\p buffer to 0 if not found. /// Returns the size of the buffer allocated, or undefined value if *\p buffer is 0; /// The caller must free the allocated buffer by calling \c freeFile /// \deprecated Deprecated - use \c openFile. virtual std::size_t loadFile(const std::string& filename, void **buffer) = 0; /// \brief Frees the buffer returned by \c loadFile. /// \deprecated Deprecated. virtual void freeFile(void *p) = 0; /// \brief Calls the visitor function for each file under \p basedir matching \p extension. /// Use "*" as \p extension to match all file extensions. virtual void forEachFile(const std::string& basedir, const std::string& extension, const VisitorFunc& visitorFunc, std::size_t depth = 1) = 0; // Similar to forEachFile, this routine traverses an absolute path // searching for files matching a certain extension and invoking // the givne visitor functor on each occurrence. virtual void forEachFileInAbsolutePath(const std::string& path, const std::string& extension, const VisitorFunc& visitorFunc, std::size_t depth = 1) = 0; /// \brief Returns the absolute filename for a relative \p name, or "" if not found. virtual std::string findFile(const std::string& name) = 0; /// \brief Returns the filesystem root for an absolute \p name, or "" if not found. /// This can be used to convert an absolute name to a relative name. virtual std::string findRoot(const std::string& name) = 0; }; inline VirtualFileSystem& GlobalFileSystem() { // Cache the reference locally static VirtualFileSystem& _vfs( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_VIRTUALFILESYSTEM) ) ); return _vfs; } DarkRadiant-2.0.2/include/ifiletypes.h000066400000000000000000000101321245424655700176630ustar00rootroot00000000000000#pragma once #include #include #include "imodule.h" /** * Simple structure to store a file pattern (e.g. "*.map") * along with its name (e.g. "Map files") and extension. * * If a module has been registering itself for a certain * filetype/extension combo, its name is in associatedModule. */ struct FileTypePattern { // The user-friendly name ("Doom 3 Map") std::string name; // The extension in lowercase ("map") std::string extension; // The mask pattern ("*.map") std::string pattern; // The module associated with this specific extension // This is initially empty, will be filled when // GlobalFiletypes().registerModule() is called. std::string associatedModule; // Constructor with optional initialisation parameters FileTypePattern(const std::string& name_ = "", const std::string& extension_ = "", const std::string& pattern_ = "") : name(name_), extension(extension_), pattern(pattern_) {} }; typedef std::list FileTypePatterns; const char* const MODULE_FILETYPES = "FileTypes"; /** * Interface for the FileType registry module. This module retains a list of * FileTypePattern objects along with their associated module names. */ class IFileTypeRegistry : public RegisterableModule { public: /** * greebo: Registers an extension (e.g. "map") for a certain file type ("prefab"). * Common file types are "map", "prefab" and "model", each of them can have one * or more extensions associated in a certain order ("prefab" => "pfb", "map", "reg", * or "map" => "map", "reg", "pfb"). The order is important e.g. for the file * filters in the Map Open dialog. * * The pattern argument is a structure containing the lowercase extensions as well * as the display name and the filter pattern used in the file chooser dialogs. * * If an extension is already associated with the given filetype, it is ignored. * New extensions are added to the end of the list. * * @param fileType: the file type which an extension should be associated to. * @param pattern: the extension as well as the display name and a pattern ("*.map") */ virtual void registerPattern(const std::string& fileType, const FileTypePattern& pattern) = 0; /** * Retrieve a list of patterns for the given file type (e.g. "prefab" or "map"). * * @returns: a list of FileTypePatterns containing extension, display name, etc. */ virtual FileTypePatterns getPatternsForType(const std::string& fileType) = 0; /** * Registers the named module with the extension for the given fileType. * * Example: Associate the module "ModelLoaderASE" with the "ase" extension * for the "model" filetype. * * Only a single module can be registered for a file type/extension combo * at any time. * * @returns: TRUE if the module could be registered, FALSE if the filetype/extension * combination is already "in use" or the file type is not registered at all. */ virtual bool registerModule(const std::string& fileType, const std::string& extension, const std::string& moduleName) = 0; /** * Removes the module from all filetypes - usually done at module shutdown. */ virtual void unregisterModule(const std::string& moduleName) = 0; /** * Find the name of the module which is able to handle the given extension. * * Note that Map Loader Modules are handled slightly differently - they don't * add themselves directly to a specific extension, but register in the * GlobalMapFormatManager(). The Map loading algorithm is querying the format * manager for any module that is capable of loading the map, so findModule() * isn't necessary here. The main purpose of findModule() is to deliver * a ModelLoader for a specific model file extension, e.g. "ase" or "lwo". */ virtual std::string findModule(const std::string& fileType, const std::string& extension) = 0; }; inline IFileTypeRegistry& GlobalFiletypes() { // Cache the reference locally static IFileTypeRegistry& _fileTypes( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_FILETYPES) ) ); return _fileTypes; } DarkRadiant-2.0.2/include/ifilter.h000066400000000000000000000134461245424655700171570ustar00rootroot00000000000000#pragma once #include "imodule.h" #include "inode.h" #include #include #include #include /** * This structure defines a simple filtercriterion as used by the Filtersystem */ class FilterRule { public: enum Type { TYPE_TEXTURE, TYPE_ENTITYCLASS, TYPE_OBJECT, TYPE_ENTITYKEYVALUE, }; // The rule type Type type; // The entity key, only applies for type "entitykeyvalue" std::string entityKey; // the match expression regex std::string match; // true for action="show", false for action="hide" bool show; private: // Private Constructor, use the named constructors below FilterRule(const Type type_, const std::string& match_, bool show_) : type(type_), match(match_), show(show_) {} // Alternative private constructor for the entityKeyValue type FilterRule(const Type type_, const std::string& entityKey_, const std::string& match_, bool show_) : type(type_), entityKey(entityKey_), match(match_), show(show_) {} public: // Named constructors // Regular constructor for the non-entitykeyvalue types static FilterRule Create(const Type type, const std::string& match, bool show) { assert(type != TYPE_ENTITYKEYVALUE); return FilterRule(type, match, show); } // Constructor for the entity key value type static FilterRule CreateEntityKeyValueRule(const std::string& key, const std::string& match, bool show) { return FilterRule(TYPE_ENTITYKEYVALUE, key, match, show); } }; typedef std::vector FilterRules; /** Visitor interface for evaluating the available filters in the * FilterSystem. */ struct IFilterVisitor { virtual ~IFilterVisitor() {} // Visit function virtual void visit(const std::string& filterName) = 0; }; const char* const MODULE_FILTERSYSTEM = "FilterSystem"; // Forward declaration class Entity; /** * \brief * Interface for the FilterSystem * * The filter system provides a mechanism by which certain objects or materials * can be hidden from rendered views. */ class FilterSystem : public RegisterableModule { public: /// Signal emitted when the state of filters has changed virtual sigc::signal filtersChangedSignal() const = 0; /** * greebo: Updates all the "Filtered" status of all Instances * in the scenegraph based on the current filter settings. */ virtual void update() = 0; /** * greebo: Lets the filtersystem update the specified subgraph only, * which includes the given node and all children. */ virtual void updateSubgraph(const scene::INodePtr& root) = 0; /** Visit the available filters, passing each filter's text * name to the visitor. * * @param visitor * Visitor class implementing the IFilterVisitor interface. */ virtual void forEachFilter(IFilterVisitor& visitor) = 0; /** Set the state of the named filter. * * @param filter * The filter to toggle. * * @param state * true if the filter should be active, false otherwise. */ virtual void setFilterState(const std::string& filter, bool state) = 0; /** greebo: Returns the state of the given filter. * * @returns: true or false, depending on the filter state. */ virtual bool getFilterState(const std::string& filter) = 0; /** * Activates or deactivates all known filters. */ virtual void setAllFilterStates(bool state) = 0; /** greebo: Returns the event name of the given filter. This is needed * to create the toggle event to menus/etc. */ virtual std::string getFilterEventName(const std::string& filter) = 0; /** Test if a given item should be visible or not, based on the currently- * active filters. * * @param item * The filter type to query * * @param name * String name of the item to query. * * @returns * true if the item is visible, false otherwise. */ virtual bool isVisible(const FilterRule::Type type, const std::string& name) = 0; /** * Test if a given entity should be visible or not, based on the currently active filters. * * @param type * The filter type to query * * @param entity * The Entity to test * * @returns * true if the entity is visible, false otherwise. */ virtual bool isEntityVisible(const FilterRule::Type type, const Entity& entity) = 0; // ===== API for Filter management and editing ===== /** * greebo: Returns TRUE if the filter is read-only and can't be deleted. */ virtual bool filterIsReadOnly(const std::string& filter) = 0; /** * greebo: Adds a new filter to the system with the given ruleset. The new filter * is not set to read-only. * * @returns: TRUE on success, FALSE if the filter name already exists. */ virtual bool addFilter(const std::string& filterName, const FilterRules& ruleSet) = 0; /** * greebo: Removes the filter, returns TRUE on success. */ virtual bool removeFilter(const std::string& filter) = 0; /** * greebo: Renames the specified filter. This also takes care of renaming the corresponding command in the * EventManager class. * * @returns: TRUE on success, FALSE if the filter hasn't been found or is read-only. */ virtual bool renameFilter(const std::string& oldFilterName, const std::string& newFilterName) = 0; /** * greebo: Returns the ruleset of this filter, order is important. */ virtual FilterRules getRuleSet(const std::string& filter) = 0; /** * greebo: Applies the given criteria set to the named filter, replacing the existing set. * This applies to non-read-only filters only. * * @returns: TRUE on success, FALSE if filter not found or read-only. */ virtual bool setFilterRules(const std::string& filter, const FilterRules& ruleSet) = 0; }; inline FilterSystem& GlobalFilterSystem() { // Cache the reference locally static FilterSystem& _filterSystem( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_FILTERSYSTEM) ) ); return _filterSystem; } DarkRadiant-2.0.2/include/ifiltermenu.h000066400000000000000000000015221245424655700200340ustar00rootroot00000000000000#pragma once #include #include class wxMenu; namespace ui { /** * A class representing a Filters submenu, with a proper * getWidget() method for packing it into a parent container. * * Upon construction, the menu will be registered in the * global MenuManager. The destructor will remove it from there, * so the client needs to prevent this class from getting * out of scope too soon. * * Use the GlobalUIManager() interface to acquire * a new instance of this filter menu. */ class IFilterMenu { public: virtual ~IFilterMenu() {} // Constructs and returns the widget of a full filters menu // including submenu and the items. This can be packed into an // existing menu bar or toolitem right away. virtual wxMenu* getMenuWidget() = 0; }; typedef std::shared_ptr IFilterMenuPtr; } // namespace ui DarkRadiant-2.0.2/include/ifonts.h000066400000000000000000000070311245424655700170140ustar00rootroot00000000000000#pragma once #include "imodule.h" #include "irenderable.h" #include class Material; typedef std::shared_ptr MaterialPtr; namespace fonts { namespace q3font { // Default values of Quake 3 sourcecode. Don't change! const std::size_t GLYPH_COUNT_PER_FONT = 256; } // namespace // Container-class for Glyphs (== single font characters). class IGlyphInfo { public: int height; // number of scan lines int top; // top of glyph in buffer int bottom; // bottom of glyph in buffer int pitch; // width for copying int xSkip; // x adjustment int imageWidth; // width of actual image int imageHeight; // height of actual image float s; // x offset in image where glyph starts float t; // y offset in image where glyph starts float s2; float t2; std::string texture; // the texture name without extension, e.g. carleton_1_24 // The shader this glyph is associated with // this is NULL until the font is actually used ShaderPtr shader; }; typedef std::shared_ptr IGlyphInfoPtr; // Each D3 font has three resolutions enum Resolution { Resolution12, Resolution24, Resolution48, NumResolutions }; inline std::ostream& operator<< (std::ostream& os, Resolution res) { switch (res) { case Resolution12: os << "12"; break; case Resolution24: os << "24"; break; case Resolution48: os << "48"; break; default: assert(false); os << "Unrecognised"; break; } return os; } // Each font resolution has its own set of glyphs class IGlyphSet { public: virtual ~IGlyphSet() {} // 12, 24, 48 virtual Resolution getResolution() const = 0; // each set has 256 glyphs (q3font::GLYPH_COUNT_PER_FONT) virtual IGlyphInfoPtr getGlyph(std::size_t glyphIndex) const = 0; // Gets the scale for calculating the render font size virtual float getGlyphScale() const = 0; // Gets the maximum width of a glyph in this set virtual std::size_t getMaxGlyphWidth() const = 0; // Gets the maximum height of a glyph in this set virtual std::size_t getMaxGlyphHeight() const = 0; // Ensures that each glyph has a valid Shader virtual void realiseShaders() = 0; }; typedef std::shared_ptr IGlyphSetPtr; /** * Holds information about one specific font. * A font consists of three resolutions. */ class IFontInfo { public: virtual ~IFontInfo() {} // The name of the font, e.g. "carleton" virtual const std::string& getName() const = 0; // The language of this font virtual const std::string& getLanguage() const = 0; // Returns the glyphset for the specified resolution virtual IGlyphSetPtr getGlyphSet(Resolution resolution) = 0; }; typedef std::shared_ptr IFontInfoPtr; /** * greebo: Use the FontManager to load a specific font. The returned FontInfo structure * contains all the necessary info about the glyphs, as found in the font's DAT file. */ class IFontManager : public RegisterableModule { public: // Returns the info structure of a specific font (current language), // returns NULL if no font info is available yet virtual IFontInfoPtr findFontInfo(const std::string& name) = 0; }; } const std::string MODULE_FONTMANAGER("FontManager"); inline fonts::IFontManager& GlobalFontManager() { // Cache the reference locally static fonts::IFontManager& _fontManager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_FONTMANAGER) ) ); return _fontManager; } DarkRadiant-2.0.2/include/igame.h000066400000000000000000000047241245424655700166020ustar00rootroot00000000000000#ifndef IGAMEMANAGER_H_ #define IGAMEMANAGER_H_ #include "xmlutil/Node.h" #include "imodule.h" #include // String identifier for the game manager module const std::string MODULE_GAMEMANAGER("GameManager"); namespace game { /** * \brief * Interface for an object representing a single game type. */ class IGame { public: /** * \brief * Destructor */ virtual ~IGame() {} /** * \brief * Get a string key value from the game file. * * \param key * Name of the key to retrieve. If this key does not exist, a warning is * emitted and the empty string is returned. */ virtual std::string getKeyValue(const std::string& key) const = 0; /** * \brief * Search an XPath relative to the this game node. * * \param xpath * The relative XPath under the game node, including the initial * forward-slash(es). */ virtual xml::NodeList getLocalXPath(const std::string& path) const = 0; }; typedef std::shared_ptr IGamePtr; /** * \brief * Interface for the game management module. */ class IGameManager : public RegisterableModule { public: // Returns the setting for fs_game virtual const std::string& getFSGame() const = 0; // Returns the setting for fs_game_base (can be empty) virtual const std::string& getFSGameBase() const = 0; /** * greebo: Gets the mod path (e.g. ~/.doom3/gathers/). * Returns the mod base path if the mod path itself is empty. */ virtual const std::string& getModPath() const = 0; /** * greebo: Returns the mod base path (e.g. ~/.doom3/darkmod/), * can be an empty string if fs_game_base is not set. */ virtual const std::string& getModBasePath() const = 0; /** greebo: Returns the current Game (shared_ptr). */ virtual IGamePtr currentGame() = 0; // A sorted list of engine paths (queried by the VFS) typedef std::list PathList; // Returns the list of ordered engine paths, which should // be initialised by the Virtual Filesystem (in this exact order) virtual const PathList& getVFSSearchPaths() const = 0; }; typedef std::shared_ptr IGameManagerPtr; } // namespace game // This is the accessor for the game manager inline game::IGameManager& GlobalGameManager() { // Cache the reference locally static game::IGameManager& _gameManager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_GAMEMANAGER) ) ); return _gameManager; } #endif /*IGAMEMANAGER_H_*/ DarkRadiant-2.0.2/include/igl.h000066400000000000000000000027511245424655700162710ustar00rootroot00000000000000#pragma once #include #include #include "imodule.h" const std::string MODULE_OPENGL("OpenGL"); namespace wxutil { class GLWidget; } class wxGLContext; class OpenGLBinding : public RegisterableModule { public: virtual ~OpenGLBinding() {} /// \brief Asserts that there no OpenGL errors have occurred since the last call to glGetError. virtual void assertNoErrors() = 0; /// Returns the shared context widget holding the GL context virtual wxGLContext& getwxGLContext() = 0; /// Registers a GL widget, storing the shared context if necessary virtual void registerGLCanvas(wxutil::GLWidget* widget) = 0; /// Notifies the GL module that a GLWidget has been destroyed virtual void unregisterGLCanvas(wxutil::GLWidget* widget) = 0; /// \brief Is true if the global shared OpenGL context is valid. virtual bool wxContextValid() const = 0; virtual int getFontHeight() = 0; /// \brief Renders \p string at the current raster-position of the current context. virtual void drawString(const std::string& string) const = 0; /// \brief Renders \p character at the current raster-position of the current context. virtual void drawChar(char character) const = 0; }; inline OpenGLBinding& GlobalOpenGL() { // Cache the reference locally static OpenGLBinding& _openGL( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_OPENGL) ) ); return _openGL; } DarkRadiant-2.0.2/include/iglprogram.h000066400000000000000000000041561245424655700176620ustar00rootroot00000000000000#pragma once #include "math/Vector3.h" #include "math/Matrix4.h" #include "render/Colour4.h" /** * Representation of a GL vertex/fragment program. */ class GLProgram { public: /** * Destructor */ virtual ~GLProgram() {} /** * Create this program using glGenProgramsARB and siblings. This needs the * OpenGL system to be initialised so cannot happen in the constructor. */ virtual void create() = 0; /** * Destroy this program using GL calls. */ virtual void destroy() = 0; /** * Bind this program as the currently-operative shader. */ virtual void enable() = 0; /** * Unbind this program from OpenGL. */ virtual void disable() = 0; /// Data structure containing rendering parameters struct Params { /// Light origin in world space Vector3 lightOrigin; /// Light colour Colour4 lightColour; /// Transformation from world space into light space Matrix4 world2Light; /// Amount of directionality, 0.0 for normal light, 1.0 for ambient float ambientFactor; /// Whether vertex colours should be inverted bool invertVertexColour; Params(const Vector3& lightOrigin_, const Colour4& lightColour_, const Matrix4& world2Light_) : lightOrigin(lightOrigin_), lightColour(lightColour_), world2Light(world2Light_), ambientFactor(0.0), invertVertexColour(false) { } }; /** * \brief * Apply render parameters used by this program to OpenGL. * * This method is invoked shortly before the renderable geometry is * submitted for rendering; the GLProgram must apply to the GL state any * parameters it uses. * * \param viewer * Location of the viewer in object space. * * \param localToWorld * Local to world transformation matrix. * * \param lightParms * Params structure containing lighting information. * */ virtual void applyRenderParams(const Vector3& viewer, const Matrix4& localToWorld, const Params& lightParms) { } }; DarkRadiant-2.0.2/include/iglrender.h000066400000000000000000000132201245424655700174620ustar00rootroot00000000000000#pragma once #include "igl.h" #include "imodule.h" #include "ishaders.h" #include "ShaderLayer.h" #include "math/Vector4.h" #include // Full declaration in iglprogram.h class GLProgram; /** * \brief * Data structure encapsulating various parameters of the OpenGL state machine, * as well as parameters used internally by Radiant. * * The OpenGLState class is used to keep track of OpenGL state parameters used * by the renderer, in order to avoid using slow glGet() calls or repeatedly * changing states to the same value. Each shader pass keeps an OpenGLState * member which stores the state values it wishes to use, and these values are * selectively applied to a single "current" OpenGLState object maintained by * the render system. */ class OpenGLState { public: /// Enum of possible sort positions enum SortPosition { SORT_FIRST = -64, SORT_ZFILL = 0, // used by depth buffer fill passes SORT_INTERACTION = 2, // used by the DBS pass SORT_FULLBRIGHT = 1025, // used by non-translucent editor passes SORT_TRANSLUCENT = 1026, // used by blend-type editor passes SORT_HIGHLIGHT = 1027, // used by the (red) selection system overlay SORT_OVERLAY_FIRST = 1028, // used by decals SORT_OVERLAY_LAST = 2047, SORT_POINT_FIRST = 2048, // used by POINT renderers SORT_POINT_LAST = 3071, SORT_GUI0 = 3072, // used by selection system controls, pivots (visible) SORT_GUI1 = 3073, // used by selection system controls, pivots (obscured) SORT_LAST = 4096, }; private: // The 4 colour components, only for use in OpenGLStates that do not have // any shader stages attached, otherwise pull the colour from there. Colour4 _colour; // Colour inversion flag bool _invertColour; // Set of RENDER_XXX flags unsigned _renderFlags; // GL depth function GLenum _glDepthFunc; // Sort position SortPosition _sortPos; public: /// Return the glColor for this state const Colour4& getColour() const { assert(_colour.isValid()); return _colour; } /// Set the glColor for this state, from a Vector4 void setColour(const Colour4& col) { assert(col.isValid()); _colour = col; } /// Set the glColor for this state, from individual components void setColour(float r, float g, float b, float a) { setColour(Colour4(r, g, b, a)); } /// Set this state to invert colour values void setColourInverted(bool inverted) { _invertColour = inverted; } /// Test whether this state is inverting colour values bool isColourInverted() const { return _invertColour; } /// \name Render flag operations ///@{ /// Set all render flags for this state void setRenderFlags(unsigned newFlags) { _renderFlags = newFlags; } /// Set a single render flag on this state void setRenderFlag(unsigned flag) { setRenderFlags(_renderFlags | flag); } /// Clear a single render flag on this state void clearRenderFlag(unsigned flag) { setRenderFlags(_renderFlags & ~flag); } /// Test the value of a single render flag bool testRenderFlag(unsigned flag) const { return (_renderFlags & flag) > 0; } /// Return the render flags for this state unsigned getRenderFlags() const { return _renderFlags; } ///@} /// Return the depth function GLenum getDepthFunc() const { return _glDepthFunc; } /// Set the depth function void setDepthFunc(GLenum func) { _glDepthFunc = func; } /// Return the sort position SortPosition getSortPosition() const { return _sortPos; } /// Set the sort position void setSortPosition(SortPosition pos) { _sortPos = pos; } /** * \brief * Polygon offset. */ float polygonOffset; /** * \brief * GL texture numbers to be bound to texture units. * * \{ */ GLint texture0; GLint texture1; GLint texture2; GLint texture3; GLint texture4; /** * \} */ /** * Each open GL State refers to one or more shader stages, * which hold the actual values of many parameters, some of them * time-dependent or depending on entity parameters. */ ShaderLayerPtr stage0; ShaderLayerPtr stage1; ShaderLayerPtr stage2; ShaderLayerPtr stage3; ShaderLayerPtr stage4; /** * \brief * Source blend mode. */ GLenum m_blend_src; /** * \brief * Destination blend mode */ GLenum m_blend_dst; // Alpha test function GLenum alphaFunc; // Alpha test threshold GLfloat alphaThreshold; GLfloat m_linewidth; GLfloat m_pointsize; GLint m_linestipple_factor; GLushort m_linestipple_pattern; /** * \brief * GL program or shader object. */ GLProgram* glProgram; /** * \brief * The cube-map texgen mode for rendering. */ ShaderLayer::CubeMapMode cubeMapMode; /// Default constructor OpenGLState() : _colour(Colour4::WHITE()), _invertColour(false), _renderFlags(0), _glDepthFunc(GL_LESS), _sortPos(SORT_FIRST), polygonOffset(0.0f), texture0(0), texture1(0), texture2(0), texture3(0), texture4(0), m_blend_src(GL_SRC_ALPHA), m_blend_dst(GL_ONE_MINUS_SRC_ALPHA), alphaFunc(GL_ALWAYS), alphaThreshold(0), m_linewidth(1), m_pointsize(1), m_linestipple_factor(1), m_linestipple_pattern(0xAAAA), glProgram(NULL), cubeMapMode(ShaderLayer::CUBE_MAP_NONE) { } }; DarkRadiant-2.0.2/include/igrid.h000066400000000000000000000025221245424655700166100ustar00rootroot00000000000000#ifndef IGRID_H_ #define IGRID_H_ /* greebo: The interface of the grid system * * Use these methods to set/get the grid size of the xyviews */ #include "imodule.h" #include enum GridSize { GRID_0125 = -3, GRID_025 = -2, GRID_05 = -1, GRID_1 = 0, GRID_2 = 1, GRID_4 = 2, GRID_8 = 3, GRID_16 = 4, GRID_32 = 5, GRID_64 = 6, GRID_128 = 7, GRID_256 = 8, }; // grid renderings enum GridLook { GRIDLOOK_LINES, GRIDLOOK_DOTLINES, GRIDLOOK_MOREDOTLINES, GRIDLOOK_CROSSES, GRIDLOOK_DOTS, GRIDLOOK_BIGDOTS, GRIDLOOK_SQUARES, }; const std::string MODULE_GRID("Grid"); class IGridManager : public RegisterableModule { public: virtual void setGridSize(GridSize gridSize) = 0; virtual float getGridSize() const = 0; virtual int getGridPower() const = 0; virtual void gridDown() = 0; virtual void gridUp() = 0; virtual GridLook getMajorLook() const = 0; virtual GridLook getMinorLook() const = 0; /// Signal emitted when the grid is changed virtual sigc::signal signal_gridChanged() const = 0; }; // class IGridManager // This is the accessor for the grid module inline IGridManager& GlobalGrid() { // Cache the reference locally static IGridManager& _grid( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_GRID) ) ); return _grid; } #endif /*IGRID_H_*/ DarkRadiant-2.0.2/include/igroupdialog.h000066400000000000000000000060511245424655700202000ustar00rootroot00000000000000#pragma once #include #include class wxWindow; class wxFrame; /** * greebo: This defines the interface for accessing the GroupDialog * (i.e. the window housing the Entity Inspector, the Media Browser et al). * * Use the addPage() method to add a new tab to the GroupDialog. */ class IGroupDialog { public: /** * Destructor */ virtual ~IGroupDialog() {} struct Page { // The name of this window (unique, can be used to show the page) std::string name; // The label string to be displayed on the tab std::string tabLabel; // The image to be displayed in the tab std::string tabIcon; // the actual widget to be added wxWindow* page; // the title string for the groupdialog window // to be displayed when this tab is active std::string windowLabel; // Optionally specify the name of an already added page to let this page // be inserted at a specific point in the tab bar std::string insertBefore; }; typedef std::shared_ptr PagePtr; /** * Adds a page to the group dialog. * @returns: the notebook page widget */ virtual wxWindow* addPage(const PagePtr& page) = 0; /** * Removes the named page from the TextureBrowser. If the page doesn't exist, * nothing happens. */ virtual void removePage(const std::string& name) = 0; /** greebo: Sets the active tab to the given widget. * * @page: The widget that should be displayed, must have been added * using addPage() beforehand. */ virtual void setPage(wxWindow* page) = 0; /** greebo: Activated the named page. The parameter * refers to the name string passed to the addPage() method. * This also shows the GroupDialog, should it be hidden before the call. */ virtual void setPage(const std::string& name) = 0; /** greebo: Toggle the named page. The parameter * refers to the name string passed to the addPage() method. * * The behaviour is as follows: Calling this command opens the * GroupDialog (even if it is hidden) and switches to the given page. * * If the GroupDialog is already visible and focusing the requested page, * the dialog is hidden. */ virtual void togglePage(const std::string& name) = 0; /** greebo: Returns the widget of the currently visible page. */ virtual wxWindow* getPage() = 0; /** * greebo: Returns the name of the current groupdialog page or "" if none is set. */ virtual std::string getPageName() = 0; // Returns the window widget containing the GroupDialog. virtual wxFrame* getDialogWindow() = 0; // Shows the dialog virtual void showDialogWindow() = 0; // Hides the dialog virtual void hideDialogWindow() = 0; /** * Special function for mainframe layouts. This method allows to detach the * contained notebook from the group dialog to pack it somewhere else. * Layout code shouldn't forget to reparent it to the groupdialog again * on deactivation. */ virtual void reparentNotebook(wxWindow* newParent) = 0; /** * Reparents the groupdialog notebook back to the GroupDialog itself. */ virtual void reparentNotebookToSelf() = 0; }; DarkRadiant-2.0.2/include/igroupnode.h000066400000000000000000000015761245424655700176750ustar00rootroot00000000000000#ifndef IGROUPNODE_H_ #define IGROUPNODE_H_ #include "inode.h" namespace scene { /** greebo: This is used to identify group entities right before * and after map save/load. * * It provides methods to add/substract the origin to/from * their child primitives. */ class GroupNode { public: virtual ~GroupNode() {} /** greebo: This is called right before saving * to move the child brushes of the Doom3Group * according to its origin. */ virtual void addOriginToChildren() = 0; virtual void removeOriginFromChildren() = 0; }; typedef std::shared_ptr GroupNodePtr; } // namespace scene /** greebo: Cast a node onto a GroupNode pointer * * @returns: NULL, if failed, the pointer to the class otherwise. */ inline scene::GroupNodePtr Node_getGroupNode(scene::INodePtr node) { return std::dynamic_pointer_cast(node); } #endif /*IGROUPNODE_H_*/ DarkRadiant-2.0.2/include/iimage.h000066400000000000000000000064221245424655700167500ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_IIMAGE_H) #define INCLUDED_IIMAGE_H #include "igl.h" #include "imodule.h" typedef unsigned char byte; class Texture; typedef std::shared_ptr TexturePtr; /** * \brief * Interface for GL bindable texture objects. */ class BindableTexture { public: virtual ~BindableTexture() {} /** * \brief * Bind this texture to OpenGL. * * This method invokes the necessary GL calls to bind and upload the * object's texture. It returns a Texture object representing the texture in * GL. * * \param name * Optional name to give the texture at bind time. This would usually be the * name of the image map, e.g. "textures/blah/bleh". */ virtual TexturePtr bindTexture(const std::string& name = "") const = 0; }; typedef std::shared_ptr BindableTexturePtr; class Image : public BindableTexture { public: /** * greebo: Returns the specified mipmap pixel data. */ virtual byte* getMipMapPixels(std::size_t mipMapIndex) const = 0; /** * greebo: Returns the dimension of the specified mipmap. */ virtual std::size_t getWidth(std::size_t mipMapIndex) const = 0; virtual std::size_t getHeight(std::size_t mipMapIndex) const = 0; // greebo: Returns TRUE whether this image is precompressed (DDS) virtual bool isPrecompressed() const { return false; } }; typedef std::shared_ptr ImagePtr; class ArchiveFile; /// Module responsible for loading images from VFS or disk filesystem class ImageLoader : public RegisterableModule { public: /** * \brief * Load an image from a VFS path. * * Images loaded from the VFS are not specified with an extension. Various * extensions (and optional VFS directory prefixes) will be attempted in an * order specified by the .game file. For example, requesting * "textures/blah/bleh" might result in an attempt to load * "textures/blah/bleh.tga" followed by "dds/textures/blah/bleh.dds" if the * tga version cannot be found. */ virtual ImagePtr imageFromVFS(const std::string& vfsPath) const = 0; /** * \brief * Load an image from a filesystem path. */ virtual ImagePtr imageFromFile(const std::string& filename) const = 0; }; typedef std::shared_ptr ImageLoaderPtr; const std::string MODULE_IMAGELOADER("ImageLoader"); inline const ImageLoader& GlobalImageLoader() { return *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_IMAGELOADER) ); } #endif // _IIMAGE_H DarkRadiant-2.0.2/include/iinteractiveview.h000066400000000000000000000015421245424655700210740ustar00rootroot00000000000000#pragma once #include "iselectiontest.h" #include "ivolumetest.h" #include "math/Vector2.h" /** * Base class of the two interactive views used in DarkRadiant: * OrthoView (XYView) and the Camera (3D View). */ class IInteractiveView { public: virtual ~IInteractiveView() {} /** * Creates a new SelectionTest instance for the given position, measured in * device coordinates in the range [-1..+1] */ virtual SelectionTestPtr createSelectionTestForPoint(const Vector2& point) = 0; // Returns the device dimensions in pixels virtual int getDeviceWidth() const = 0; virtual int getDeviceHeight() const = 0; /** * Returns the VolumeTest instance associated with this view. */ virtual const VolumeTest& getVolumeTest() const = 0; // Schedules a repaint of this view virtual void queueDraw() = 0; }; DarkRadiant-2.0.2/include/ilayer.h000066400000000000000000000130541245424655700170010ustar00rootroot00000000000000#pragma once #include #include #include "imodule.h" namespace scene { class INode; typedef std::shared_ptr INodePtr; // A list of named layers typedef std::set LayerList; /** * greebo: Interface of a Layered object. */ class Layered { public: // Destructor virtual ~Layered() {} /** * Add this object to the layer with the given ID. */ virtual void addToLayer(int layerId) = 0; /** * Moves this object to the layer. After this operation,the item is member * of this layer only, all other layer memberships are erased. */ virtual void moveToLayer(int layerId) = 0; /** * Remove this object from the layer with the given ID. */ virtual void removeFromLayer(int layerId) = 0; /** * Return the set of layers to which this object is assigned. */ virtual LayerList getLayers() const = 0; /** * greebo: This assigns the given node to the given set of layers. Any previous * assignments of the node will be overwritten by this routine. * Note: The newLayers list must not be empty, otherwise the call will be ignored. */ virtual void assignToLayers(const LayerList& newLayers) = 0; }; class ILayerSystem : public RegisterableModule { public: // Visitor class for use with the foreachLayer() method class Visitor { public: virtual ~Visitor() {} virtual void visit(int layerID, const std::string& layerName) = 0; }; /** * greebo: Creates a new layer with the given name. * * @returns: the ID of the layer of -1 if the layer could not * be created (e.g. due to a name conflict). */ virtual int createLayer(const std::string& name) = 0; /** * greebo: Overload: Creates a new layer with the given name and the given ID. * * @returns: the ID of the layer of -1 if the layer could not * be created (e.g. due to a name/ID conflict). */ virtual int createLayer(const std::string& name, int layerID) = 0; /** * greebo: Deletes the named layer. All nodes are removed * from this layer before deletion. */ virtual void deleteLayer(const std::string& name) = 0; /** * greebo: Resets the layer system into its ground state. Deletes all * layers except for layer #0 which is renamed to "Default". */ virtual void reset() = 0; /** * greebo: Visits each layer using the given visitor. */ virtual void foreachLayer(Visitor& visitor) = 0; /** * greebo: Returns the ID of the named layer, or -1 if name doesn't exist */ virtual int getLayerID(const std::string& name) const = 0; /** * greebo: Returns the name of the layer with the given ID or "" if it doesn't exist */ virtual std::string getLayerName(int layerID) const = 0; /** * Returns TRUE if the given layer exists, FALSE otherwise. */ virtual bool layerExists(int layerID) const = 0; /** * greebo: Renames the given layer. Returns TRUE on success, FALSE if the name is * already in use. */ virtual bool renameLayer(int layerID, const std::string& newLayerName) = 0; /** * greebo: Returns the ID of the first visible layer or 0 (default layer) if none is visible. */ virtual int getFirstVisibleLayer() const = 0; /** * Returns the ID of the layer that is currently signed as active (will return the default layer * if no other layer is active). Note that the returned layer is not necessarily visible. */ virtual int getActiveLayer() const = 0; /** * Declare the given layer as active. Nothing will happen if the given layer ID is not existent. * This method doesn't change the visibility of the given layer. */ virtual void setActiveLayer(int layerID) = 0; /** * greebo: Queries the visibility of the given layer. */ virtual bool layerIsVisible(const std::string& layerName) = 0; virtual bool layerIsVisible(int layerID) = 0; /** * greebo: Sets the visibility of the given layer. */ virtual void setLayerVisibility(const std::string& layerName, bool visible) = 0; virtual void setLayerVisibility(int layerID, bool visible) = 0; /** * greebo: Traverses the selection and adds each node to the given layer. */ virtual void addSelectionToLayer(const std::string& layerName) = 0; virtual void addSelectionToLayer(int layerID) = 0; /** * greebo: Moves all selected nodes to the given layer. This implicitly * removes the nodes from all other layers. */ virtual void moveSelectionToLayer(const std::string& layerName) = 0; virtual void moveSelectionToLayer(int layerID) = 0; /** * greebo: Removes the selected nodes from the given layers. */ virtual void removeSelectionFromLayer(const std::string& layerName) = 0; virtual void removeSelectionFromLayer(int layerID) = 0; /** * greebo: Updates the visibility of the given node based on the * current layer visibility settings. * * @returns: TRUE if the node was set to "visible", FALSE if the * current layer settings resulted to "invisible" and the * node was therefore hidden. */ virtual bool updateNodeVisibility(const scene::INodePtr& node) = 0; /** * greebo: Sets the selection status of the entire layer. * * @layerID: the ID of the layer to be selected/deselected. * @selected: TRUE if the layer should be selected, FALSE if the members * should be de-selected. */ virtual void setSelected(int layerID, bool selected) = 0; }; } // namespace scene const std::string MODULE_LAYERSYSTEM("LayerSystem"); inline scene::ILayerSystem& GlobalLayerSystem() { // Cache the reference locally static scene::ILayerSystem& _layerSystem( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_LAYERSYSTEM) ) ); return _layerSystem; } DarkRadiant-2.0.2/include/ilightnode.h000066400000000000000000000011371245424655700176410ustar00rootroot00000000000000#pragma once #include #include "inode.h" #include "math/AABB.h" /** * LightNodes derive from this class. * It's mainly used to determine the selectable part * of the light, which is usually the small "diamond" in * the center. */ class ILightNode { public: virtual ~ILightNode() {} /** * greebo: Get the AABB of the Light "Diamond" representation. */ virtual AABB getSelectAABB() = 0; }; typedef std::shared_ptr ILightNodePtr; inline ILightNodePtr Node_getLightNode(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } DarkRadiant-2.0.2/include/imainframe.h000066400000000000000000000065571245424655700176360ustar00rootroot00000000000000#pragma once #include "imodule.h" const std::string MODULE_MAINFRAME("MainFrame"); class wxFrame; class wxToolBar; class wxBoxSizer; /** * Scoped object to block screen updates and display a modal message, * used while reloading shaders, for instance. */ class IScopedScreenUpdateBlocker { public: virtual ~IScopedScreenUpdateBlocker() {} // For operations without calculatable duration, call pulse() regularly to // provide some visual feedback virtual void pulse() = 0; // Update the progress fraction [0..1] virtual void setProgress(float progress) = 0; // Set the status message that might be displayed to the user virtual void setMessage(const std::string& message) = 0; }; typedef std::shared_ptr IScopedScreenUpdateBlockerPtr; /** * The MainFrame represents the top-level application window. */ class IMainFrame : public RegisterableModule { public: // Constructs the toplevel mainframe window and issues the "radiant startup" signal virtual void construct() = 0; // Returns TRUE if screen updates are enabled virtual bool screenUpdatesEnabled() = 0; // Use this to (re-)enable camera and xyview draw updates virtual void enableScreenUpdates() = 0; // Use this to disable camera and xyview draw updates until enableScreenUpdates is called. virtual void disableScreenUpdates() = 0; /** * Returns the main application window widget. Returns NULL if no window * has been constructed yet. */ virtual wxFrame* getWxTopLevelWindow() = 0; /** * Returns TRUE if DarkRadiant is currently "in focus", i.e. the app in the foreground. */ virtual bool isActiveApp() = 0; /** * greebo: Returns the main container widget (a box sizer), where layouts * can start packing widgets into. This resembles the large grey area * in the main window. * May return NULL if mainframe is not constructed yet. */ virtual wxBoxSizer* getWxMainContainer() = 0; enum Toolbar { TOOLBAR_HORIZONTAL, // the "view" toolbar (on the top) TOOLBAR_VERTICAL, // the "edit" toolbar (on the left) }; /** * greebo: Returns a toolbar widget, as specified by the * passed enum value. */ virtual wxToolBar* getToolbar(Toolbar type) = 0; /** * Updates all viewports which are child of the toplevel window. */ virtual void updateAllWindows() = 0; /** * Applies the named layout to the MainFrame window. See MainFrameLayout class. */ virtual void applyLayout(const std::string& name) = 0; /// Store the layout name, but do not immediately apply it virtual void setActiveLayoutName(const std::string& name) = 0; /** * Returns the name of the currently activated layout or * an empty string if no layout is applied. */ virtual std::string getCurrentLayout() = 0; /** * Acquire a screen update blocker object that displays a modal message. * As soon as the object is destroyed screen updates are allowed again. * * Pass the title and the message to display in the small modal window. */ virtual IScopedScreenUpdateBlockerPtr getScopedScreenUpdateBlocker(const std::string& title, const std::string& message, bool forceDisplay = false) = 0; }; // This is the accessor for the mainframe module inline IMainFrame& GlobalMainFrame() { // Cache the reference locally static IMainFrame& _mainFrame( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_MAINFRAME) ) ); return _mainFrame; } DarkRadiant-2.0.2/include/imainframelayout.h000066400000000000000000000043431245424655700210630ustar00rootroot00000000000000#ifndef IMAINFRAME_LAYOUT_H_ #define IMAINFRAME_LAYOUT_H_ #include "imodule.h" #include class IMainFrameLayout { public: /** * Destructor */ virtual ~IMainFrameLayout() {} /** * Each MainFrame layout has a unique name. */ virtual std::string getName() = 0; /** * Use this to let the Layout construct its widgets and * restore its state from the Registry, if appropriate. */ virtual void activate() = 0; /** * Advises this layout to destruct its widgets and remove itself * from the MainFrame. */ virtual void deactivate() = 0; /** * greebo: Each layout should implement this command to maximise * the camera view and restore it again at the next call. The layout * is activated with a un-maximised camera view, so the first call * to this method will maximise it. On deactivation, the layout should * take care of un-maxmising the camview (if necessary) before saving * its state. */ virtual void toggleFullscreenCameraView() = 0; }; typedef std::shared_ptr IMainFrameLayoutPtr; /** * This represents a function to create a mainframe layout like this: * * IMainFrameLayoutPtr createInstance(); */ typedef std::function CreateMainFrameLayoutFunc; const std::string MODULE_MAINFRAME_LAYOUT_MANAGER("MainFrameLayoutManager"); class IMainFrameLayoutManager : public RegisterableModule { public: /** * Retrieves a layout with the given name. Returns NULL if not found. */ virtual IMainFrameLayoutPtr getLayout(const std::string& name) = 0; /** * Register a layout by passing a name and a function to create such a layout. */ virtual void registerLayout(const std::string& name, const CreateMainFrameLayoutFunc& func) = 0; /** * greebo: Registers all layout commands to the eventmanager. */ virtual void registerCommands() = 0; }; // This is the accessor for the mainframe module inline IMainFrameLayoutManager& GlobalMainFrameLayoutManager() { // Cache the reference locally static IMainFrameLayoutManager& _mainFrameLayoutManager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_MAINFRAME_LAYOUT_MANAGER) ) ); return _mainFrameLayoutManager; } #endif /* IMAINFRAME_LAYOUT_H_ */ DarkRadiant-2.0.2/include/imap.h000066400000000000000000000030741245424655700164430ustar00rootroot00000000000000#pragma once #include "imodule.h" #include "inode.h" // Registry setting for suppressing the map load progress dialog const char* const RKEY_MAP_SUPPRESS_LOAD_STATUS_DIALOG = "user/ui/map/suppressMapLoadDialog"; // Namespace forward declaration class INamespace; typedef std::shared_ptr INamespacePtr; /** * greebo: A root node is the top level element of a map. * It also owns the namespace of the corresponding map. */ class IMapRootNode : public virtual scene::INode { public: virtual ~IMapRootNode() {} /** * greebo: Returns the namespace of this root. */ virtual INamespacePtr getNamespace() = 0; }; typedef std::shared_ptr IMapRootNodePtr; /** * greebo: This is the global interface to the currently * active map file. */ class IMap : public RegisterableModule { public: /** * Returns the worldspawn node of this map. The worldspawn * node is NOT created if it doesn't exist yet, so this * might return an empty pointer. */ virtual scene::INodePtr getWorldspawn() = 0; /** * Returns the root node of this map or NULL if this is an empty map. */ virtual IMapRootNodePtr getRoot() = 0; /** * Returns the name of the map. */ virtual std::string getMapName() const = 0; }; typedef std::shared_ptr IMapPtr; const std::string MODULE_MAP("Map"); // Application-wide Accessor to the currently active map inline IMap& GlobalMapModule() { // Cache the reference locally static IMap& _mapModule( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_MAP) ) ); return _mapModule; } DarkRadiant-2.0.2/include/imapcompiler.h000066400000000000000000000014761245424655700202020ustar00rootroot00000000000000#pragma once #include "imodule.h" #include "inode.h" namespace map { /** * Map Compiler interface for creating D3-compatible .proc files. */ class IMapCompiler : public RegisterableModule { public: virtual ~IMapCompiler() {} // Use the given map file to generate the .proc file containing the pre-processed map models virtual void generateProc(const scene::INodePtr& root) = 0; }; typedef std::shared_ptr IMapCompilerPtr; } const char* const MODULE_MAPCOMPILER = "MapCompiler"; // Application-wide Accessor to the global map compiler inline map::IMapCompiler& GlobalMapCompiler() { // Cache the reference locally static map::IMapCompiler& _mapCompiler( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_MAPCOMPILER) ) ); return _mapCompiler; } DarkRadiant-2.0.2/include/imapformat.h000066400000000000000000000201331245424655700176470ustar00rootroot00000000000000#pragma once #include "imodule.h" namespace scene { class NodeVisitor; class INode; typedef std::shared_ptr INodePtr; } namespace parser { class DefTokeniser; } class Entity; class IBrush; class IPatch; /** Callback function to control how the Walker traverses the scene graph. This function * will be provided to the map export module by the Radiant map code. */ typedef void (*GraphTraversalFunc) (const scene::INodePtr& root, scene::NodeVisitor& nodeExporter); namespace map { /** * A Primitive parser is able to create a primitive (brush, patch) from a given token stream. * The initial token, e.g. "brushDef3" is already parsed when the stream is passed to the * parse method. * * Such a class should not change its "state" during the parse() calls - the map parser * is calling the same instance of this PrimitiveParser over and over, one call for each * primitive, so when returning from the parse() method the class should be ready * to process the next primitive. */ class PrimitiveParser { public: virtual ~PrimitiveParser() {} /** * Returns the primitive keyword of this parser, e.g. "brushDef3". When the Map parser * encounters this keyword, the stream is passed along to the parse() method to create * a scene node from it. */ virtual const std::string& getKeyword() const = 0; /** * Creates and returns a primitive node according to the encountered token. */ virtual scene::INodePtr parse(parser::DefTokeniser& tok) const = 0; }; typedef std::shared_ptr PrimitiveParserPtr; /** * An abstract map writer class used to write any map elements * as string to the given output stream. * * The IMapWriter interface defines beginWrite/endWrite pairs for * each scene element (Entity, primitives and the Map itself). * These are called by the map saving algorithm when traversing * the scene depth-first. The usual call order will look like this: * * beginWriteMap * beginWriteEntity * beginWriteBrush * endWriteBrush * beginWritePatch * endWritePatch * .... * endWriteEntity * ... * endWriteMap * * Failure Handling: when the IMapWriter implementation encounters * errors during write (e.g. a visited node is not exportable) a * IMapWriter::FailureException will be thrown. The calling code * is designed to catch this exception. */ class IMapWriter { public: // The generic exception type which is thrown by the IMapWriter methods class FailureException : public std::runtime_error { public: FailureException(const std::string& what) : std::runtime_error(what) {} }; // Destructor virtual ~IMapWriter() {} /** * This is called before writing any nodes, to give an opportunity * to write a map header and version info. */ virtual void beginWriteMap(std::ostream& stream) = 0; /** * Called after all nodes have been visited. Note that this method * should NOT attempt to close the given stream. */ virtual void endWriteMap(std::ostream& stream) = 0; // Entity export methods virtual void beginWriteEntity(const Entity& entity, std::ostream& stream) = 0; virtual void endWriteEntity(const Entity& entity, std::ostream& stream) = 0; // Brush export methods virtual void beginWriteBrush(const IBrush& brush, std::ostream& stream) = 0; virtual void endWriteBrush(const IBrush& brush, std::ostream& stream) = 0; // Patch export methods virtual void beginWritePatch(const IPatch& patch, std::ostream& stream) = 0; virtual void endWritePatch(const IPatch& patch, std::ostream& stream) = 0; }; typedef std::shared_ptr IMapWriterPtr; /** * An abstract map reader class used to parse map elements * from the given input (string) stream. The map reader instance * is usually associated with an MapImportFilter class where the * parsed elements are sent to. */ class IMapReader { public: // The generic exception type which is thrown by a map reader class FailureException : public std::runtime_error { public: FailureException(const std::string& what) : std::runtime_error(what) {} }; /** * Read the contents of the given stream and send them through the given MapImportFilter. * Whether the nodes are actually added to the map or not is something the * ImportFilter can decide. * * throws: FailureException on any error. */ virtual void readFromStream(std::istream& stream) = 0; }; class IMapImportFilter { public: /** * Send an entity node to the import filter. In idTech4 maps all entities * are immediate children of the root node in the scene, so this is where * they usually end up after being added (unless they're filtered out). * * @returns: true if the entity got added, false otherwise. */ virtual bool addEntity(const scene::INodePtr& entity) = 0; /** * Add an primitive node to the given entity. * * @returns: true if the primitive got added, false otherwise. */ virtual bool addPrimitiveToEntity(const scene::INodePtr& primitive, const scene::INodePtr& entity) = 0; }; typedef std::shared_ptr IMapReaderPtr; /** * Map Format interface. Each map format is able to traverse the scene graph and write * the contents into a mapfile, or to load a mapfile and populate a scene graph. */ class MapFormat : public RegisterableModule { public: virtual ~MapFormat() {} /** * Get the display name of this map format, e.g. "Doom 3", "Quake 4", etc. */ virtual const std::string& getMapFormatName() const = 0; /** * Each MapFormat can have a certain game type it is designed for, * a value which conincides with the type attribute in the game tag * found in the .game file, e.g. "doom3" or "quake4". */ virtual const std::string& getGameType() const = 0; /** * Instantiate a new map reader, using the given ImportFilter * which will be fed with nodes during the import. */ virtual IMapReaderPtr getMapReader(IMapImportFilter& filter) const = 0; /** * Acquire a map writer instance, for exporting nodes to a stream. */ virtual IMapWriterPtr getMapWriter() const = 0; /** * Returns true if this map format allows the .darkradiant file * to be saved along the actual .map file. Some exporter modules * might want to disable that (i.e. the prefab exporter) */ virtual bool allowInfoFileCreation() const = 0; /** * greebo: Returns true if this map format is able to load * the contents of this file. Usually this includes a version * check of the file header. */ virtual bool canLoad(std::istream& stream) const = 0; }; typedef std::shared_ptr MapFormatPtr; /** * greebo: This is the global map format manager. Use this class to * register any parsers. */ class IMapFormatManager : public RegisterableModule { public: /** * Each MapFormat module should register itself here on startup. */ virtual void registerMapFormat(const std::string& extension, const MapFormatPtr& mapFormat) = 0; /** * Proper MapFormat modules should unregister themselves at shutdown. This includes * removal from all mapped extensions if the format was registered multiple times. */ virtual void unregisterMapFormat(const MapFormatPtr& mapFormat) = 0; /** * Tries to look up the default map format for the given map format name. */ virtual MapFormatPtr getMapFormatByName(const std::string& mapFormatName) = 0; /** * Tries to look up the default map format for the given game type (e.g. "doom3") * associated with the given file extension. */ virtual MapFormatPtr getMapFormatForGameType(const std::string& gameType, const std::string& extension) = 0; /** * Returns the list of registered map formats. */ virtual std::set getMapFormatList(const std::string& extension) = 0; }; typedef std::shared_ptr IMapFormatManagerPtr; } // namespace map const std::string MODULE_MAPFORMATMANAGER("MapFormatManager"); // Application-wide Accessor to the global map format manager inline map::IMapFormatManager& GlobalMapFormatManager() { // Cache the reference locally static map::IMapFormatManager& _mapFormatManager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_MAPFORMATMANAGER) ) ); return _mapFormatManager; } DarkRadiant-2.0.2/include/imapresource.h000066400000000000000000000027441245424655700202160ustar00rootroot00000000000000#pragma once #include "inode.h" #include "imodule.h" namespace map { class MapFormat; typedef std::shared_ptr MapFormatPtr; } class IMapResource { public: class Observer { public: virtual ~Observer() {} virtual void onResourceRealise() = 0; virtual void onResourceUnrealise() = 0; }; virtual ~IMapResource() {} // Renames this map resource to the new path virtual void rename(const std::string& fullPath) = 0; virtual bool load() = 0; virtual bool save(const map::MapFormatPtr& mapFormat = map::MapFormatPtr()) = 0; // Reloads the map file from disk virtual void reload() = 0; virtual scene::INodePtr getNode() = 0; virtual void setNode(scene::INodePtr node) = 0; virtual void addObserver(Observer& observer) = 0; virtual void removeObserver(Observer& observer) = 0; virtual void realise() = 0; virtual void unrealise() = 0; }; typedef std::shared_ptr IMapResourcePtr; const std::string MODULE_MAPRESOURCEMANAGER("MapResourceManager"); class IMapResourceManager : public RegisterableModule { public: /** * Capture a named model resource, and return a pointer to it. */ virtual IMapResourcePtr capture(const std::string& path) = 0; }; inline IMapResourceManager& GlobalMapResourceManager() { // Cache the reference locally static IMapResourceManager& _mapResourceManager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_MAPRESOURCEMANAGER) ) ); return _mapResourceManager; } DarkRadiant-2.0.2/include/imd5anim.h000066400000000000000000000046151245424655700172220ustar00rootroot00000000000000#pragma once #include "imodule.h" #include #include "math/Vector3.h" #include "math/Quaternion.h" namespace md5 { struct Joint { // The ID of this joint int id; // the name of this bone std::string name; // ID of parent bone (-1 == no parent) int parentId; // The 6 possible components that might be modified by a key enum AnimComponent { X = 1 << 0, Y = 1 << 1, Z = 1 << 2, YAW = 1 << 3, PITCH = 1 << 4, ROLL = 1 << 5, INVALID_COMPONENT = 1 << 6 }; // A bit mask explaining which components we're animating std::size_t animComponents; std::size_t firstKey; // The child joint IDs std::vector children; }; /** * Base class for an MD5 animation as used in Doom 3. */ class IMD5Anim { public: // Information used by the base frame struct Key { Vector3 origin; Quaternion orientation; }; // Each frame has a series of float values, applied to one or more animated components (x, y, z, yaw, pitch, roll) typedef std::vector FrameKeys; /** * Get the number of joints in this animation. */ virtual std::size_t getNumJoints() const = 0; /** * Retrieve a certain joint by index, bounds are [0..getNumJoints()) */ virtual const Joint& getJoint(std::size_t index) const = 0; /** * Returns the baseframe info for the given joint number. */ virtual const Key& getBaseFrameKey(std::size_t jointNum) const = 0; /** * Returns the frame rate this anim should be played. */ virtual int getFrameRate() const = 0; /** * Returns the number of frames in this animation. */ virtual std::size_t getNumFrames() const = 0; /** * Returns the float values of the given frame index. */ virtual const FrameKeys& getFrameKeys(std::size_t index) const = 0; }; typedef std::shared_ptr IMD5AnimPtr; class IAnimationCache : public RegisterableModule { public: /** * Returns the MD5 animation for the given VFS path, or NULL if * the file does not exist or the anim was found to be invalid. */ virtual IMD5AnimPtr getAnim(const std::string& vfsPath) = 0; }; const char* const MODULE_ANIMATIONCACHE("MD5AnimationCache"); } // namespace inline md5::IAnimationCache& GlobalAnimationCache() { // Cache the reference locally static md5::IAnimationCache& _animationCache( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(md5::MODULE_ANIMATIONCACHE) ) ); return _animationCache; } DarkRadiant-2.0.2/include/imd5model.h000066400000000000000000000012151245424655700173670ustar00rootroot00000000000000#pragma once #include #include "imd5anim.h" namespace md5 { /** * Interface for a MD5 model object. This can be used * to control the animation applied to the MD5. */ class IMD5Model { public: /** * Set the animation to play on this model. * Pass a NULL animation to clear any anim. */ virtual void setAnim(const IMD5AnimPtr& anim) = 0; /** * Returns the currently applied animation. */ virtual const IMD5AnimPtr& getAnim() const = 0; /** * Update the mesh using the given animation playback time. */ virtual void updateAnim(std::size_t time) = 0; }; typedef std::shared_ptr IMD5ModelPtr; } // namespace DarkRadiant-2.0.2/include/imenu.h000066400000000000000000000053651245424655700166370ustar00rootroot00000000000000#pragma once #include #include #include class wxMenuItem; namespace ui { /** * An abstract MenuItem needs to provide a getWidget() method * which will be packed into a parent GTK container, plus * various callbacks for determining the visibility/sensitivity of * this item (these are invoked before the menu is showing itself). * * An utility implementation of this class can be found in * gtkutil::MenuItem which can be constructed from strings * and std::function objects. */ class IMenuItem { public: /** * Each menu item must return a distinct widget which is packed * into the parent wxMenu */ virtual wxMenuItem* getMenuItem() = 0; // Callback to run when this item is selected in the menus virtual void execute() = 0; /** * Returns TRUE if this item is visible and should be rendered. * Default implementation returns true for convenience. */ virtual bool isVisible() { return true; } /** * Returns TRUE if this item is sensitive and therefore clickable. * Default implementation returns true for convenience. */ virtual bool isSensitive() { return true; } /** * Called to let the item prepare its visual appearance. Empty default impl. */ virtual void preShow() {} }; typedef std::shared_ptr IMenuItemPtr; /** * An abstract menu object, which can have one or more IMenuItems as children. * The order in which the items are added is visually preserved. */ class IMenu { public: /* PUBLIC TYPES */ /** * Function callback. Each menu item is associated with one of these, which * is invoked when the menu item is activated. */ typedef std::function Callback; /** * Sensitivity callback. This function object returns a true or false value, * indicating whether the associated menu item should be clickable or not. */ typedef std::function SensitivityTest; /** * Visibility callback. This function object returns a true or false value, * indicating whether the associated menu item should be visible or not. */ typedef std::function VisibilityTest; protected: /* * Default test. Returns true in all cases. If a menu item does * not specify its own test, this will be used to ensure the * item is always visible or sensitive. */ static bool _alwaysTrue() { return true; } public: // Convenience method, directly taking text and icon strings plus // callback function objects as argument. virtual void addItem(wxMenuItem* widget, const Callback& callback, const SensitivityTest& sensTest = SensitivityTest(_alwaysTrue), const VisibilityTest& visTest = VisibilityTest(_alwaysTrue)) = 0; // Adds a certain item to this menu virtual void addItem(const IMenuItemPtr& item) = 0; }; } // namespace DarkRadiant-2.0.2/include/imodel.h000066400000000000000000000117301245424655700167640ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_IMODEL_H) #define INCLUDED_IMODEL_H #include "Bounded.h" #include "irender.h" #include "inode.h" #include "imodule.h" /* Forward decls */ class AABB; class ModelSkin; namespace model { class IModelSurface; // see imodelsurface.h typedef std::vector StringList; /** * \brief * Interface for static models. * * This interface provides functions for obtaining information about a LWO or * ASE model, such as its bounding box or poly count. The interface also * inherits from OpenGLRenderable to allow model instances to be used for * rendering. */ class IModel : public OpenGLRenderable, public Bounded { public: /** * greebo: The filename (without path) of this model. */ virtual std::string getFilename() const = 0; /** * greebo: Returns the VFS path which can be used to load * this model from the modelcache. */ virtual std::string getModelPath() const = 0; /** Apply the given skin to this model. * * @param skin * The ModelSkin instance to apply to this model. */ virtual void applySkin(const ModelSkin& skin) = 0; /** Return the number of material surfaces on this model. Each material * surface consists of a set of polygons sharing the same material. */ virtual int getSurfaceCount() const = 0; /** Return the number of vertices in this model, equal to the sum of the * vertex count from each surface. */ virtual int getVertexCount() const = 0; /** Return the number of triangles in this model, equal to the sum of the * triangle count from each surface. */ virtual int getPolyCount() const = 0; /** * \brief * Return a vector of strings listing the active materials used in this * model, after any skin remaps. * * The list is owned by the model instance. */ virtual const StringList& getActiveMaterials() const = 0; /** * \brief * Return the surface with the given index * * Retrieves the interface of a specific surface, to get access to the * surface's polygons and vertices. * * \param surfaceNum * The surface index, must be in [0..getSurfaceCount()) */ virtual const IModelSurface& getSurface(unsigned surfaceNum) const = 0; }; // Smart pointer typedefs typedef std::shared_ptr IModelPtr; typedef std::weak_ptr IModelWeakPtr; /** * greebo: Each node in the scene that represents "just" a model, * derives from this class. Use a cast on this class to * identify model nodes in the scene. */ class ModelNode { public: virtual ~ModelNode() {} // Returns the contained IModel virtual const IModel& getIModel() const = 0; // Returns the contained IModel virtual IModel& getIModel() = 0; }; typedef std::shared_ptr ModelNodePtr; } // namespace model // Utility methods inline bool Node_isModel(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node) != NULL; } inline model::ModelNodePtr Node_getModel(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } const std::string MODULE_MODELLOADER("ModelLoader"); // fileType is appended ("ModeLoaderASE") /** Model loader module API interface. */ class ModelLoader : public RegisterableModule { public: /** * greebo: Returns a newly created model node for the given model name. * * @modelName: This is usually the value of the "model" spawnarg of entities. * * @returns: the newly created modelnode (can be NULL if the model was not found). */ virtual scene::INodePtr loadModel(const std::string& modelName) = 0; /** * Load a model from the VFS, and return the IModel subclass for it. * * @returns: the IModelPtr containing the renderable model or * NULL if the model loader could not load the file. */ virtual model::IModelPtr loadModelFromPath(const std::string& path) = 0; }; typedef std::shared_ptr ModelLoaderPtr; // Acquires the PatchCreator of the given type ("ASE", "NULL", "3DS", etc.) inline ModelLoader& GlobalModelLoader(const std::string& fileType) { ModelLoaderPtr _modelLoader( std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_MODELLOADER + fileType) // e.g. "ModeLoaderASE" ) ); return *_modelLoader; } #endif /* _IMODEL_H_ */ DarkRadiant-2.0.2/include/imodelcache.h000066400000000000000000000034131245424655700177470ustar00rootroot00000000000000#ifndef IMODELCACHE_H_ #define IMODELCACHE_H_ #include "imodule.h" #include "imodel.h" #include "inode.h" const std::string MODULE_MODELCACHE("ModelCache"); namespace model { /** Modelcache interface. */ class IModelCache : public RegisterableModule { public: /** * greebo: This method returns the readily fabricated scene::Node * containing the suitable model node. The modelPath is analysed * and the correct ModelLoader is invoked to create the node. * * @returns: a valid scene::INodePtr, which is never NULL. If the model * could not be loaded, the fallback "NullModel" is returned. */ virtual scene::INodePtr getModelNode(const std::string& modelPath) = 0; /** * greebo: Get the IModel object for the given VFS path. The request is cached, * so calling this with the same path twice will return the same * IModelPtr to save memory. * * This method is primarily used by the ModelLoaders to acquire their model data. */ virtual IModelPtr getModel(const std::string& modelPath) = 0; /** * greebo: Utility function to get the ModelLoader for a certain type. * * @type: The model type (usually the file extension, e.g. lwo, ase). */ virtual ModelLoaderPtr getModelLoaderForType(const std::string& type) = 0; // Clears the modelcache virtual void clear() = 0; }; } // namespace model #if defined(__GNUC__) && __GNUC__ >= 4 #define INLINE_VISIBILITY __attribute__ ((visibility ("hidden"))) #else #define INLINE_VISIBILITY #endif inline INLINE_VISIBILITY model::IModelCache& GlobalModelCache() { static model::IModelCache& _modelCache( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_MODELCACHE) ) ); return _modelCache; } #endif /* IMODELCACHE_H_ */ DarkRadiant-2.0.2/include/imodelsurface.h000066400000000000000000000021501245424655700203310ustar00rootroot00000000000000#pragma once // Math/Vertex classes #include "render/ArbitraryMeshVertex.h" namespace model { // A Polygon (Triangle) which is part of a model surface struct ModelPolygon { ArbitraryMeshVertex a; ArbitraryMeshVertex b; ArbitraryMeshVertex c; }; // Abstract definition of a model surface class IModelSurface { public: // Returns the number of vertices of this surface virtual int getNumVertices() const = 0; // Returns the number of tris of this surface virtual int getNumTriangles() const = 0; // Get a specific vertex of this surface virtual const ArbitraryMeshVertex& getVertex(int vertexIndex) const = 0; /** * greebo: Returns a specific polygon from this model surface. * Don't expect this to be fast as things are returned by value. * This is merely to provide read access to the model polygons * for scripts and plugins. */ virtual ModelPolygon getPolygon(int polygonIndex) const = 0; /** * Get the name of the default material for this surface, i.e. * the name of the material without any skin applied. */ virtual const std::string& getDefaultMaterial() const = 0; }; } // namespace DarkRadiant-2.0.2/include/imodule.h000066400000000000000000000227331245424655700171560ustar00rootroot00000000000000#pragma once #include #include #include #include #include #include #include /** * \defgroup module Module system */ /** greebo: These registry keys can be used application-wide during runtime * to retrieve the various paths. */ namespace { const char* const RKEY_APP_PATH = "user/paths/appPath"; const char* const RKEY_HOME_PATH = "user/paths/homePath"; const char* const RKEY_SETTINGS_PATH = "user/paths/settingsPath"; const char* const RKEY_BITMAPS_PATH = "user/paths/bitmapsPath"; const char* const RKEY_ENGINE_PATH = "user/paths/enginePath"; const char* const RKEY_MAP_PATH = "user/paths/mapPath"; const char* const RKEY_PREFAB_PATH = "user/paths/prefabPath"; } // A function taking an error title and an error message string, invoked in debug builds // for things like ASSERT_MESSAGE and ERROR_MESSAGE typedef std::function ErrorHandlingFunction; /** * Provider for various information that may be required by modules during * initialisation. * * \ingroup module */ class ApplicationContext { public: /** * \brief * Argument list type. */ typedef std::vector ArgumentList; /** * Destructor */ virtual ~ApplicationContext() {} /** * Return the application path of the current Radiant instance. */ virtual std::string getApplicationPath() const = 0; /** * Return the toplevel path contaning runtime data files, such as the GL * programs or UI descriptor files. On Windows this is the same as the * application path, on Linux it is determined at compile-time but probably * something like /usr/share/darkradiant. */ virtual std::string getRuntimeDataPath() const = 0; /** * Return the settings path of the current Radiant instance. */ virtual std::string getSettingsPath() const = 0; /** * Return the settings path of the current Radiant instance. */ virtual std::string getBitmapsPath() const = 0; /** * \brief * Return the list of command line arguments. */ virtual const ArgumentList& getCmdLineArgs() const = 0; /** * Return the reference to the application's output/error streams. */ virtual std::ostream& getOutputStream() const = 0; virtual std::ostream& getErrorStream() const = 0; virtual std::ostream& getWarningStream() const = 0; /** * Sets up the paths and stores them into the registry. */ virtual void savePathsToRegistry() const = 0; /** * Retrieve a function pointer which can handle assertions and runtime errors */ virtual const ErrorHandlingFunction& getErrorHandlingFunction() const = 0; }; /** * Set of strings for module dependencies. */ typedef std::set StringSet; /** * Interface class for modules. Each RegisterableModule can return its name and * its set of dependencies. * * Note that this interface does NOT concern itself with the type (interface) * of each individual module; it is up to the GlobalBlah() accessor function * associated with each module to perform the required downcast to the known * type. * * All RegisterableModules implement sigc::trackable, since they will often want * to connect themselves to another module's signal(s). * * \ingroup module */ class RegisterableModule: public sigc::trackable { public: /** * Destructor */ virtual ~RegisterableModule() {} /** * Return the name of this module. This must be globally unique across all * modules; the modulesystem will throw a logic_error if two modules attempt * to register themselves with the same name. */ virtual const std::string& getName() const = 0; /** * Return the set of dependencies for this module. The return value is a * set of strings, each containing the unique name (as returned by * getName()) of a module which must be initialised before this one. */ virtual const StringSet& getDependencies() const = 0; /** * Instruct this module to initialise itself. A RegisterableModule must NOT * invoke any calls to other modules in its constructor, since at the point * of construction the other modules will not have been initialised. Once * all of the dependencies are processed by the ModuleRegistry, each module * will have its initialiseModule() method called at the appropriate point. * * The ModuleRegistry guarantees that any modules named in the set of * dependencies returned by getDependencies() will be initialised and ready * for use at the time this method is invoked. Attempting to access a module * which was NOT listed as a dependency is undefined. * * @param ctx * The ApplicationContext of the running Radiant application. */ virtual void initialiseModule(const ApplicationContext& ctx) = 0; /** * Optional shutdown routine. Allows the module to de-register itself, * shutdown windows, save stuff into the Registry and so on. * * All the modules are getting called one by one, all other modules * are available until the last shutdownModule() call was invoked. */ virtual void shutdownModule() { // Empty default implementation } }; /** * Shared pointer typdef. */ typedef std::shared_ptr RegisterableModulePtr; /** * A ModuleObserver can be attached/detached to certain modules (like the * MaterialManager or the OpenGLRendersystem) to get notified about * realise() or unrealise() events. * (Might be replaced by the sigc signal framework eventually) */ class ModuleObserver { public: virtual ~ModuleObserver() {} virtual void unrealise() = 0; virtual void realise() = 0; }; /** * Interface for the module registry. This is the owner and manager of all * RegisterableModules defined in DLLs and the main binary. * * For obvious reasons, the ModuleRegistry itself is not a module, but a static * object owned by the main binary and returned through a globally-accessible * method. * * \ingroup module */ class IModuleRegistry { public: /** * Destructor */ virtual ~IModuleRegistry() {} /** * Register a RegisterableModule. The name and dependencies are retrieved * through the appropriate RegisterableModule interface methods. * * This method does not cause the RegisterableModule to be initialised. */ virtual void registerModule(RegisterableModulePtr module) = 0; /** * Initialise all of the modules previously registered with * registerModule() in the order required by their dependencies. This method * is invoked once, at application startup, with any subsequent attempts * to invoke this method throwing a logic_error. */ virtual void initialiseModules() = 0; /** * All the RegisterableModule::shutdownModule() routines are getting * called one by one. No modules are actually destroyed during the * iteration is ongoing, so each module is guaranteed to exist. * * After the last shutdownModule() call has been invoked, the modules * can be safely unloaded/destroyed. */ virtual void shutdownModules() = 0; /** * Retrieve the module associated with the provided unique name. If the * named module is not found, an empty RegisterableModulePtr is returned * (this allows modules to be optional). * * Note that the return value of this function is RegisterableModulePtr, * which in itself is useless to application code. It is up to the accessor * functions defined in each module interface (e.g. GlobalEntityCreator()) * to downcast the pointer to the appropriate type. */ virtual RegisterableModulePtr getModule(const std::string& name) const = 0; /** * Returns TRUE if the named module exists in the records. */ virtual bool moduleExists(const std::string& name) const = 0; /** * This retrieves a reference to the information structure ApplicationContext, * which holds the AppPath, SettingsPath and references to the application * streams. The latter can be used by modules to initialise their * rMessage/globalErrorStreams(). */ virtual const ApplicationContext& getApplicationContext() const = 0; }; namespace module { /** * \namespace module * Types and functions implementing the module registry system. * * \ingroup module */ /** * Global ModuleRegistry accessor function exported by the main binary. * Note: Don't use this from within modules (entity, shaders, etc.), * this only works from within the DarkRadiant core binary (Win32). */ IModuleRegistry& getRegistry(); /** greebo: This is a container holding a reference to the registry. * The getRegistry() symbol above is not exported to the * modules in Win32 compiles. That's why this structure * has to be initialised in the RegisterModule() routine. * * As soon as it's initialised, the module can access the ModuleRegistry * with the routine GlobalModuleRegistry() below. */ class RegistryReference { IModuleRegistry* _registry; public: RegistryReference() : _registry(NULL) {} inline void setRegistry(IModuleRegistry& registry) { _registry = ®istry; } inline IModuleRegistry& getRegistry() { assert(_registry); // must not be NULL return *_registry; } static RegistryReference& Instance() { static RegistryReference _registryRef; return _registryRef; } }; /** * Global accessor method for the ModuleRegistry. */ inline IModuleRegistry& GlobalModuleRegistry() { return RegistryReference::Instance().getRegistry(); } } // Platform-specific definition which needs to be defined both // in the plugins and the main binary. #if defined(WIN32) #define DARKRADIANT_DLLEXPORT __stdcall #else #define DARKRADIANT_DLLEXPORT #endif DarkRadiant-2.0.2/include/imousetool.h000066400000000000000000000066021245424655700177140ustar00rootroot00000000000000#pragma once #include #include #include #include "imousetoolevent.h" namespace ui { /** * A Tool class represents an operator which can be "used" * in DarkRadiant's Ortho- and Camera views by using the mouse. */ class MouseTool { public: typedef MouseToolEvent Event; enum class Result { Ignored, // event does not apply for this tool Activated, // event handled, tool is now active Continued, // event handled, tool continues to be active Finished, // event handled, tool no longer active }; // Returns the name of this operation. This name is only used // internally and should be unique. virtual const std::string& getName() = 0; // The display name, which is also used in the status bar virtual const std::string& getDisplayName() = 0; virtual Result onMouseDown(Event& ev) = 0; virtual Result onMouseMove(Event& ev) = 0; virtual Result onMouseUp(Event& ev) = 0; // During an active operation the user may hit ESC, // in which case the cancel event will be fired. // This should not be ignored by the tool, which should // seek to shut down any ongoing operation safely. virtual void onCancel() {} // A tool using pointer mode Capture might want to get notified // when the mouse capture of the window has been lost due to // the user alt-tabbing out of the app or something else. virtual void onMouseCaptureLost() {} // Some tools might want to receive mouseMove events even when they // are not active, to send feedback to the user before the buttons // are pressed. The Clipper tool uses this to change the mouse cursor // to a crosshair when moved over a manipulatable clip point. virtual bool alwaysReceivesMoveEvents() { return false; } // By default, when the user is dragging the mouse to the borders of // the view, the viewport will be moved along. For some tools this might // not be desirable, in which case they need to override this method to // return false. virtual bool allowChaseMouse() { return true; } // A tool can request special mouse capture modes during its active phase // All flags can be combined, use Normal to indicate that no capturing is needed. struct PointerMode { enum Flags { Normal = 0, // no capturing, absolute coordinates are sent to onMouseMove, pointer will be shown Capture = 1, // capture mouse (tools should implement onMouseCaptureLost), see also MotionDeltas Freeze = 2, // pointer will be frozen and kept at the same position Hidden = 4, // pointer will be hidden MotionDeltas = 8, // onMouseMove will receive delta values relative to the capture position }; }; // Some tools might want to capture the pointer after onMouseDown // Override this method to return "Capture" instead of "Normal". virtual unsigned int getPointerMode() { return PointerMode::Normal; } // Optional render routine that is invoked after the scene // has been drawn on the interactive window. The projection // and modelview matrix have already been set up for // overlay rendering (glOrtho). virtual void renderOverlay() {} }; typedef std::shared_ptr MouseToolPtr; } // namespace DarkRadiant-2.0.2/include/imousetoolevent.h000066400000000000000000000024021245424655700207500ustar00rootroot00000000000000#pragma once #include "icameraview.h" #include "math/Vector2.h" namespace ui { // Base class for a generic event to be handled by the MouseTool implementation class MouseToolEvent { private: // The device position, normalised within [-1..+1] Vector2 _devicePosition; // The device delta for tools using a frozen mouse pointer Vector2 _deviceDelta; IInteractiveView& _view; public: MouseToolEvent(IInteractiveView& view, const Vector2& devicePosition) : _devicePosition(devicePosition), _deviceDelta(0, 0), _view(view) {} MouseToolEvent(IInteractiveView& view, const Vector2& devicePosition, const Vector2& delta) : _devicePosition(devicePosition), _deviceDelta(delta), _view(view) {} virtual ~MouseToolEvent() {} // Returns the mouse position in normalised device coordinates (x,y in [-1..+1]) const Vector2& getDevicePosition() const { return _devicePosition; } // Used by MouseMove events, this contains the delta // in device coordinates since the last mousemove event const Vector2& getDeviceDelta() const { return _deviceDelta; } IInteractiveView& getInteractiveView() { return _view; } }; } // namespace DarkRadiant-2.0.2/include/imousetoolmanager.h000066400000000000000000000103521245424655700212440ustar00rootroot00000000000000#pragma once #include "imousetool.h" #include "imodule.h" #include #include #include namespace ui { // A list of mousetools class MouseToolStack : public std::list { public: // Tries to handle the given event, returning the first tool that responded positively MouseToolPtr handleMouseDownEvent(MouseTool::Event& mouseEvent) { for (const_iterator i = begin(); i != end(); ++i) { // Ask each tool to handle the event MouseTool::Result result = (*i)->onMouseDown(mouseEvent); if (result != MouseTool::Result::Ignored && result != MouseTool::Result::Finished) { // This tool is now activated return *i; } } return MouseToolPtr(); } }; // A set of MouseTools, use the GlobalMouseToolManager() to get access class IMouseToolGroup { public: virtual ~IMouseToolGroup() {} // MouseTools categories enum class Type { OrthoView = 0, CameraView = 1, }; // Returns the type of this group virtual Type getType() = 0; // Returns the display name of this group virtual std::string getDisplayName() = 0; // Add a MouseTool to the given group virtual void registerMouseTool(const MouseToolPtr& tool) = 0; // Removes the given mousetool from all categories. virtual void unregisterMouseTool(const MouseToolPtr& tool) = 0; // Returns the named mouse tool (case sensitive) or NULL if not found. virtual MouseToolPtr getMouseToolByName(const std::string& name) = 0; // Visit each mouse tool with the given function object virtual void foreachMouseTool(const std::function& func) = 0; // Returns the set of mapped tools for this mouse event. The unsigned int is a bitmap // using the same flags as used in wxutil::MouseButton virtual MouseToolStack getMappedTools(unsigned int state) = 0; // Returns the mapping for the given mousetool virtual unsigned int getMappingForTool(const MouseToolPtr& tool) = 0; // Map a tool to a defined mouse state (as used in wxutil::MouseButton) // It's possible to map the same tool to multiple mouse states virtual void addToolMapping(unsigned int state, const MouseToolPtr& tool) = 0; // Iterate over each tool mapping virtual void foreachMapping(const std::function& func) = 0; // Removes all mappings for all tools virtual void clearToolMappings() = 0; // Removes all mappings for the given tool virtual void clearToolMapping(MouseToolPtr& tool) = 0; }; typedef std::shared_ptr IMouseToolGroupPtr; /** * An interface to an object which is able to hold one or more mousetool * groups. * * Clients of IMouseToolManager are GlobalXYWnd and GlobalCamera, for instance. */ class IMouseToolManager : public RegisterableModule { public: virtual ~IMouseToolManager() {} // Get the group defined by the given enum. This always succeeds, if the group // is not existing yet, a new one will be created internally. virtual IMouseToolGroup& getGroup(IMouseToolGroup::Type group) = 0; // Iterate over each group using the given visitor function virtual void foreachGroup(const std::function& functor) = 0; // Returns matching MouseTools for the given event and group type. To convert a wxMouseEvent to // the unsigned int mouseState, use wxutil::MouseButton virtual MouseToolStack getMouseToolsForEvent(IMouseToolGroup::Type group, unsigned int mouseState) = 0; // Prints the list of possible mouse actions to the statusbar virtual void updateStatusbar(unsigned int mouseState) = 0; // Reverts all mappings to the defaults as defined in the stock input.xml virtual void resetBindingsToDefault() = 0; }; } // namespace const char* const MODULE_MOUSETOOLMANAGER = "MouseToolManager"; inline ui::IMouseToolManager& GlobalMouseToolManager() { // Cache the reference locally static ui::IMouseToolManager& _mtManager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_MOUSETOOLMANAGER) ) ); return _mtManager; } DarkRadiant-2.0.2/include/inameobserver.h000066400000000000000000000012001245424655700203430ustar00rootroot00000000000000#ifndef _NAME_OBSERVER_H_ #define _NAME_OBSERVER_H_ #include #include /** * greebo: A NameObserver is observing one name in a map Namespace. * * It provides "event methods" which get called by the Namespace on * any name changes. */ class NameObserver { public: virtual ~NameObserver() {} /** * greebo: This is the "change" event, which gets issued by the Namespace. * The old name as well as the new name is passed along. */ virtual void onNameChange(const std::string& oldName, const std::string& newName) = 0; }; typedef std::shared_ptr NameObserverPtr; #endif /* _NAME_OBSERVER_H_ */ DarkRadiant-2.0.2/include/inamespace.h000066400000000000000000000125031245424655700176170ustar00rootroot00000000000000#ifndef _INAMESPACE_H__ #define _INAMESPACE_H__ #include "inode.h" #include "imodule.h" // Forward declaration (is declared in inameobserver.h) class NameObserver; /** * greebo: The Namespace is the managing class which keeps track * of all the names in the map. It gets notified on name changes * and broadcasts this event to all registered NameObservers. * * Additionally, it provides algorithms to merge elements from * another namespace into this one, preserving all links between * Namespaced objects. */ class INamespace { public: virtual ~INamespace() {} /** * greebo: Call this to put the given scene::Node and all its * children into this Namespace. This will search for Namespaced * items and tell them to add their relevant "names" to this space. */ virtual void connect(const scene::INodePtr& root) = 0; /** * greebo: The counter-part of the connect() method above. This will * remove the given node and all its children from this namespace. */ virtual void disconnect(const scene::INodePtr& root) = 0; /** * greebo: Returns true if the given name already exists in this namespace. */ virtual bool nameExists(const std::string& name) = 0; /** * greebo: Inserts the given name into this namespace. The name * must not exist yet, it won't get inserted otherwise. * * @returns: TRUE if the insertion was successful, FALSE if the name already exists. */ virtual bool insert(const std::string& name) = 0; /** * greebo: Removes the given name from this namespace. The name * is available again afterwards. * * @returns: TRUE if the removal was successful, FALSE if the name did not exist. */ virtual bool erase(const std::string& name) = 0; /** * \brief * Add a new name to the namespace, ensuring that it is unique by adding or * changing a numeric prefix if necessary. * * \return * The actual name that was inserted, unique in this namespace. */ virtual std::string addUniqueName(const std::string& originalName) = 0; /** * greebo: Registers/de-registers a Observer. The Observer will get notified * as soon as the name changes. */ virtual void addNameObserver(const std::string& name, NameObserver& observer) = 0; virtual void removeNameObserver(const std::string& name, NameObserver& observer) = 0; /** * greebo: Tells the namespace to notify the nameobservers about a name change. * This usually gets called by the entity itself, whose name has been altered. */ virtual void nameChanged(const std::string& oldName, const std::string& newName) = 0; /** * \brief * Prepares the given scene graph for import into this namespace by ensuring * that none of its names conflict with those in this namespace. * * The nodes below should have been added to a different namespace * prior to this call, so that links are preserved during name changes. * * After this call, the imported nodes are renamed to fit into this * namespace and can be safely connected to this Namespace. This method does * \em not actually import the given scene graph's names into this * namespace. */ virtual void ensureNoConflicts(const scene::INodePtr& root) = 0; }; typedef std::shared_ptr INamespacePtr; /** * greebo: A Namespaced object is the primary communication * partner for the Namespace. This object provides methods * to connect/disconnect items from a map Namespace. * * Note: the standard implementation in D3 maps is * the NamespaceManager class in the entity module. * * Note: I chose to use raw INamespace* pointers in the interface * to allow the Namespace calling these functions without maintaining * weak_ptrs to itself. This can of course be changed in the * future, but I didn't want to bother with "self" weak_ptrs right now. */ class Namespaced { public: /** * Destructor */ virtual ~Namespaced() {} /** * Returns the name of this object. */ virtual std::string getName() const = 0; // Gets/sets the namespace of this named object virtual void setNamespace(INamespace* space) = 0; virtual INamespace* getNamespace() const = 0; /** * Tells the Namespaced object to register all relevant * names with the associated Namespace. */ virtual void attachNames() = 0; // Counter-part of the registerNames() method above. virtual void detachNames() = 0; /** * Tells the object to change its name. Invoked by the * INamespace class itself during import. */ virtual void changeName(const std::string& newName) = 0; virtual void connectNameObservers() = 0; virtual void disconnectNameObservers() = 0; }; typedef std::shared_ptr NamespacedPtr; inline NamespacedPtr Node_getNamespaced(scene::INodePtr node) { return std::dynamic_pointer_cast(node); } /** * greebo: Use the namespace factory to create new Namespace objects. */ class INamespaceFactory : public RegisterableModule { public: /** * Creates and returns a new Namespace. */ virtual INamespacePtr createNamespace() = 0; }; const std::string MODULE_NAMESPACE_FACTORY("NamespaceFactory"); // Factory accessor inline INamespaceFactory& GlobalNamespaceFactory() { // Cache the reference locally static INamespaceFactory& _namespaceFactory( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_NAMESPACE_FACTORY) ) ); return _namespaceFactory; } #endif /* _INAMESPACE_H__ */ DarkRadiant-2.0.2/include/inode.h000066400000000000000000000140611245424655700166110ustar00rootroot00000000000000#pragma once #include "Bounded.h" #include "ilayer.h" #include "irenderable.h" #include #include #include class AABB; class Matrix4; class IRenderEntity; typedef std::shared_ptr IRenderEntityPtr; namespace scene { /** * Interface for objects which can be filtered by the FilterSystem. */ class Filterable { public: /** * Destructor */ virtual ~Filterable() {} /** * Return the filtered state of this object. Returns true if the object is * hidden due to filtering, and false if it is visible. * * It is up to the object's implementation to determine what criteria are * used for filtering (texture, entityclass etc), however these criteria * MUST be controlled by the filter system, and cannot include other * arbitrary criteria such as the time of day or available memory. * * Note that this is not the primary function to discard objects during * rendering or selection test. Use INode::visible() instead, which includes * the current "filtered" setting. */ virtual bool isFiltered() const = 0; // Set the filtered status of this object virtual void setFiltered(bool filtered) = 0; }; class INode; typedef std::shared_ptr INodePtr; typedef std::weak_ptr INodeWeakPtr; class Graph; typedef std::shared_ptr GraphPtr; class NodeVisitor { public: /** * Destructor */ virtual ~NodeVisitor() {} /** * greebo: Gets called before the children are traversed. * Return TRUE to traverse the children, FALSE to prevent this. */ virtual bool pre(const INodePtr& node) = 0; /** * greebo: Optional post-traverse call, gets invoked after the children * of this node have been traversed. */ virtual void post(const INodePtr& node) {} }; /** * greebo: Abstract definition of a Node, a basic element * of the scenegraph. All nodes share a certain set of * functionality, like Layer functionality or being a Renderable. */ class INode : public Layered, public Filterable, public Bounded, public Renderable { public: enum class Type { Unknown = 0, MapRoot, Entity, Primitive, // Brush or Patch Model, Particle, }; public: virtual ~INode() {} /// Get the user-friendly string name of this node. virtual std::string name() const = 0; // Returns the type of this node virtual Type getNodeType() const = 0; /** * Set the scenegraph this node is belonging to. This is usually * set by the scenegraph itself during insertion. */ virtual void setSceneGraph(const GraphPtr& sceneGraph) = 0; /** greebo: Returns true, if the node is the root element * of the scenegraph. */ virtual bool isRoot() const = 0; /** greebo: Sets the "isRoot" flag of this node. */ virtual void setIsRoot(bool isRoot) = 0; /** greebo: State bit accessor methods. This enables/disables * the bit of the state flag (e.g. hidden, excluded) */ virtual void enable(unsigned int state) = 0; virtual void disable(unsigned int state) = 0; /** greebo: Returns true, if the node is not hidden by * exclusion, filtering or anything else. */ virtual bool visible() const = 0; /** greebo: Returns true, if the node is excluded (eExcluded flag set) */ virtual bool excluded() const = 0; // Child node handling virtual void addChildNode(const INodePtr& node) = 0; virtual void removeChildNode(const INodePtr& node) = 0; virtual bool hasChildNodes() const = 0; /** * greebo: Traverses this node and all child nodes (recursively) * using the given visitor. * * Note: replaces the legacy Node_traverseSubgraph() method. */ virtual void traverse(NodeVisitor& visitor) = 0; /** * greebo: Traverses all child nodes (recursively) using the given visitor. * Note: this will NOT visit the current node. */ virtual void traverseChildren(NodeVisitor& visitor) const = 0; /** * Traversal function which can be used to hit all nodes in a * graph or collection. If the functor returns false traversal stops. */ typedef std::function VisitorFunc; /** * Call the given functor for each child node, depth first * This is a simpler alternative to the usual traverse() method * which provides pre() and post() methods and more control about * which nodes to traverse and. This forEachNode() routine simply * hits every child node including their children. * * @returns: true if the functor returned false on any of the * visited nodes. The return type is used to pass the stop signal * up the stack during traversal. */ virtual bool foreachNode(const VisitorFunc& functor) const = 0; /** * Returns a shared_ptr to itself. */ virtual scene::INodePtr getSelf() = 0; // Set the parent of this node, is called on insertion in a traversable virtual void setParent(const INodePtr& parent) = 0; virtual scene::INodePtr getParent() const = 0; /** * greebo: Gets called after the node has been inserted into the scene. */ virtual void onInsertIntoScene() = 0; /** * greebo: This gets called by the SceneGraph before the Node is actually * removed from the scene. This gives the node the opportunity to * change its "selected" status or anything else. */ virtual void onRemoveFromScene() = 0; /** * Returns true if this node is in the scene */ virtual bool inScene() const = 0; // Get/Set the render entity this node is attached to virtual IRenderEntity* getRenderEntity() const = 0; virtual void setRenderEntity(IRenderEntity* entity) = 0; // Call this if the node gets changed in any way or gets inserted somewhere. virtual void boundsChanged() = 0; // Call this on transform change virtual void transformChanged() = 0; // Returns the bounds in world coordinates virtual const AABB& worldAABB() const = 0; // Returns the transformation from local to world coordinates virtual const Matrix4& localToWorld() const = 0; // Undo/Redo events - some nodes need to do extra legwork after undo or redo // This is called by the TraversableNodeSet after a undo/redo operation // not by the UndoSystem itself, at least not yet. virtual void onPostUndo() {} virtual void onPostRedo() {} }; } // namespace scene DarkRadiant-2.0.2/include/iorthocontextmenu.h000066400000000000000000000023461245424655700213140ustar00rootroot00000000000000#pragma once #include "imodule.h" #include "imenu.h" namespace ui { class IOrthoContextMenu : public RegisterableModule { public: // The section enum specifies where menu item should be listed under // It's possible to add new sections > SECTION_USER enum Section { SECTION_CREATE, // Create Entity, Create Speaker, etc. SECTION_ACTION, // Make Visportals SECTION_LAYER, // Layer operations SECTION_USER = 100, }; /** * Adds a new ortho context menu item in the given section. * * @section: an integer value referring to the Section enum above. * It's possible to specify new sections by passing values > SECTION_USER. * Sections are visually separated by horizontal lines in the menu. */ virtual void addItem(const IMenuItemPtr& item, int section) = 0; /** * Removes a certain item from the menus. */ virtual void removeItem(const IMenuItemPtr& item) = 0; }; } // namespace const char* const MODULE_ORTHOCONTEXTMENU = "OrthoContextMenu"; inline ui::IOrthoContextMenu& GlobalOrthoContextMenu() { // Cache the reference locally static ui::IOrthoContextMenu& _menu( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_ORTHOCONTEXTMENU) ) ); return _menu; } DarkRadiant-2.0.2/include/iorthoview.h000066400000000000000000000050131245424655700177070ustar00rootroot00000000000000#pragma once #include "imodule.h" #include "iinteractiveview.h" template class BasicVector3; typedef BasicVector3 Vector3; // Possible types of the orthogonal view window enum EViewType { YZ = 0, XZ = 1, XY = 2 }; namespace ui { class IOrthoView : public IInteractiveView { public: virtual ~IOrthoView() {} // The cursor types available on orthoviews enum class CursorType { Pointer, Crosshair, Default = Pointer, }; // Returns the scale factor of this view virtual float getScale() const = 0; // Snaps the given Vector to the XY view's grid // Note that one component of the given vector stays untouched. virtual void snapToGrid(Vector3& point) = 0; // Returns the projection type (XY, XZ, YZ) of this view virtual EViewType getViewType() const = 0; // Sets the mouse cursor type of this view virtual void setCursorType(CursorType type) = 0; // Increase / decrease zoom factor virtual void zoomIn() = 0; virtual void zoomOut() = 0; // Update the xy view on the next occasion virtual void queueDraw() = 0; // Update the xy view asap, not just during the next idle phase virtual void forceDraw() = 0; // Scrolls the view by the specified amount of screen pixels virtual void scroll(int x, int y) = 0; }; class IXWndManager : public RegisterableModule { public: // Passes a queueDraw() call to each allocated view virtual void updateAllViews() = 0; // Free all allocated views virtual void destroyViews() = 0; // Sets the origin of all available views virtual void setOrigin(const Vector3& origin) = 0; // Sets the scale of all available views virtual void setScale(float scale) = 0; // Positions all available views virtual void positionAllViews(const Vector3& origin) = 0; // Positions the active views virtual void positionActiveView(const Vector3& origin) = 0; // Returns the view type of the currently active view virtual EViewType getActiveViewType() const = 0; // Sets the viewtype of the active view virtual void setActiveViewType(EViewType viewType) = 0; }; } // namespace const char* const MODULE_ORTHOVIEWMANAGER = "OrthoviewManager"; // This is the accessor for the xy window manager module inline ui::IXWndManager& GlobalXYWndManager() { // Cache the reference locally static ui::IXWndManager& _xyWndManager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_ORTHOVIEWMANAGER) ) ); return _xyWndManager; } DarkRadiant-2.0.2/include/iparticlenode.h000066400000000000000000000012171245424655700203340ustar00rootroot00000000000000#pragma once #include "inode.h" #include namespace particles { class IRenderableParticle; typedef std::shared_ptr IRenderableParticlePtr; /// Interface for a Node containing a particle system class IParticleNode: public virtual scene::INode { public: // Get the reference to the render particle this node is containing virtual IRenderableParticlePtr getParticle() const = 0; }; typedef std::shared_ptr IParticleNodePtr; /// Test if a node is a particle node inline bool isParticleNode(const scene::INodePtr& node) { return (dynamic_cast(node.get()) != NULL); } } // namespace DarkRadiant-2.0.2/include/iparticles.h000066400000000000000000000147751245424655700176660ustar00rootroot00000000000000#pragma once #include "imodule.h" #include "irenderable.h" #include #include class RenderSystem; class Matrix4; template class BasicVector3; typedef BasicVector3 Vector3; class AABB; namespace scene { class INode; typedef std::shared_ptr INodePtr; } /// Classes related to storage and rendering of particle systems namespace particles { // see iparticlestage.h for definition class IStageDef; // see iparticlenode.h for definition class IParticleNode; typedef std::shared_ptr IParticleNodePtr; /** * \brief * Definition of a particle system. * * Each particle system is made up of one or more particle stages, information * about which is provided via the IStageDef interface. */ class IParticleDef { public: /** * Destructor */ virtual ~IParticleDef() {} /// Get the name of the particle system. virtual const std::string& getName() const = 0; /** * Get the name of the .prt file this particle is defined in. * Might return an empty string if this particle def has not been saved yet. */ virtual const std::string& getFilename() const = 0; /** * Set/get the depth hack flag */ virtual float getDepthHack() const = 0; virtual void setDepthHack(float value) = 0; /// Returns the number of stages for this particle system. virtual std::size_t getNumStages() const = 0; /// Get a const stage definition from the particle definition virtual const IStageDef& getStage(std::size_t stageNum) const = 0; /// Get a stage definition from the particle definition virtual IStageDef& getStage(std::size_t stageNum) = 0; /** * Add a new stage to this particle, returns the index of the new stage. */ virtual std::size_t addParticleStage() = 0; /** * Removes the stage with the given index. */ virtual void removeParticleStage(std::size_t index) = 0; /** * Swaps the location of the two given particle stages. After this step the * particle stage at will be at and vice versa. * If one of the indices is out of bounds (or both indices are equal) nothing will happen. */ virtual void swapParticleStages(std::size_t index, std::size_t index2) = 0; /// Signal emitted when some aspect of the particle def has changed virtual sigc::signal signal_changed() const = 0; // Comparison operators - particle defs are considered equal if all properties (except the name!), // number of stages and stage contents are the equal virtual bool operator==(const IParticleDef& other) const = 0; virtual bool operator!=(const IParticleDef& other) const = 0; // Copies all properties from the other particle, overwriting this one // Note: Name, filename and observers are not copied virtual void copyFrom(const IParticleDef& other) = 0; }; typedef std::shared_ptr IParticleDefPtr; /** * A renderable particle, which is capable of compiling the * particle system into actual geometry usable for the backend rendersystem. * * As it derives from Renderable, this object can be added to a RenderableCollector * during the front-end render phase. */ class IRenderableParticle : public Renderable { public: /** * Update the particle geometry using the given rendersystem. * The rendersystem is needed for acquiring the shaders and * the current render time. * * @viewRotation: the matrix to orient themselves to the viewer. */ virtual void update(const Matrix4& viewRotation) = 0; /** * Get the particle definition used by this renderable. */ virtual const IParticleDefPtr& getParticleDef() const = 0; /** * Set the particle definition. You'll need to call update() after * setting a new particle def. */ virtual void setParticleDef(const IParticleDefPtr& def) = 0; /** * greebo: Particles have a main direction, usually defined by the * emitter's rotation. For a stand-alone particle (without emitter) * this direction defaults to <0,0,1>, but can be overridden here. */ virtual void setMainDirection(const Vector3& direction) = 0; /** * Set the colour needed by the particle system when the setting * "use entity colour" is activated. */ virtual void setEntityColour(const Vector3& colour) = 0; /** * Returns the bounding box taken by the entirety of quads in this particle. * Make sure to call this after the update() method, as getAABB() will * calculate and return the bounds at the time passed to update(). */ virtual const AABB& getBounds() = 0; }; typedef std::shared_ptr IRenderableParticlePtr; /** * Callback for evaluation particle defs. */ typedef std::function< void (const IParticleDef&) > ParticleDefVisitor; /// Inteface for the particles manager class IParticlesManager : public RegisterableModule { public: /// Signal emitted when particle definitions are reloaded virtual sigc::signal signal_particlesReloaded() const = 0; /// Enumerate each particle def. virtual void forEachParticleDef(const ParticleDefVisitor&) const = 0; /// Return the definition object for the given named particle system virtual IParticleDefPtr getDefByName(const std::string& name) = 0; /** * Create a renderable particle, which is capable of compiling the * particle system into actual geometry usable for the backend rendersystem. * * @returns: the renderable particle instance or NULL if the named particle was not found. */ virtual IRenderableParticlePtr getRenderableParticle(const std::string& name) = 0; /// Create and return a particle node for the named particle system virtual IParticleNodePtr createParticleNode(const std::string& name) = 0; /** * \brief * Force the particles manager to reload all particle definitions from the * .prt files. * * Any existing references to IParticleDefs will remain valid, but their * contents might change. Anything sensitive to these changes (like the * renderable particles) should connect to the particles reloaded signal. * * If particle defs are removed from the .prt files, the corresponding * IParticleDef instance will remain in memory, but will be empty after * reload. */ virtual void reloadParticleDefs() = 0; }; } // namespace const char* const MODULE_PARTICLESMANAGER = "ParticlesManager"; // Accessor inline particles::IParticlesManager& GlobalParticlesManager() { // Cache the reference locally static particles::IParticlesManager& _particlesManager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_PARTICLESMANAGER) ) ); return _particlesManager; } DarkRadiant-2.0.2/include/iparticlestage.h000066400000000000000000000227321245424655700205170ustar00rootroot00000000000000#pragma once #include template class BasicVector3; typedef BasicVector3 Vector3; template class BasicVector4; typedef BasicVector4 Vector4; namespace particles { /** * greebo: A particle parameter represents a bounded member value * of a particle stage (e.g. speed or size). * * Use the evaluate() method to retrieve a particular value. * * It is modeled after the idParticleParam class in the D3 SDK. */ class IParticleParameter { public: // Get the lower bound of this parameter virtual float getFrom() const = 0; // Get the upper bound of this parameter virtual float getTo() const = 0; // Set the lower bound of this parameter virtual void setFrom(float value) = 0; // Set the upper bound of this parameter virtual void setTo(float value) = 0; // Return a specific value. Fraction == 0 returns the lower bound value. virtual float evaluate(float fraction) const = 0; // Returns the integrated value at the point . virtual float integrate(float fraction) const = 0; // Comparison operators - particle parameters are considered equal // if both from and to are equal virtual bool operator==(const IParticleParameter& other) const = 0; virtual bool operator!=(const IParticleParameter& other) const = 0; }; /** * \brief * Definition of a single particle stage. * * Each stage consists of a set of particles with the same properties (texture, * acceleration etc). * * Most of the member descriptions are directly taken from the D3 SDK. */ class IStageDef { public: // Particle orientation enum OrientationType { ORIENTATION_VIEW, ORIENTATION_AIMED, // angle and aspect are disregarded ORIENTATION_X, ORIENTATION_Y, ORIENTATION_Z }; // Particle distribution enum DistributionType { DISTRIBUTION_RECT, // ( sizeX sizeY sizeZ ) DISTRIBUTION_CYLINDER, // ( sizeX sizeY sizeZ ) DISTRIBUTION_SPHERE // ( sizeX sizeY sizeZ ringFraction ) // a ringFraction of zero allows the entire sphere, 0.9 would only // allow the outer 10% of the sphere }; // Particle direction enum DirectionType { DIRECTION_CONE, // parm0 is the solid cone angle DIRECTION_OUTWARD // direction is relative to offset from origin, parm0 is an upward bias }; enum CustomPathType { PATH_STANDARD, PATH_HELIX, // ( sizeX sizeY sizeZ radialSpeed climbSpeed ) PATH_FLIES, PATH_ORBIT, PATH_DRIP }; public: /// Get the shader name. virtual const std::string& getMaterialName() const = 0; /// Set the shader name. virtual void setMaterialName(const std::string& material) = 0; /// Get the particle count. virtual int getCount() const = 0; /// Set the particle count. virtual void setCount(int count) = 0; /** * Get the duration in seconds. */ virtual float getDuration() const = 0; /** * Set the duration in seconds, updates cyclemsec. */ virtual void setDuration(float duration) = 0; /** * Returns ( duration + deadTime ) in msec. */ virtual int getCycleMsec() const = 0; /** * Get the cycles value. */ virtual float getCycles() const = 0; /** * Set the cycles value. */ virtual void setCycles(float cycles) = 0; /** * Get the bunching value [0..1] */ virtual float getBunching() const = 0; /** * Set the bunching value [0..1] */ virtual void setBunching(float value) = 0; /** * Get the time offset in seconds */ virtual float getTimeOffset() const = 0; /** * Set the time offset in seconds */ virtual void setTimeOffset(float value) = 0; /** * Get the dead time in seconds */ virtual float getDeadTime() const = 0; /** * Set the dead time in seconds, updates cyclemsec. */ virtual void setDeadTime(float value) = 0; /** * Get the particle render colour. */ virtual const Vector4& getColour() const = 0; /** * Set the particle render colour. */ virtual void setColour(const Vector4& colour) = 0; /** * Get the particle render colour. */ virtual const Vector4& getFadeColour() const = 0; /** * Set the particle render colour. */ virtual void setFadeColour(const Vector4& colour) = 0; /** * Get the fade in fraction [0..1] */ virtual float getFadeInFraction() const = 0; /** * Set the fade in fraction [0..1] */ virtual void setFadeInFraction(float fraction) = 0; /** * Get the fade out fraction [0..1] */ virtual float getFadeOutFraction() const = 0; /** * Set the fade out fraction [0..1] */ virtual void setFadeOutFraction(float fraction) = 0; /** * Get the fade index fraction [0..1] */ virtual float getFadeIndexFraction() const = 0; /** * Set the fade index fraction [0..1] */ virtual void setFadeIndexFraction(float fraction) = 0; /** * Get the animation frames. */ virtual int getAnimationFrames() const = 0; /** * Set the animation frames. */ virtual void setAnimationFrames(int animationFrames) = 0; /** * Get the animation rate. */ virtual float getAnimationRate() const = 0; /** * Set the animation frames. */ virtual void setAnimationRate(float animationRate) = 0; /** * Get the initial angle. */ virtual float getInitialAngle() const = 0; /** * Set the initial angle. */ virtual void setInitialAngle(float angle) = 0; /** * Get the bounds expansion value. */ virtual float getBoundsExpansion() const = 0; /** * Set the bounds expansion value. */ virtual void setBoundsExpansion(float value) = 0; /** * Get the random distribution flag. */ virtual bool getRandomDistribution() const = 0; /** * Set the random distribution flag. */ virtual void setRandomDistribution(bool value) = 0; /** * Get the "use entity colour" flag. */ virtual bool getUseEntityColour() const = 0; /** * Set the "use entity colour" flag. */ virtual void setUseEntityColour(bool value) = 0; /** * Get the gravity factor. */ virtual float getGravity() const = 0; /** * Set the gravity factor. */ virtual void setGravity(float value) = 0; /** * Get the "apply gravity in world space" flag. */ virtual bool getWorldGravityFlag() const = 0; /** * Get the "apply gravity in world space" flag. */ virtual void setWorldGravityFlag(bool value) = 0; /** * Get the offset vector. */ virtual const Vector3& getOffset() const = 0; /** * Set the offset vector. */ virtual void setOffset(const Vector3& value) = 0; /** * Get the orientation type. */ virtual OrientationType getOrientationType() const = 0; /** * Set the orientation type. */ virtual void setOrientationType(OrientationType value) = 0; /** * Get the orientation parameter with the given index [0..3] */ virtual float getOrientationParm(int parmNum) const = 0; /* * Set the orientation parameter with the given index [0..3]. */ virtual void setOrientationParm(int parmNum, float value) = 0; /** * Get the distribution type. */ virtual DistributionType getDistributionType() const = 0; /** * Set the distribution type. */ virtual void setDistributionType(DistributionType value) = 0; /** * Get the distribution parameter with the given index [0..3] */ virtual float getDistributionParm(int parmNum) const = 0; /* * Set the distribution parameter with the given index [0..3]. */ virtual void setDistributionParm(int parmNum, float value) = 0; /** * Get the direction type. */ virtual DirectionType getDirectionType() const = 0; /** * Set the direction type. */ virtual void setDirectionType(DirectionType value) = 0; /** * Get the direction parameter with the given index [0..3] */ virtual float getDirectionParm(int parmNum) const = 0; /* * Set the direction parameter with the given index [0..3]. */ virtual void setDirectionParm(int parmNum, float value) = 0; /** * Get the custom path type. */ virtual CustomPathType getCustomPathType() const = 0; /** * Set the custom path type. */ virtual void setCustomPathType(CustomPathType value) = 0; /** * Get the custom path parameter with the given index [0..7] */ virtual float getCustomPathParm(int parmNum) const = 0; /* * Set the custom path parameter with the given index [0..7]. */ virtual void setCustomPathParm(int parmNum, float value) = 0; /** * Get the particle size */ virtual const IParticleParameter& getSize() const = 0; virtual IParticleParameter& getSize() = 0; /** * Get the aspect ratio. */ virtual const IParticleParameter& getAspect() const = 0; virtual IParticleParameter& getAspect() = 0; /** * Get the particle speed. */ virtual const IParticleParameter& getSpeed() const = 0; virtual IParticleParameter& getSpeed() = 0; /** * Get the particle rotation speed. */ virtual const IParticleParameter& getRotationSpeed() const = 0; virtual IParticleParameter& getRotationSpeed() = 0; // Comparison operators - particle stages are considered equal // if all properties are equal virtual bool operator==(const IStageDef& other) const = 0; virtual bool operator!=(const IStageDef& other) const = 0; /** * Copy operator, copies all properties from the other stage into this one. */ virtual void copyFrom(const IStageDef& other) = 0; /** * Returns the stage visibility. This flag is used in the Particle Editor context only, * it is not saved to the .prt file therefore it has no effect within the Doom 3 engine. */ virtual bool isVisible() const = 0; /** * Sets the stage visibility. This flag is used in the Particle Editor context only, * it is not saved to the .prt file therefore it has no effect within the Doom 3 engine. */ virtual void setVisible(bool visible) = 0; }; } // namespace DarkRadiant-2.0.2/include/ipatch.h000066400000000000000000000154511245424655700167670ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_IPATCH_H) #define INCLUDED_IPATCH_H #include "imodule.h" #include #include "inode.h" #include "math/Vector2.h" #include "math/Vector3.h" #include "render/VertexNT.h" // This is thrown by the internal patch routines class GenericPatchException : public std::runtime_error { public: // Constructor GenericPatchException(const std::string& what): std::runtime_error(what) {} }; /* greebo: A PatchControl consists of a vertex and a set of texture coordinates. * Multiple PatchControls form a PatchControlArray or (together with width and height) a PatchControlMatrix. */ struct PatchControl { Vector3 vertex; // The coordinates of the control point Vector2 texcoord; // The texture coordinates of this point }; /** * A structure representing the fully tesselated patch * Can be acquired through the IPatch interface for * exporting the geometry to an external app. */ struct PatchMesh { std::size_t width; // width of this mesh std::size_t height; // height of this mesh /// Geometry with normals and texture coordinates std::vector vertices; }; typedef BasicVector2 Subdivisions; // The abstract base class for a Doom3-compatible patch class IPatch { public: // An observer can attach itself to a specific patch instance. // to get notified about changes. class Observer { public: /** * Is called when the dimensions and/or the * values of one or more control points get altered. */ virtual void onPatchControlPointsChanged() = 0; /** * Is called when the patch shader is changed. */ virtual void onPatchTextureChanged() = 0; /** * Is called by the Patch destructor. After this call * the observer is automatically detached. */ virtual void onPatchDestruction() = 0; }; virtual void attachObserver(Observer* observer) = 0; virtual void detachObserver(Observer* observer) = 0; virtual ~IPatch() {} // Resizes the patch to the given dimensions virtual void setDims(std::size_t width, std::size_t height) = 0; // Get the patch dimensions virtual std::size_t getWidth() const = 0; virtual std::size_t getHeight() const = 0; // Return a defined patch control vertex at , virtual PatchControl& ctrlAt(std::size_t row, std::size_t col) = 0; virtual const PatchControl& ctrlAt(std::size_t row, std::size_t col) const = 0; // Returns a copy of the fully tesselated patch geometry (slow!) virtual PatchMesh getTesselatedPatchMesh() const = 0; /** * greebo: Inserts two columns before and after the column with index . * Throws an GenericPatchException if an error occurs. */ virtual void insertColumns(std::size_t colIndex) = 0; /** * greebo: Inserts two rows before and after the row with index . * Throws an GenericPatchException if an error occurs. */ virtual void insertRows(std::size_t rowIndex) = 0; /** * greebo: Removes columns or rows right before and after the col/row * with the given index, reducing the according dimension by 2. */ virtual void removePoints(bool columns, std::size_t index) = 0; /** * greebo: Appends two rows or columns at the beginning or the end. */ virtual void appendPoints(bool columns, bool beginning) = 0; // Updates the patch tesselation matrix, call this everytime you're done with your PatchControl changes virtual void controlPointsChanged() = 0; // Check if the patch has invalid control points or width/height are zero virtual bool isValid() const = 0; // Check whether all control vertices are in the same 3D spot (with minimal tolerance) virtual bool isDegenerate() const = 0; // Shader handling virtual const std::string& getShader() const = 0; virtual void setShader(const std::string& name) = 0; // greebo: returns true if the patch's shader is visible, false otherwise virtual bool hasVisibleMaterial() const = 0; /** * greebo: Sets/gets whether this patch is a patchDef3 (fixed tesselation) */ virtual bool subdivionsFixed() const = 0; /** greebo: Returns the x,y subdivision values (for tesselation) */ virtual Subdivisions getSubdivisions() const = 0; /** greebo: Sets the subdivision of this patch * * @isFixed: TRUE, if this patch should be a patchDef3 (fixed tesselation) * @divisions: a two-component vector containing the desired subdivisions */ virtual void setFixedSubdivisions(bool isFixed, const Subdivisions& divisions) = 0; }; /* greebo: the abstract base class for a patch-creating class. * At the moment, the CommonPatchCreator, Doom3PatchCreator and Doom3PatchDef2Creator derive from this base class. */ class PatchCreator : public RegisterableModule { public: // Create a patch and return the sceneNode virtual scene::INodePtr createPatch() = 0; }; class Patch; class IPatchNode { public: virtual ~IPatchNode() {} /** * greebo: Retrieves the actual patch from a PatchNode, only works from within the main module. */ virtual Patch& getPatchInternal() = 0; // Get access to the patch interface virtual IPatch& getPatch() = 0; }; typedef std::shared_ptr IPatchNodePtr; inline bool Node_isPatch(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node) != NULL; } inline IPatch* Node_getIPatch(const scene::INodePtr& node) { IPatchNodePtr patchNode = std::dynamic_pointer_cast(node); if (patchNode != NULL) { return &patchNode->getPatch(); } return NULL; } // Casts a node onto a patch inline Patch* Node_getPatch(const scene::INodePtr& node) { IPatchNodePtr patchNode = std::dynamic_pointer_cast(node); if (patchNode != NULL) { return &patchNode->getPatchInternal(); } return NULL; } const std::string MODULE_PATCH("PatchModule"); const std::string DEF2("Def2"); const std::string DEF3("Def3"); // Acquires the PatchCreator of the given type ("Def2", "Def3") inline PatchCreator& GlobalPatchCreator(const std::string& defType) { std::shared_ptr _patchCreator( std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_PATCH + defType) // e.g. "PatchModuleDef2" ) ); return *_patchCreator; } #endif DarkRadiant-2.0.2/include/ipath.h000066400000000000000000000036521245424655700166240ustar00rootroot00000000000000#ifndef IPATH_H_ #define IPATH_H_ #include "inode.h" #include namespace scene { /** greebo: This is the base structure used as unique to scenegraph elements. * * It extends the functionality of std::vector to mimick * the interface of a std::stack (push(), top(), pop()) and * provides an additional parent() method that allows * to retrieve the element right below the top() element. * * The parent() method is a convenience method helping to insert * scenegraph elements at the right place without complicated * popping() and pushing(). * * Note: Normally, deriving from STL containers is not a good idea, due to * the non-virtual destructors (all data members in the subclasses * wouldn't get destroyed). In this case it is ok to derive from * std::vector, because no additional data members are introduced. */ class Path : public std::vector { public: // Default constructor Path() {} // Constructor taking an initial element. // The stack is starting with one top element. Path(const INodePtr& initialElement) { push(initialElement); } // Destructor virtual ~Path() {} // Accessor method to retrieve the last element inserted. INodePtr& top() { return back(); } // Accessor method to retrieve the last element inserted. const INodePtr& top() const { return back(); } // Accessor method to retrieve the element below the last inserted. INodePtr& parent() { return *(std::vector::end()-2); } // Accessor method to retrieve the element below the last inserted. const INodePtr& parent() const { return *(std::vector::end()-2); } // Add an element to the stack, this becomes the top() element void push(const INodePtr& newElement) { push_back(newElement); } // Remove the topmost element, the size of the stack is reduced by 1. void pop() { pop_back(); } }; // class Path } // namespace scene #endif /*IPATH_H_*/ DarkRadiant-2.0.2/include/ipreferencesystem.h000066400000000000000000000076441245424655700212600ustar00rootroot00000000000000#pragma once #include #include #include "imodule.h" // A list containing possible values for a combo box widgets typedef std::list ComboBoxValueList; typedef std::vector IconList; typedef std::vector IconDescriptionList; /* greebo: This is the interface the preference page has to provide for adding * elements to the dialog page. */ class PreferencesPage { public: // destructor virtual ~PreferencesPage() {} /** greebo: Allows to set a custom title of this page. The default title * upon construction is "guessed" by adding a " Settings" to * the page name, "Settings/Patch" gets assigned * a "Patch Settings" as default title. * Use this method to change this to fit your needs. */ virtual void setTitle(const std::string& title) = 0; // greebo: Use this to add a checkbox to the preference dialog that is connected to a registry value virtual void appendCheckBox(const std::string& name, const std::string& flag, const std::string& registryKey) = 0; /* greebo: This adds a horizontal slider to the internally referenced VBox and connects * it to the given registryKey. */ virtual void appendSlider(const std::string& name, const std::string& registryKey, bool drawValue, double value, double lower, double upper, double step_increment, double page_increment, double page_size) = 0; /** * \brief * Add a drop-down combo box to the preference page. * * \param name * The name to be displayed next to the combo box. * * \param registryKey * The registry key which stores the value of the combo box. * * \param valueList * List of strings containing the values that should be displayed in the * combo box. * * \param storeValueNotIndex * If true, store the selected text in the registry key. If false, store the * numeric index of the selected item in the registry key. The default is * false. */ virtual void appendCombo(const std::string& name, const std::string& registryKey, const ComboBoxValueList& valueList, bool storeValueNotIndex = false) = 0; /* greebo: Appends an entry field with as caption which is connected to the given registryKey */ virtual void appendEntry(const std::string& name, const std::string& registryKey) = 0; /* greebo: Appends an entry field with spinner buttons which retrieves its value from the given * RegistryKey. The lower and upper values have to be passed as well. */ virtual void appendSpinner(const std::string& name, const std::string& registryKey, double lower, double upper, int fraction) = 0; // greebo: Adds a PathEntry to choose files or directories (depending on the given boolean) virtual void appendPathEntry(const std::string& name, const std::string& registryKey, bool browseDirectories) = 0; // Appends a static label (to add some text to the preference page) virtual void appendLabel(const std::string& caption) = 0; }; typedef std::shared_ptr PreferencesPagePtr; const std::string MODULE_PREFERENCESYSTEM("PreferenceSystem"); class IPreferenceSystem : public RegisterableModule { public: /** greebo: Retrieves the page for the given path, for example: * * "Settings/Patch Settings" * (spaces are ok, slashes are treated as delimiters, don't use them) * * Use the PreferencesPage interface to add widgets * and connect them to the registry. * * @path: The path to lookup * * @returns: the PreferencesPage pointer. */ virtual PreferencesPagePtr getPage(const std::string& path) = 0; }; inline IPreferenceSystem& GlobalPreferenceSystem() { // Cache the reference locally static IPreferenceSystem& _prefSystem( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_PREFERENCESYSTEM) ) ); return _prefSystem; } DarkRadiant-2.0.2/include/iradiant.h000066400000000000000000000032111245424655700173010ustar00rootroot00000000000000#pragma once #include "imodule.h" #include #include const std::string MODULE_RADIANT("Radiant"); class ThreadManager; // Interface to provide feedback during running operations // see IRadiant::performLongRunningOperation() class ILongRunningOperation { public: virtual ~ILongRunningOperation() {} // Update the operation progress fraction - range [0..1] virtual void setProgress(float progress) = 0; // Set the message that is displayed to the user virtual void setMessage(const std::string& message) = 0; }; /** * \brief * Interface to the core application. */ class IRadiant : public RegisterableModule { public: /// Signal emitted when main Radiant application is constructed virtual sigc::signal signal_radiantStarted() const = 0; /// Signal emitted just before Radiant shuts down virtual sigc::signal signal_radiantShutdown() const = 0; /// Get the threading manager virtual ThreadManager& getThreadManager() = 0; // Runs a long running operation that should block input on all windows // until it completes. The operation functor needs to take a reference to // an operation object which can be used to give feedback like progress or // text messages that might be displayed to the user. virtual void performLongRunningOperation( const std::function& operationFunc, const std::string& title = std::string()) = 0; }; inline IRadiant& GlobalRadiant() { // Cache the reference locally static IRadiant& _radiant( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_RADIANT) ) ); return _radiant; } DarkRadiant-2.0.2/include/iregistry.h000066400000000000000000000066201245424655700175360ustar00rootroot00000000000000#pragma once #include "imodule.h" #include "xmlutil/Document.h" #include "xmlutil/Node.h" #include #include #include namespace { const std::string RKEY_SKIP_REGISTRY_SAVE = "user/skipRegistrySaveOnShutdown"; } /** * \addtogroup registry XML Registry */ // String identifier for the registry module const std::string MODULE_XMLREGISTRY("XMLRegistry"); /** * Abstract base class for the registry module. * * \ingroup registry */ class Registry : public RegisterableModule { public: enum Tree { treeStandard, treeUser }; // Sets a variable in the XMLRegistry or retrieves one virtual void set(const std::string& key, const std::string& value) = 0; virtual std::string get(const std::string& key) = 0; // Checks whether a key exists in the registry virtual bool keyExists(const std::string& key) = 0; /** * Import an XML file into the registry, without a version check. If the * file cannot be imported for any reason, a std::runtime_error exception * will be thrown. * * @param importFilePath * Full pathname of the file to import. * * @param parentKey * The path to the node within the current registry under which the * imported nodes should be added. * * @param tree: the tree the file should be imported to (e.g. eDefault) */ virtual void import(const std::string& importFilePath, const std::string& parentKey, Tree tree) = 0; // Dumps the whole XML content to std::out for debugging purposes virtual void dump() const = 0; // Saves the specified node and all its children into the file virtual void exportToFile(const std::string& key, const std::string& filename = "-") = 0; // Retrieves the nodelist corresponding for the specified XPath (wraps to xml::Document) virtual xml::NodeList findXPath(const std::string& path) = 0; // Creates an empty key virtual xml::Node createKey(const std::string& key) = 0; // Creates a new node named as children of with the name attribute set to // The newly created node is returned after creation virtual xml::Node createKeyWithName(const std::string& path, const std::string& key, const std::string& name) = 0; /** * greebo: Sets the named attribute of the given node specified by . * * @path: The XPath to the node. * @attrName: The name of the attribute. * @attrValue: The string value of the attribute. */ virtual void setAttribute(const std::string& path, const std::string& attrName, const std::string& attrValue) = 0; /** * greebo: Loads the value of the given attribute at the given path. * * @path: The XPath to the node. * @attrName: The name of the attribute. * * @returns: the string value of the attribute. */ virtual std::string getAttribute(const std::string& path, const std::string& attrName) = 0; // Deletes an entire subtree from the registry virtual void deleteXPath(const std::string& path) = 0; /// Return a signal which will be emitted when a given key changes virtual sigc::signal signalForKey(const std::string& key) const = 0; }; typedef std::shared_ptr RegistryPtr; // This is the accessor for the registry inline Registry& GlobalRegistry() { // Cache the reference locally static Registry& _registry( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_XMLREGISTRY) ) ); return _registry; } DarkRadiant-2.0.2/include/irender.h000066400000000000000000000534461245424655700171550ustar00rootroot00000000000000#pragma once #include "imodule.h" #include #include "math/Vector3.h" #include "ShaderLayer.h" #include /** * \file * Interfaces for the back-end renderer. */ /** * \name Global render flags * * These flags control which capabilities of the renderer are used throughout * the render process. They have a four stage lifecycle: * * 1. The flags are initially SET in the Shader implementation, describing the * features that the particular Shader would like to use for rendering its * renderables. For example, a shader pass performing a blend will set * RENDER_BLEND as one of its flags. * * 2. The flags are MASKED by another set of flags provided to a * RenderableCollector before it traverses the scene graph, in order to control * which shader-specified flags can actually be used for that render pass. For * example, the XYRenderer renders in wireframe mode only, so it does not enable * RENDER_FILL in its mask, while the CamRenderer does. * * 3. The flags may be used to set or change OpenGL state in the shader pass * implementation. For example, if RENDER_BLEND is set, then glEnable(GL_BLEND) * will be called before the associated shader's renderables are rendered. Some * flags map directly to glEnable parameters, while others (such as * RENDER_PROGRAM) specify more complex changes. Some flags do not enable any GL * features at all. * * 4. The flags are passed as a parameter to the OpenGLRenderable::render() * method, allowing individual objects to modify their behaviour accordingly. * For example, objects may decide whether or not to submit colour information * to OpenGL based on the value of the RENDER_VERTEX_COLOUR flag. */ ///@{ const unsigned RENDER_DEFAULT = 0; const unsigned RENDER_LINESTIPPLE = 1 << 0; // glEnable(GL_LINE_STIPPLE) const unsigned RENDER_POLYGONSTIPPLE = 1 << 2; // glEnable(GL_POLYGON_STIPPLE) const unsigned RENDER_ALPHATEST = 1 << 4; // glEnable(GL_ALPHA_TEST) const unsigned RENDER_DEPTHTEST = 1 << 5; // glEnable(GL_DEPTH_TEST) const unsigned RENDER_DEPTHWRITE = 1 << 6; // glDepthMask(GL_TRUE) /// Colour buffer writing disabled with glColorMask const unsigned RENDER_MASKCOLOUR = 1 << 7; const unsigned RENDER_CULLFACE = 1 << 8; // glglEnable(GL_CULL_FACE) const unsigned RENDER_SCALED = 1 << 9; // glEnable(GL_NORMALIZE) const unsigned RENDER_SMOOTH = 1 << 10; // glShadeModel const unsigned RENDER_LIGHTING = 1 << 11; // glEnable(GL_LIGHTING) const unsigned RENDER_BLEND = 1 << 12; // glEnable(GL_BLEND) const unsigned RENDER_OFFSETLINE = 1 << 13; // glEnable(GL_POLYGON_OFFSET_LINE) /// Objects will be rendered as filled polygons (not wireframe). const unsigned RENDER_FILL = 1 << 14; /** * If enabled, mesh objects (geometry that does not consist only of GL_POINTS) * should submit vertex colour information. If disabled, mesh objects must not * change glColor during rendering. * * Does not affect GL state. */ const unsigned RENDER_VERTEX_COLOUR = 1 << 15; /** * If enabled, point geometry may submit colours for each point. If disabled, * point geometry must not change colour during rendering. * * Does not affect GL state. */ const unsigned RENDER_POINT_COLOUR = 1 << 16; /// GL_TEXTURE_2D will be enabled during rendering. const unsigned RENDER_TEXTURE_2D = 1 << 17; /** * Cube map rendering (in camera space) is enabled. The renderer will enable * GL_TEXTURE_CUBE_MAP, and set up the texture matrix such that the viewer * location is the origin. Objects should submit their vertex coordinates as * texture coordinates, which will result in the correct cube map alignment. */ const unsigned RENDER_TEXTURE_CUBEMAP = 1 << 18; /** * Normal map information will be used during rendering. If enabled, objects * should submit normal/tangent/bitangent vertex attributes to enable normal * mapping. */ const unsigned RENDER_BUMP = 1 << 19; /// A vertex and fragment shader program will be used during rendering. const unsigned RENDER_PROGRAM = 1 << 20; const unsigned RENDER_OVERRIDE = 1 << 21; typedef unsigned RenderStateFlags; ///@} class AABB; class Matrix4; template class BasicVector3; typedef BasicVector3 Vector3; class Shader; typedef std::shared_ptr ShaderPtr; /** * A RenderEntity represents a map entity as seen by the renderer. * It provides up to 12 numbered parameters to the renderer: * parm0, parm1 ... parm11. * * A few of the entity parms are hardwired to things like render colour * as defined through the entity's _color keyvalue, some are set through * scripting, spawmargs or gameplay code. */ class IRenderEntity { public: /** * Get the value of this entity's shader parm with the given index. */ virtual float getShaderParm(int parmNum) const = 0; /** * Entities can specify directions, which are used for particle emission for instance. */ virtual const Vector3& getDirection() const = 0; /** * Returns the wireframe shader for this entity - child primitives need this for rendering. */ virtual const ShaderPtr& getWireShader() const = 0; }; typedef std::shared_ptr IRenderEntityPtr; typedef std::weak_ptr IRenderEntityWeakPtr; /** * \brief * Interface for a light source in the renderer. */ class RendererLight : public virtual IRenderEntity { public: virtual ~RendererLight() {} virtual const ShaderPtr& getShader() const = 0; /** * \brief * Return the origin of the light volume in world space. * * This corresponds to the "origin" key of the light object, i.e. the center * of the bounding box for an omni light and the tip of the pyramid for a * projected light. */ virtual const Vector3& worldOrigin() const = 0; /** * \brief * Return the world-space to light-texture-space transformation matrix. * * The light texture space is a box, with coordinates [0..1] on each * dimension, representing the texture (UV) coordinates of the light falloff * textures that will be applied to rendered fragments within the light * volume. * * The matrix returned by this method transforms coordinates in world space * into coordinates in light-texture space. */ virtual Matrix4 getLightTextureTransformation() const = 0; /// Return true if this light intersects the given AABB virtual bool intersectsAABB(const AABB& aabb) const = 0; /** * \brief * Return the light origin in world space. * * The light origin is the point from which the light rays are considered to * be projected, i.e. the direction from which bump maps will be illuminated * and shadows (if they existed) would be cast. * * For an omindirectional light, this origin is determined from the * "light_center" keyvalue in combination with the bounding box itself, * whereas for a projected light it is always equal to the tip of the * pyramid (the same as worldOrigin()). */ virtual Vector3 getLightOrigin() const = 0; }; typedef std::shared_ptr RendererLightPtr; inline std::ostream& operator<< (std::ostream& os, const RendererLight& l) { return os << "RendererLight { worldOrigin = " << l.worldOrigin() << " }"; } /** * \brief * Interface for an object which can test its intersection with a RendererLight. * * Objects which implement this interface define a intersectsLight() function * which determines whether the given light intersects the object. They also * provide methods to allow the renderer to provide the list of lights which * will be illuminating the object, subsequent to the intersection test. * * \todo * This interface seems to exist because of the design decision that lit objects * should maintain a list of lights which illuminate them. This is a poor * design because this should be the responsibility of the renderer. When the * renderer is refactored to process the scene light-by-light this class will * not be necessary. */ class LitObject { public: virtual ~LitObject() {} /// Test if the given light intersects the LitObject virtual bool intersectsLight(const RendererLight& light) const = 0; /// Add a light to the set of lights which do intersect this object virtual void insertLight(const RendererLight& light) {} /// Clear out all lights in the set of lights intersecting this object virtual void clearLights() {} }; typedef std::shared_ptr LitObjectPtr; class Renderable; typedef std::function RenderableCallback; typedef std::function RendererLightCallback; /** * \brief * A list of lights which may intersect an object * * A LightList is responsible for calculating which lights intersect a * particular object. Although there is nothing exposed in the interface, the * LightList holds a reference to a single lit object, and it is the * intersection with this object which is calculated. * * \internal * This interface doesn't really make any sense, and its purpose is not clear. * It seems to be basically a set of callback functions which need to be invoked * at the right time during the render process, but these shouldn't really be * the responsibility of anything outside the renderer itself. * * As of 2011-01-09/r6927 the calling sequence seems to be as follows: * * 1. Illuminated object (e.g. patch, brush) adds itself to the RenderSystem * with attachLitObject() at construction. * 2. attachLitObject() returns a reference to a (newly-created) LightList which * manages the lights intersecting this lit object. The lit object stores this * reference internally, while the LightList implementation also stores a * reference to the LitObject. * 3. When the lit object's renderSolid() method is invoked to set up a render, * it invokes LightList::calculateIntersectingLights() on the stored LightList * reference. * 4. calculateIntersectingLights() first checks to see if the lights need * updating, which is true if EITHER this LightList's setDirty() method OR the * RenderSystem's lightChanged() has been called since the last calculation. If * no update is needed, it returns. * 5. If an update IS needed, the LightList iterates over all lights in the * scene, and tests if each one intersects its associated lit object (which is * the one that just invoked calculateIntersectingLights(), although nothing * enforces this). This intersection test is performed by passing the light to * the LitObject::intersectsLight() method. * 6. For each light which passes the intersection test, the LightList both adds * it to its internal list of "active" (i.e. intersecting) lights for its * object, and passes it to the object's insertLight() method. Some object * classes then use insertLight() to populate another internal LightList subject * to additional (internal) intersection tests, but this is not required. * 7. At this point, calculateIntersectingLights() has finished, and returns * control to its calling renderSolid() method. * 8. The renderSolid() method (or another method it calls) passes a LightList * to the RenderableCollector with setLights(). The light list it passes may be * the original list returned from attachLitObject(), or the additional internal * list populated in step 6. * 9. The RenderableCollector state machine stores the LightList as the * "current" light list. * 10. Any subsequent renderables submitted with * RenderableCollector::addRenderable() are associated with the current * LightList passed in the previous step, and passed to the current Shader. * 11. The OpenGLShader accepts the renderable and LightList, and adds them to * its internal OpenGLShaderPasses: once only if RENDER_BUMP is not active, not * at all if RENDER_BUMP is active but the LightList is NULL, or once for each * light in the LightList otherwise. * 12. The OpenGLShaderPass now contains a list of TransformedRenderable * structures, each associating a single renderable with a single light. * Multiple TransformedRenderable will exist for the same renderable if there * were multiple lights illuminating it. */ class LightList { public: virtual ~LightList() {} /// Trigger the LightList to recalculate which lights intersect its object virtual void calculateIntersectingLights() const = 0; /// Set the dirty flag, informing the LightList that an update is required virtual void setDirty() = 0; /// Invoke a callback on all contained lights. virtual void forEachLight(const RendererLightCallback& callback) const = 0; }; const int c_attr_TexCoord0 = 1; const int c_attr_Tangent = 3; const int c_attr_Binormal = 4; /** * \brief * Data object passed to the backend OpenGLRenderable::render() method * containing information about the render pass which may be of use to * renderable objects, including the render flags and various * matrices/coordinates. */ class RenderInfo { // Render flags RenderStateFlags _flags; // Viewer location in 3D space Vector3 _viewerLocation; // Cube map mode ShaderLayer::CubeMapMode _cubeMapMode; public: /// Default constructor RenderInfo(RenderStateFlags flags = RENDER_DEFAULT, const Vector3& viewer = Vector3(0, 0, 0), ShaderLayer::CubeMapMode cubeMode = ShaderLayer::CUBE_MAP_NONE) : _flags(flags), _viewerLocation(viewer), _cubeMapMode(cubeMode) { } /// Check if a flag is set bool checkFlag(unsigned flag) const { return (_flags & flag) != 0; } /// Get the entire flag bitfield. RenderStateFlags getFlags() const { return _flags; } /// Get the viewer location. const Vector3& getViewerLocation() const { return _viewerLocation; } /// Get the cube map mode. ShaderLayer::CubeMapMode getCubeMapMode() const { return _cubeMapMode; } }; /** * \brief * Interface for objects which can render themselves in OpenGL. * * This interface is used by the render backend, after renderable objects have * first been submitted using the Renderable interface. The backend render() * function should contain the OpenGL calls necessary to submit vertex, normal * and texture-coordinate data. * * No GL state changes should occur in render(), other than those specifically * allowed by the render flags. */ class OpenGLRenderable { public: virtual ~OpenGLRenderable() {} /** * \brief * Submit OpenGL render calls. */ virtual void render(const RenderInfo& info) const = 0; }; class Matrix4; class Texture; class ModuleObserver; #include "math/Vector3.h" class Material; typedef std::shared_ptr MaterialPtr; /** * A Shader represents a single material which can be rendered in OpenGL, which * may correspond to an actual material (Material), a raw colour or a special * GL shader. * * Importantly, a Shader also maintains its own list of OpenGLRenderable objects * which use it -- the actual rendering is performed by traversing a list of * Shaders and rendering the geometry attached to each one. */ class Shader { public: virtual ~Shader() {} /** * Attach a renderable object to this Shader, which will be rendered using * this Shader when the render backend is activated. * * @param renderable * The OpenGLRenderable object to add. * * @param modelview * The modelview transform for this object. * * @param lights * A LightList containing all of the lights which should illuminate this * object. */ virtual void addRenderable(const OpenGLRenderable& renderable, const Matrix4& modelview, const LightList* lights = 0) = 0; /** * Like above, but taking an additional IRenderEntity argument. */ virtual void addRenderable(const OpenGLRenderable& renderable, const Matrix4& modelview, const IRenderEntity& entity, const LightList* lights = 0) = 0; /** * \brief * Control the visibility of this shader. * * A shader that is not visible will perform no rendering and ignore any * renderables submitted to it with addRenderable(). */ virtual void setVisible(bool visible) = 0; /// Query if this shader is visible virtual bool isVisible() const = 0; virtual void incrementUsed() = 0; virtual void decrementUsed() = 0; virtual void attach(ModuleObserver& observer) = 0; virtual void detach(ModuleObserver& observer) = 0; /** * \brief Retrieve the Material that was used to construct this shader (if * any). * * \return * An Material subclass with information about the shader definition */ virtual const MaterialPtr& getMaterial() const = 0; virtual unsigned int getFlags() const = 0; }; /** * Shared pointer typedef for Shader. */ typedef std::shared_ptr ShaderPtr; const std::string MODULE_RENDERSYSTEM("ShaderCache"); /** * \brief * The main interface for the backend renderer. */ class RenderSystem : public RegisterableModule { public: /** * \brief * Capture the given shader, increasing its reference count and * returning a pointer to the Shader object. * * The object must be freed after use by calling release(). * * @param name * The name of the shader to capture. * * @returns * Shader* object corresponding to the given material shader name. */ virtual ShaderPtr capture(const std::string& name) = 0; /** * \brief * Main render method. * * This method traverses all of the OpenGLRenderable objects that have been * submitted to Shader instances, and invokes their render() method to draw * their geometry. * * \param globalFlagsMask * The mask of render flags which are permitted during this render pass. Any * render flag which is 0 in this mask will not be enabled during rendering, * even if the particular shader requests it. * * \param modelview * The modelview transformation matrix to apply before rendering. * * \param projection * The view projection matrix to apply before rendering. * * \param viewer * Location of the viewer in world space. */ virtual void render(RenderStateFlags globalFlagsMask, const Matrix4& modelview, const Matrix4& projection, const Vector3& viewer = Vector3(0, 0, 0)) = 0; virtual void realise() = 0; virtual void unrealise() = 0; /** * Get the current render time in milliseconds. */ virtual std::size_t getTime() const = 0; /** * Set the render time in milliseconds. */ virtual void setTime(std::size_t milliSeconds) = 0; /* SHADER PROGRAMS */ /// Available GL programs used for backend rendering. enum ShaderProgram { /// No shader program (normal GL fixed-function pipeline) SHADER_PROGRAM_NONE, /// Lighting interaction shader SHADER_PROGRAM_INTERACTION }; /// Test if shader programs are available on the current system. virtual bool shaderProgramsAvailable() const = 0; /// Get the current shader program in use. virtual ShaderProgram getCurrentShaderProgram() const = 0; /// Set the shader program to use. virtual void setShaderProgram(ShaderProgram prog) = 0; /* LIGHT MANAGEMENT */ /** * \brief * Add a lit object to the renderer. * * The renderer will create and return a reference to a LightList associated * with this particular LitObject. The lit object can use the public * LightList interface to trigger a recalculation of light intersections, or * to set the dirty flag indicating to the LightList that a recalculation is * necessary. * * \internal * When the LightList implementation performs the intersection calculation, * it will use the LitObject's intersectsLight method to do so, and if the * intersection is detected, the insertLight method will be invoked on the * LitObject. This means that (1) the renderer stores a LightList for each * object, (2) the object itself has a reference to the LightList owned by * the renderer, and (3) the LitObject interface allows the object to * maintain ANOTHER list of intersecting lights, added with insertLight(). * This seems like a lot of indirection, but it might have something to do * with allowing objects with multiple sub-components to submit only a * subset of lights for each component. * * \param object * The lit object to add. * * \return * A reference to a LightList which manages the lights that intersect the * submitted object. */ virtual LightList& attachLitObject(LitObject& object) = 0; virtual void detachLitObject(LitObject& cullable) = 0; virtual void litObjectChanged(LitObject& cullable) = 0; /** * \brief * Attach a light source to the renderer. */ virtual void attachLight(RendererLight& light) = 0; /** * \brief * Detach a light source from the renderer. */ virtual void detachLight(RendererLight& light) = 0; /** * \brief * Indicate that the given light source has been modified. */ virtual void lightChanged(RendererLight& light) = 0; virtual void attachRenderable(const Renderable& renderable) = 0; virtual void detachRenderable(const Renderable& renderable) = 0; virtual void forEachRenderable(const RenderableCallback& callback) const = 0; // Initialises the OpenGL extensions virtual void extensionsInitialised() = 0; // Subscription to get notified as soon as the openGL extensions have been initialised virtual sigc::signal signal_extensionsInitialised() = 0; }; typedef std::shared_ptr RenderSystemPtr; typedef std::weak_ptr RenderSystemWeakPtr; /** * \brief * Global accessor method for the RenderSystem instance. */ inline RenderSystem& GlobalRenderSystem() { // Cache the reference locally static RenderSystem& _instance( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_RENDERSYSTEM) ) ); return _instance; } DarkRadiant-2.0.2/include/irenderable.h000066400000000000000000000117601245424655700177720ustar00rootroot00000000000000#pragma once #include class Shader; typedef std::shared_ptr ShaderPtr; class RenderSystem; typedef std::shared_ptr RenderSystemPtr; class OpenGLRenderable; class LightList; class Matrix4; class IRenderEntity; /** * \brief * Class which accepts OpenGLRenderable objects during the first pass of * rendering. * * Each Renderable in the scenegraph is passed a reference to a * RenderableCollector, on which the Renderable sets the necessary state * variables and then submits its OpenGLRenderable(s) for later rendering. A * single Renderable may submit more than one OpenGLRenderable, with a different * state each time -- for instance a Renderable model class may submit each of * its material surfaces separately with the respective shaders set beforehand. * * \todo * This class probably doesn't need to be a state machine, convert it to a * single submit method with necessary parameters. */ class RenderableCollector { public: virtual ~RenderableCollector() {} /** * Enumeration containing render styles. */ enum EStyle { eWireframeOnly, eFullMaterials }; /** * Push a Shader onto the internal shader stack. This is an OpenGL-style * push, which does not accept an argument but duplicates the topmost * stack value. The new value should be set with SetState(). */ virtual void PushState() = 0; /** * Pop the topmost Shader off the internal stack. This discards the value * without returning it. */ virtual void PopState() = 0; /** * Set the Shader to be used when rendering any subsequently-submitted * OpenGLRenderable object. This shader remains in effect until it is * changed with a subsequent call to SetState(). * * @param state * The Shader to be used from now on. * * @param mode * The type of rendering (wireframe or shaded) that this shader should be * used for. Individual RenderableCollector subclasses may ignore this method * call if it does not use the render mode they are interested in. */ virtual void SetState(const ShaderPtr& state, EStyle mode) = 0; /** * Submit an OpenGLRenderable object for rendering when the backend render * pass is conducted. The object will be rendered using the Shader previous- * ly set with SetState(). * * @param renderable * The renderable object to submit. * * @param world * The local to world transform that should be applied to this object when * it is rendered. */ virtual void addRenderable(const OpenGLRenderable& renderable, const Matrix4& world) = 0; /** * Like addRenderable() above but providing an additional IRenderEntity argument * needed to evaluate the shader expressions right before rendering. */ virtual void addRenderable(const OpenGLRenderable& renderable, const Matrix4& world, const IRenderEntity& entity) = 0; /** * \brief * Determine if this RenderableCollector can accept renderables for full * materials rendering, or just wireframe rendering. * * \return * true if full materials are supported, false if only wireframe rendering * is supported. */ virtual bool supportsFullMaterials() const = 0; /// Highlight faces of subsequently-submitted objects, if supported virtual void highlightFaces(bool enable) = 0; /// Highlight primitives of subsequently-submitted objects, if supported virtual void highlightPrimitives(bool enable) = 0; /** * Set the list of lights to be used for lighting-mode rendering. This * method only makes sense for RenderableCollectors that support this * rendering mode. * * TODO: Use std::shared_ptr<> here. */ virtual void setLights(const LightList& lights) { } }; class VolumeTest; /** Interface class for Renderable objects. All objects which wish to be * rendered need to implement this interface. During the scenegraph traversal * for rendering, each Renderable object is passed a RenderableCollector object * which it can use to submit its geometry and state parameters. */ class Renderable { public: /** * Destructor */ virtual ~Renderable() {} /** * Sets the rendersystem this renderable is attached to. This is necessary * for this object to request Materials/Shaders for rendering. */ virtual void setRenderSystem(const RenderSystemPtr& renderSystem) = 0; /** Submit renderable geometry when rendering takes place in Solid mode. */ virtual void renderSolid(RenderableCollector& collector, const VolumeTest& volume) const = 0; /** Submit renderable geometry when rendering takes place in Wireframe * mode. */ virtual void renderWireframe(RenderableCollector& collector, const VolumeTest& volume) const = 0; virtual void renderComponents(RenderableCollector&, const VolumeTest&) const { } virtual void viewChanged() const { } /** * Method to determine whether this node should be rendered as highlighted. * This is usually true for selected nodes. */ virtual bool isHighlighted() const = 0; }; typedef std::shared_ptr RenderablePtr; DarkRadiant-2.0.2/include/irendersystemfactory.h000066400000000000000000000021221245424655700217730ustar00rootroot00000000000000#ifndef _IRENDERSYSTEM_FACTORY_H_ #define _IRENDERSYSTEM_FACTORY_H_ #include "imodule.h" #include "irender.h" class RenderSystem; typedef std::shared_ptr RenderSystemPtr; namespace render { /** * greebo: The rendersystem factory can be used to generate * new instances of DarkRadiant's backend renderer. * * The backend renderer provides access to named Shader objects * which can be filled with OpenGLRenderable objects. */ class IRenderSystemFactory : public RegisterableModule { public: /** * Instantiates a new rendersystem. */ virtual RenderSystemPtr createRenderSystem() = 0; }; } // namespace const char* const MODULE_RENDERSYSTEMFACTORY = "RenderSystemFactory"; // Global accessor to the rendersystem factory module inline render::IRenderSystemFactory& GlobalRenderSystemFactory() { // Cache the reference locally static render::IRenderSystemFactory& _instance( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_RENDERSYSTEMFACTORY) ) ); return _instance; } #endif /* _IRENDERSYSTEM_FACTORY_H_ */ DarkRadiant-2.0.2/include/iscenegraph.h000066400000000000000000000106041245424655700200020ustar00rootroot00000000000000#pragma once #include #include "imodule.h" #include "inode.h" #include "ipath.h" #include /** * \defgroup scenegraph Scenegraph * * \namespace scene * \ingroup scenegraph * Interfaces and types relating to the scene-graph. */ // String identifier for the registry module const std::string MODULE_SCENEGRAPH("SceneGraph"); class VolumeTest; namespace scene { class ISpacePartitionSystem; typedef std::shared_ptr ISpacePartitionSystemPtr; /** * A scene-graph - a Directed Acyclic Graph (DAG). * * Each node may refer to zero or more 'child' nodes (directed). * A node may never have itself as one of its ancestors (acyclic). */ class Graph { public: /* greebo: Derive from this class to get notified on scene changes */ class Observer { public: // destructor virtual ~Observer() {} // Gets called when anything in the scenegraph changes virtual void onSceneGraphChange() {} // Gets called when a new is inserted into the scenegraph virtual void onSceneNodeInsert(const INodePtr& node) {} // Gets called when is removed from the scenegraph virtual void onSceneNodeErase(const INodePtr& node) {} }; // Returns the root-node of the graph. virtual const INodePtr& root() const = 0; // Sets the root-node of the graph to be 'newRoot'. virtual void setRoot(const INodePtr& newRoot) = 0; // greebo: Adds a node to the scenegraph virtual void insert(const scene::INodePtr& node) = 0; // Removes a node from the scenegraph virtual void erase(const scene::INodePtr& node) = 0; /// \brief Invokes all scene-changed callbacks. Called when any part of the scene changes the way it will appear when the scene is rendered. /// \todo Move to a separate class. virtual void sceneChanged() = 0; /// \brief Add a \p callback to be invoked when the scene changes. /// \todo Move to a separate class. virtual void addSceneObserver(Observer* observer) = 0; // greebo: Remove the scene observer from the list virtual void removeSceneObserver(Observer* observer) = 0; /// Accessor for the signal emitted when bounds are changed virtual sigc::signal signal_boundsChanged() const = 0; /// \brief Invokes all bounds-changed callbacks. Called when the bounds of any instance in the scene change. /// \todo Move to a separate class. virtual void boundsChanged() = 0; // A specific node has changed its bounds virtual void nodeBoundsChanged(const scene::INodePtr& node) = 0; // A walker class to be used in "foreachNodeInVolume" class Walker { public: virtual ~Walker() {} // Called for each visited node, returns TRUE if traversal should continue virtual bool visit(const INodePtr& node) = 0; }; // Visit each scene node in the given volume using the given walker class, even hidden ones virtual void foreachNodeInVolume(const VolumeTest& volume, Walker& walker) = 0; // Same as above, but culls any hidden nodes virtual void foreachVisibleNodeInVolume(const VolumeTest& volume, Walker& walker) = 0; // Call the functor on each scene node in the entire scenegraph, including hidden ones virtual void foreachNode(const INode::VisitorFunc& functor) = 0; // Call the functor on each scene node in the entire scenegraph, excluding hidden ones virtual void foreachVisibleNode(const INode::VisitorFunc& functor) = 0; // Call the functor on each scene node in the given volume, even hidden ones virtual void foreachNodeInVolume(const VolumeTest& volume, const INode::VisitorFunc& functor) = 0; // Same as above, but culls any hidden nodes virtual void foreachVisibleNodeInVolume(const VolumeTest& volume, const INode::VisitorFunc& functor) = 0; // Returns the associated spacepartition virtual ISpacePartitionSystemPtr getSpacePartition() = 0; }; typedef std::shared_ptr GraphPtr; typedef std::weak_ptr GraphWeakPtr; class Cloneable { public: /// \brief destructor virtual ~Cloneable() {} /// \brief Returns a copy of itself. virtual scene::INodePtr clone() const = 0; }; typedef std::shared_ptr CloneablePtr; } // namespace // Accessor to the singleton scenegraph, used for the main map inline scene::Graph& GlobalSceneGraph() { // Cache the reference locally static scene::Graph& _sceneGraph( *std::dynamic_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_SCENEGRAPH) ) ); return _sceneGraph; } inline void SceneChangeNotify() { GlobalSceneGraph().sceneChanged(); } DarkRadiant-2.0.2/include/iscenegraphfactory.h000066400000000000000000000017741245424655700214020ustar00rootroot00000000000000#pragma once #include "iscenegraph.h" namespace scene { /** * greebo: The scenegraph factory can be used to generate * new instances of DarkRadiant's main scene manager. * * A Scenegraph consists of [0..N] scene::INodes, forming * an acyclic graph. There is one main scenegraph in DarkRadiant * accessible through GlobalSceneGraph(), but it's possible to have * more than this one, used for preview scenes for example. */ class ISceneGraphFactory : public RegisterableModule { public: /** * Instantiates a new scenegraph. */ virtual GraphPtr createSceneGraph() = 0; }; } // namespace const char* const MODULE_SCENEGRAPHFACTORY = "SceneGraphFactory"; // Global accessor to the rendersystem factory module inline scene::ISceneGraphFactory& GlobalSceneGraphFactory() { // Cache the reference locally static scene::ISceneGraphFactory& _instance( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_SCENEGRAPHFACTORY) ) ); return _instance; } DarkRadiant-2.0.2/include/iscript.h000066400000000000000000000041071245424655700171700ustar00rootroot00000000000000#ifndef ISCRIPT_H_ #define ISCRIPT_H_ #include "imodule.h" // Forward decl. namespace boost { namespace python { class object; } } namespace script { struct ExecutionResult { // The output of the script std::string output; // whether an error occurred bool errorOccurred; }; typedef std::shared_ptr ExecutionResultPtr; } // namespace script class IScriptInterface { public: virtual ~IScriptInterface() {} /** * This method gets invoked by the Scripting System to let this class * add its interface to the Python context. */ virtual void registerInterface(boost::python::object& nspace) = 0; }; typedef std::shared_ptr IScriptInterfacePtr; /** * DarkRadiant's Scripting System, based on boost::python. It's possible * to expose additional interfaces by using the addInterface() method. */ class IScriptingSystem : public RegisterableModule { public: /** * greebo: Add a named interface to the scripting system. The interface object * must provide a "registerInterface" method which will declare the names * and objects to the given namespace. */ virtual void addInterface(const std::string& name, const IScriptInterfacePtr& iface) = 0; /** * greebo: Executes the given python script file. The filename is specified relatively * to the scripts/ folder. */ virtual void executeScriptFile(const std::string& filename) = 0; /** * greebo: Interprets the given string as python script. * * @returns: the result object. */ virtual script::ExecutionResultPtr executeString(const std::string& scriptString) = 0; }; typedef std::shared_ptr IScriptingSystemPtr; // String identifier for the script module const std::string MODULE_SCRIPTING_SYSTEM("ScriptingSystem"); // This is the accessor for the scripting system inline IScriptingSystem& GlobalScriptingSystem() { // Cache the reference locally static IScriptingSystem& _scriptingSystem( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_SCRIPTING_SYSTEM) ) ); return _scriptingSystem; } #endif /*ISCRIPT_H_*/ DarkRadiant-2.0.2/include/iselectable.h000066400000000000000000000022211245424655700177620ustar00rootroot00000000000000#pragma once /** * greebo: A Selectable is everything that can be highlighted * by the user in the scene (e.g. by interaction with the mouse). */ class Selectable { public: // destructor virtual ~Selectable() {} // Set the selection status of this object virtual void setSelected(bool select) = 0; // Check the selection status of this object (TRUE == selected) virtual bool isSelected() const = 0; // Toggle the selection status virtual void invertSelected() = 0; }; typedef std::shared_ptr SelectablePtr; namespace scene { class INode; typedef std::shared_ptr INodePtr; } inline SelectablePtr Node_getSelectable(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } inline void Node_setSelected(const scene::INodePtr& node, bool selected) { SelectablePtr selectable = Node_getSelectable(node); if (selectable) { selectable->setSelected(selected); } } inline bool Node_isSelected(const scene::INodePtr& node) { SelectablePtr selectable = Node_getSelectable(node); if (selectable) { return selectable->isSelected(); } return false; } DarkRadiant-2.0.2/include/iselection.h000066400000000000000000000156761245424655700176660ustar00rootroot00000000000000#pragma once #include #include "imodule.h" #include #include class RenderableCollector; namespace render { class View; } class Selectable; namespace scene { class INode; typedef std::shared_ptr INodePtr; } template class BasicVector2; typedef BasicVector2 Vector2; template class BasicVector3; typedef BasicVector3 Vector3; template class BasicVector4; typedef BasicVector4 Vector4; class Matrix4; class Quaternion; typedef sigc::signal SelectionChangedSignal; typedef sigc::slot SelectionChangedSlot; class SelectionInfo; class Face; class Brush; class Patch; namespace selection { struct WorkZone; } const std::string MODULE_SELECTIONSYSTEM("SelectionSystem"); class SelectionSystem : public RegisterableModule { public: enum EModifier { eManipulator, // greebo: This is the standard case (drag, click without modifiers) eToggle, // This is for Shift-Clicks to toggle the selection of an instance eReplace, // This is active if the mouse is moved to a NEW location and Alt-Shift is held eCycle, // This is active if the mouse STAYS at the same position and Alt-Shift is held }; enum EMode { eEntity, ePrimitive, eGroupPart, eComponent, }; // The possible modes when in "component manipulation mode" enum EComponentMode { eDefault, eVertex, eEdge, eFace, }; // The possible manipulator modes enum EManipulatorMode { eTranslate, eRotate, eScale, eDrag, eClip, }; /** greebo: An SelectionSystem::Observer gets notified * as soon as the selection is changed. */ class Observer { public: virtual ~Observer() {} /** greebo: This gets called upon selection change. * * @instance: The instance that got affected (this may also be the parent brush of a FaceInstance). * @isComponent: is TRUE if the changed selectable is a component (like a FaceInstance, VertexInstance). */ virtual void selectionChanged(const scene::INodePtr& node, bool isComponent) = 0; }; virtual void addObserver(Observer* observer) = 0; virtual void removeObserver(Observer* observer) = 0; virtual const SelectionInfo& getSelectionInfo() = 0; virtual void SetMode(EMode mode) = 0; virtual EMode Mode() const = 0; virtual void SetComponentMode(EComponentMode mode) = 0; virtual EComponentMode ComponentMode() const = 0; virtual void SetManipulatorMode(EManipulatorMode mode) = 0; virtual EManipulatorMode ManipulatorMode() const = 0; virtual std::size_t countSelected() const = 0; virtual std::size_t countSelectedComponents() const = 0; virtual void onSelectedChanged(const scene::INodePtr& node, const Selectable& selectable) = 0; virtual void onComponentSelection(const scene::INodePtr& node, const Selectable& selectable) = 0; virtual scene::INodePtr ultimateSelected() = 0; virtual scene::INodePtr penultimateSelected() = 0; /** * \brief * Set the selection status of all objects in the scene. * * \param selected * true to select all objects, false to deselect all objects. */ virtual void setSelectedAll(bool selected) = 0; virtual void setSelectedAllComponents(bool selected) = 0; /** * @brief * Visitor interface the for the selection system. * * This defines the Visitor interface which is used in the foreachSelected() * and foreachSelectedComponent() visit methods. */ class Visitor { public: virtual ~Visitor() {} /** * @brief * Called by the selection system for each visited node. */ virtual void visit(const scene::INodePtr& node) const = 0; }; /** * @brief * Use the provided Visitor object to enumerate each selected node. */ virtual void foreachSelected(const Visitor& visitor) = 0; /** * @brief * Use the provided Visitor object to enumerate each selected component. */ virtual void foreachSelectedComponent(const Visitor& visitor) = 0; /** * Call the given functor to enumerate each selected node. */ virtual void foreachSelected(const std::function& functor) = 0; /** * @brief * Use the provided functor to enumerate each selected component. */ virtual void foreachSelectedComponent(const std::function& functor) = 0; /** * Call the given functor for each selected brush. Selected group nodes like func_statics * are traversed recursively, invoking the functor for each visible brush in question. */ virtual void foreachBrush(const std::function& functor) = 0; /** * Call the given functor for each selected face. Selected group nodes like func_statics * are traversed recursively, invoking the functor for each visible face in question. * Singly selected faces (those which have been selected in component mode) are * considered as well by this method. */ virtual void foreachFace(const std::function& functor) = 0; /** * Call the given functor for each selected patch. Selected group nodes like func_statics * are traversed recursively, invoking the functor for each visible patch in question. */ virtual void foreachPatch(const std::function& functor) = 0; /// Signal emitted when the selection is changed virtual SelectionChangedSignal signal_selectionChanged() const = 0; virtual void translateSelected(const Vector3& translation) = 0; virtual void rotateSelected(const Quaternion& rotation) = 0; virtual void scaleSelected(const Vector3& scaling) = 0; virtual void pivotChanged() const = 0; virtual bool SelectManipulator(const render::View& view, const Vector2& devicePoint, const Vector2& deviceEpsilon) = 0; virtual void SelectPoint(const render::View& view, const Vector2& devicePoint, const Vector2& deviceEpsilon, EModifier modifier, bool face) = 0; virtual void SelectArea(const render::View& view, const Vector2& devicePoint, const Vector2& deviceDelta, EModifier modifier, bool face) = 0; virtual void MoveSelected(const render::View& view, const Vector2& devicePoint) = 0; virtual void endMove() = 0; virtual void cancelMove() = 0; /** * Returns the current "work zone", which is defined by the * currently selected elements. Each time a scene node is selected, * the workzone is adjusted to surround the current selection. * Deselecting nodes doesn't change the workzone. * * The result is used to determine the "third" component of operations * performed in the 2D views, like placing an entity. * * Note: the struct is defined in selectionlib.h. */ virtual const selection::WorkZone& getWorkZone() = 0; }; inline SelectionSystem& GlobalSelectionSystem() { // Cache the reference locally static SelectionSystem& _selectionSystem( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_SELECTIONSYSTEM) ) ); return _selectionSystem; } DarkRadiant-2.0.2/include/iselectionset.h000066400000000000000000000052231245424655700203650ustar00rootroot00000000000000#pragma once #include "imodule.h" #include "inode.h" #include #include namespace selection { class ISelectionSet { public: // The name of this set virtual const std::string& getName() = 0; // Checks whether this set is empty virtual bool empty() = 0; // Selects all member nodes of this set virtual void select() = 0; // De-selects all member nodes of this set virtual void deselect() = 0; // Removes all members, leaving this set as empty virtual void clear() = 0; // Clears this set and loads the currently selected nodes in the // scene as new members into this set. virtual void assignFromCurrentScene() = 0; // Adds the given node to this set virtual void addNode(const scene::INodePtr& node) = 0; // Returns the nodes contained in this selection set. virtual std::set getNodes() = 0; }; typedef std::shared_ptr ISelectionSetPtr; class ISelectionSetManager : public RegisterableModule { public: /** * Signal emitted when the list of selection sets has been changed, by * deletion or addition. */ virtual sigc::signal signal_selectionSetsChanged() const = 0; class Visitor { public: virtual void visit(const ISelectionSetPtr& set) = 0; }; /** * greebo: Traverses the list of selection sets using * the given visitor class. */ virtual void foreachSelectionSet(Visitor& visitor) = 0; typedef std::function VisitorFunc; /** * greebo: Traverses the list of selection sets using the given functor. */ virtual void foreachSelectionSet(const VisitorFunc& functor) = 0; /** * greebo: Creates a new selection set with the given name. * If a selection with that name is already registered, the existing * one is returned. */ virtual ISelectionSetPtr createSelectionSet(const std::string& name) = 0; /** * Removes the named selection set. If the named set is * not existing, nothing happens. */ virtual void deleteSelectionSet(const std::string& name) = 0; /** * Deletes all sets. */ virtual void deleteAllSelectionSets() = 0; /** * Finds the named selection set. * * @returns the found selection set or NULL if the set is not existent. */ virtual ISelectionSetPtr findSelectionSet(const std::string& name) = 0; }; } // namespace const char* const MODULE_SELECTIONSET = "SelectionSetManager"; inline selection::ISelectionSetManager& GlobalSelectionSetManager() { // Cache the reference locally static selection::ISelectionSetManager& _manager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_SELECTIONSET) ) ); return _manager; } DarkRadiant-2.0.2/include/iselectiontest.h000066400000000000000000000176171245424655700205630ustar00rootroot00000000000000#pragma once #include #include "math/Vector3.h" #include "inode.h" #include "iselection.h" #include #include #include class SelectionIntersection { float m_depth; float m_distance; public: SelectionIntersection() : m_depth(1), m_distance(2) { } SelectionIntersection(float depth, float distance) : m_depth(depth), m_distance(distance) { } bool operator<(const SelectionIntersection& other) const { if(m_distance != other.m_distance) { return m_distance < other.m_distance; } if(m_depth != other.m_depth) { return m_depth < other.m_depth; } return false; } bool equalEpsilon(const SelectionIntersection& other, float distanceEpsilon, float depthEpsilon) const { return float_equal_epsilon(m_distance, other.m_distance, distanceEpsilon) && float_equal_epsilon(m_depth, other.m_depth, depthEpsilon); } float depth() const { return m_depth; } bool valid() const { return depth() < 1; } }; // returns true if self is closer than other inline bool SelectionIntersection_closer(const SelectionIntersection& self, const SelectionIntersection& other) { return self < other; } // assigns other to best if other is closer than best inline void assign_if_closer(SelectionIntersection& best, const SelectionIntersection& other) { if(SelectionIntersection_closer(other, best)) { best = other; } } /** * greebo: A helper class allowing to traverse a sequence of Vector3 * objects in memory. The Vector3 objects can have a certain distance * (stride) which is passed to the constructor. Incrementing the contained * iterator object moves from one Vector3 to the next in memory. */ class VertexPointer { typedef const unsigned char* byte_pointer; public: typedef const Vector3* vector_pointer; typedef const Vector3& vector_reference; class iterator { public: iterator() {} iterator(byte_pointer vertices, std::size_t stride) : m_iter(vertices), m_stride(stride) {} bool operator==(const iterator& other) const { return m_iter == other.m_iter; } bool operator!=(const iterator& other) const { return !operator==(other); } iterator operator+(std::size_t i) { return iterator(m_iter + i * m_stride, m_stride); } iterator operator+=(std::size_t i) { m_iter += i * m_stride; return *this; } iterator& operator++() { m_iter += m_stride; return *this; } iterator operator++(int) { iterator tmp = *this; m_iter += m_stride; return tmp; } vector_reference operator*() const { return *reinterpret_cast(m_iter); } private: byte_pointer m_iter; std::size_t m_stride; }; VertexPointer(vector_pointer vertices, std::size_t stride) : m_vertices(reinterpret_cast(vertices)), m_stride(stride) {} iterator begin() const { return iterator(m_vertices, m_stride); } vector_reference operator[](std::size_t i) const { return *reinterpret_cast(m_vertices + m_stride*i); } private: // The address of the first Vector3 object byte_pointer m_vertices; // The distance (in bytes) to the next object in memory std::size_t m_stride; }; class IndexPointer { public: typedef unsigned int index_type; typedef const index_type* pointer; class iterator { public: iterator(pointer iter) : m_iter(iter) {} bool operator==(const iterator& other) const { return m_iter == other.m_iter; } bool operator!=(const iterator& other) const { return !operator==(other); } iterator operator+(std::size_t i) { return m_iter + i; } iterator operator+=(std::size_t i) { return m_iter += i; } iterator operator++() { return ++m_iter; } iterator operator++(int) { return m_iter++; } const index_type& operator*() const { return *m_iter; } private: void increment() { ++m_iter; } pointer m_iter; }; IndexPointer(pointer indices, std::size_t count) : m_indices(indices), m_finish(indices + count) {} iterator begin() const { return m_indices; } iterator end() const { return m_finish; } private: pointer m_indices; pointer m_finish; }; template class BasicVector3; typedef BasicVector3 Vector3; class Matrix4; class VolumeTest; class SelectionTest { public: virtual ~SelectionTest() {} virtual void BeginMesh(const Matrix4& localToWorld, bool twoSided = false) = 0; virtual const VolumeTest& getVolume() const = 0; virtual const Vector3& getNear() const = 0; virtual const Vector3& getFar() const = 0; virtual void TestPoint(const Vector3& point, SelectionIntersection& best) = 0; virtual void TestPolygon(const VertexPointer& vertices, std::size_t count, SelectionIntersection& best) = 0; virtual void TestLineLoop(const VertexPointer& vertices, std::size_t count, SelectionIntersection& best) = 0; virtual void TestLineStrip(const VertexPointer& vertices, std::size_t count, SelectionIntersection& best) = 0; virtual void TestLines(const VertexPointer& vertices, std::size_t count, SelectionIntersection& best) = 0; virtual void TestTriangles(const VertexPointer& vertices, const IndexPointer& indices, SelectionIntersection& best) = 0; virtual void TestQuads(const VertexPointer& vertices, const IndexPointer& indices, SelectionIntersection& best) = 0; virtual void TestQuadStrip(const VertexPointer& vertices, const IndexPointer& indices, SelectionIntersection& best) = 0; }; typedef std::shared_ptr SelectionTestPtr; class Selector { public: virtual ~Selector() {} virtual void pushSelectable(Selectable& selectable) = 0; virtual void popSelectable() = 0; virtual void addIntersection(const SelectionIntersection& intersection) = 0; }; inline void Selector_add(Selector& selector, Selectable& selectable) { selector.pushSelectable(selectable); selector.addIntersection(SelectionIntersection(0, 0)); selector.popSelectable(); } inline void Selector_add(Selector& selector, Selectable& selectable, const SelectionIntersection& intersection) { selector.pushSelectable(selectable); selector.addIntersection(intersection); selector.popSelectable(); } class VolumeTest; class SelectionTestable { public: virtual ~SelectionTestable() {} virtual void testSelect(Selector& selector, SelectionTest& test) = 0; }; typedef std::shared_ptr SelectionTestablePtr; inline SelectionTestablePtr Node_getSelectionTestable(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } class ComponentSelectionTestable { public: virtual ~ComponentSelectionTestable() {} virtual bool isSelectedComponents() const = 0; virtual void setSelectedComponents(bool select, SelectionSystem::EComponentMode mode) = 0; virtual void testSelectComponents(Selector& selector, SelectionTest& test, SelectionSystem::EComponentMode mode) = 0; }; typedef std::shared_ptr ComponentSelectionTestablePtr; inline ComponentSelectionTestablePtr Node_getComponentSelectionTestable(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } class Plane3; typedef std::function PlaneCallback; class SelectedPlanes { public: virtual ~SelectedPlanes() {} virtual bool contains(const Plane3& plane) const = 0; }; class PlaneSelectable { public: virtual ~PlaneSelectable() {} virtual void selectPlanes(Selector& selector, SelectionTest& test, const PlaneCallback& selectedPlaneCallback) = 0; virtual void selectReversedPlanes(Selector& selector, const SelectedPlanes& selectedPlanes) = 0; }; typedef std::shared_ptr PlaneSelectablePtr; inline PlaneSelectablePtr Node_getPlaneSelectable(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } DarkRadiant-2.0.2/include/ishaderexpression.h000066400000000000000000000041701245424655700212520ustar00rootroot00000000000000#pragma once #include class IRenderEntity; namespace shaders { // Material registers, used to store shader expression results // The first two slots are always reserved for the constants 0 and 1, see enum ReservedRegisters typedef std::vector Registers; // The indices to the constants in the registers array enum ReservedRegisters { REG_ZERO = 0, REG_ONE = 1, NUM_RESERVED_REGISTERS, }; /** * A shader expression is something found in a Doom 3 material declaration, * where things like shader parameters, time and constants can be combined * by mathematical operators and table-lookups. A shader expression can be * a constant number in its simplest form, or a complex formula like this: * * vertexParm 0 0.1 * sintable[time * 0.3], 0.15 * sintable[time * 0.15] * * The above makes vertex parameter 0 a time-dependent value which is evaluated * each frame during rendering. * * A shader expression can be evaluated which results in a single floating point * value. In actual materials the shader expression is linked to a material register * where the value is written to after evaluation. */ class IShaderExpression { public: /** * Retrieve the floating point value of this expression. DEPRECATED */ virtual float getValue(std::size_t time) = 0; /** * Retrieve the floating point value of this expression. */ virtual float getValue(std::size_t time, const IRenderEntity& entity) = 0; /** * Evaluates the value of this expression, writing any results * into the linked material register. DEPRECATED */ virtual float evaluate(std::size_t time) = 0; /** * Evaluates the value of this expression, writing any results * into the linked material register. */ virtual float evaluate(std::size_t time, const IRenderEntity& entity) = 0; /** * Link the expression to the given Registers vector. * Calling evaluate() will cause the result to be saved into the register. * * @returns: the register position the result will be written to. */ virtual std::size_t linkToRegister(Registers& registers) = 0; }; typedef std::shared_ptr IShaderExpressionPtr; } // namespace DarkRadiant-2.0.2/include/ishaders.h000066400000000000000000000327541245424655700173260ustar00rootroot00000000000000/* Copyright (C) 1999-2006 Id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #pragma once #include "iimage.h" #include "imodule.h" #include "math/Vector3.h" #include "math/Vector4.h" #include #include #include "Texture.h" #include "ShaderLayer.h" #include "ishaderexpression.h" class Image; // Forward declaration namespace shaders { class MapExpression; typedef std::shared_ptr MapExpressionPtr; } // namespace shaders /** * \brief * Interface for a material shader. * * A material shader consists of global parameters, an editor image, and zero or * more shader layers (including diffusemap, bumpmap and specularmap textures * which are handled specially). */ class Material { public: enum CullType { CULL_BACK, // default backside culling, for materials without special flags CULL_FRONT, // "backSided" CULL_NONE, // "twoSided" }; // Global material flags enum Flags { FLAG_NOSHADOWS = 1 << 0, // noShadows FLAG_NOSELFSHADOW = 1 << 1, // noSelfShadow FLAG_FORCESHADOWS = 1 << 2, // forceShadows FLAG_NOOVERLAYS = 1 << 3, // noOverlays FLAG_FORCEOVERLAYS = 1 << 4, // forceOverlays FLAG_TRANSLUCENT = 1 << 5, // translucent FLAG_FORCEOPAQUE = 1 << 6, // forceOpaque FLAG_NOFOG = 1 << 7, // noFog FLAG_NOPORTALFOG = 1 << 8, // noPortalFog FLAG_UNSMOOTHEDTANGENTS = 1 << 9, // unsmoothedTangents FLAG_MIRROR = 1 << 10, // mirror }; // Surface Flags enum SurfaceFlags { SURF_SOLID = 1 << 0, SURF_OPAQUE = 1 << 1, SURF_WATER = 1 << 2, SURF_PLAYERCLIP = 1 << 3, SURF_MONSTERCLIP = 1 << 4, SURF_MOVEABLECLIP = 1 << 5, SURF_IKCLIP = 1 << 6, SURF_BLOOD = 1 << 7, SURF_TRIGGER = 1 << 8, SURF_AASSOLID = 1 << 9, SURF_AASOBSTACLE = 1 << 10, SURF_FLASHLIGHT_TRIGGER = 1 << 11, SURF_NONSOLID = 1 << 12, SURF_NULLNORMAL = 1 << 13, SURF_AREAPORTAL = 1 << 14, SURF_NOCARVE = 1 << 15, SURF_DISCRETE = 1 << 16, SURF_NOFRAGMENT = 1 << 17, SURF_SLICK = 1 << 18, SURF_COLLISION = 1 << 19, SURF_NOIMPACT = 1 << 20, SURF_NODAMAGE = 1 << 21, SURF_LADDER = 1 << 22, SURF_NOSTEPS = 1 << 23, SURF_ENTITYGUI = 1 << 24, }; // Surface Type (plastic, stone, etc.) enum SurfaceType { SURFTYPE_DEFAULT, SURFTYPE_METAL, SURFTYPE_STONE, SURFTYPE_FLESH, SURFTYPE_WOOD, SURFTYPE_CARDBOARD, SURFTYPE_LIQUID, SURFTYPE_GLASS, SURFTYPE_PLASTIC, SURFTYPE_RICOCHET, SURFTYPE_AASOBSTACLE, SURFTYPE_10, SURFTYPE_11, SURFTYPE_12, SURFTYPE_13, SURFTYPE_14, SURFTYPE_15 }; /** * \brief * Requested sort position from material declaration (e.g. "sort decal"). * The actual sort order of a material is stored as a floating point number, * these enumerations represent some regularly used shortcuts in material decls. * The values of this enum have been modeled after the ones found in the D3 SDK. */ enum SortRequest { SORT_SUBVIEW = -3, // mirrors, viewscreens, etc SORT_GUI = -2, // guis SORT_BAD = -1, SORT_OPAQUE, // opaque SORT_PORTAL_SKY, SORT_DECAL, // scorch marks, etc. SORT_FAR, SORT_MEDIUM, // normal translucent SORT_CLOSE, SORT_ALMOST_NEAREST, // gun smoke puffs SORT_NEAREST, // screen blood blobs SORT_POST_PROCESS = 100 // after a screen copy to texture }; // Deform Type enum DeformType { DEFORM_NONE, DEFORM_SPRITE, DEFORM_TUBE, DEFORM_FLARE, DEFORM_EXPAND, DEFORM_MOVE, DEFORM_TURBULENT, DEFORM_EYEBALL, DEFORM_PARTICLE, DEFORM_PARTICLE2, }; struct DecalInfo { int stayMilliSeconds; int fadeMilliSeconds; Vector4 startColour; Vector4 endColour; }; enum Coverage { MC_UNDETERMINED, MC_OPAQUE, // completely fills the triangle, will have black drawn on fillDepthBuffer MC_PERFORATED, // may have alpha tested holes MC_TRANSLUCENT // blended with background }; virtual ~Material() {} /** * \brief * Return the editor image texture for this shader. */ virtual TexturePtr getEditorImage() = 0; /** * \brief * Return true if the editor image is no tex for this shader. */ virtual bool isEditorImageNoTex() = 0; /** * \brief * Get the string name of this shader. */ virtual std::string getName() const = 0; virtual bool IsInUse() const = 0; virtual void SetInUse(bool bInUse) = 0; // test if it's a true shader, or a default shader created to wrap around a texture virtual bool IsDefault() const = 0; // get shader file name (ie the file where this one is defined) virtual const char* getShaderFileName() const = 0; /** * \brief * Return the requested sort position of this material. * greebo: D3 is using floating points for the sort value but * as far as I can see only rounded numbers have been used. */ virtual int getSortRequest() const = 0; /** * \brief * Return a polygon offset if one is defined. The default is 0. */ virtual float getPolygonOffset() const = 0; /** * Get the desired texture repeat behaviour. */ virtual ClampType getClampType() const = 0; // Get the cull type (none, back, front) virtual CullType getCullType() const = 0; /** * Get the global material flags (translucent, noshadows, etc.) */ virtual int getMaterialFlags() const = 0; /** * Surface flags (areaportal, nonsolid, etc.) */ virtual int getSurfaceFlags() const = 0; /** * Surface Type (wood, stone, surfType15, ...) */ virtual SurfaceType getSurfaceType() const = 0; /** * Get the deform type of this material */ virtual DeformType getDeformType() const = 0; /** * Returns the spectrum of this shader, -1 means "no defined spectrum" */ virtual int getSpectrum() const = 0; /** * Retrieves the decal info structure of this material. */ virtual const DecalInfo& getDecalInfo() const = 0; /** * Returns the coverage type of this material, also needed * by the map compiler. */ virtual Coverage getCoverage() const = 0; /** * Returns the raw shader definition block, as parsed by the material manager. * The definition is lacking the outermost curly braces. */ virtual std::string getDefinition() = 0; /** Determine whether this is an ambient light shader, i.e. the * material def contains the global "ambientLight" keyword. */ virtual bool isAmbientLight() const = 0; /** Determine whether this is an blend light shader, i.e. the * material def contains the global "blendLight" keyword. */ virtual bool isBlendLight() const = 0; /** Determine whether this is an fog light shader, i.e. the * material def contains the global "fogLight" keyword. */ virtual bool isFogLight() const = 0; /** * For light shaders: implicitly no-shadows lights (ambients, fogs, etc) * will never cast shadows but individual light entities can also override this value. */ virtual bool lightCastsShadows() const = 0; // returns true if the material will generate shadows, not making a // distinction between global and no-self shadows virtual bool surfaceCastsShadow() const = 0; /** * returns true if the material will draw anything at all. Triggers, portals, * etc, will not have anything to draw. A not drawn surface can still castShadow, * which can be used to make a simplified shadow hull for a complex object set as noShadow. */ virtual bool isDrawn() const = 0; /** * a discrete surface will never be merged with other surfaces by dmap, which is * necessary to prevent mutliple gui surfaces, mirrors, autosprites, and some other * special effects from being combined into a single surface * guis, merging sprites or other effects, mirrors and remote views are always discrete */ virtual bool isDiscrete() const = 0; virtual ShaderLayer* firstLayer() const = 0; /** * \brief * Return a std::vector containing all layers in this material shader. * * This includes all diffuse, bump, specular or blend layers. */ virtual const ShaderLayerVector& getAllLayers() const = 0; virtual TexturePtr lightFalloffImage() = 0; // greebo: Returns the description as defined in the material virtual std::string getDescription() const = 0; /** * greebo: Returns TRUE if the shader is visible, FALSE if it * is filtered or disabled in any other way. */ virtual bool isVisible() const = 0; /** * greebo: Sets the visibility of this shader. */ virtual void setVisible(bool visible) = 0; }; typedef std::shared_ptr MaterialPtr; /** * Stream insertion of Material for debugging purposes. */ inline std::ostream& operator<< (std::ostream& os, const Material& shader) { os << "Material { name = " << shader.getName() << ", filename = " << shader.getShaderFileName() << ", firstlayer = " << shader.firstLayer() << " }"; return os; } namespace shaders { /** * greebo: Abstract visitor class for traversing shader lists. */ class ShaderVisitor { public: virtual ~ShaderVisitor() {} virtual void visit(const MaterialPtr& shader) = 0; }; } // namespace shaders typedef std::function ShaderNameCallback; class ModuleObserver; const char* const MODULE_SHADERSYSTEM = "MaterialManager"; /** * \brief * Interface for the material manager. * * The material manager parses all of the MTR declarations and provides access * to Material objects representing the loaded materials. */ class MaterialManager : public RegisterableModule { public: // NOTE: shader and texture names used must be full path. // Shaders usable as textures have prefix equal to getTexturePrefix() virtual void realise() = 0; virtual void unrealise() = 0; virtual void refresh() = 0; /** Determine whether the shader system is realised. This may be used * by components which need to ensure the shaders are realised before * they start trying to display them. * * @returns * true if the shader system is realised, false otherwise */ virtual bool isRealised() = 0; /** Activate the shader for a given name and return it. The default shader * will be returned if name is not found. * * @param name * The text name of the shader to load. * * @returns * MaterialPtr shared ptr corresponding to the named shader object. */ virtual MaterialPtr getMaterialForName(const std::string& name) = 0; /** * greebo: Returns true if the named material is existing, false otherwise. * In the latter case getMaterialForName() would return a default "shader not found". */ virtual bool materialExists(const std::string& name) = 0; virtual void foreachShaderName(const ShaderNameCallback& callback) = 0; /** * greebo: Traverse all shaders using the given visitor class. */ virtual void foreachShader(shaders::ShaderVisitor& visitor) = 0; // The observer gets notified when the list of active shaders changes class ActiveShadersObserver { public: virtual ~ActiveShadersObserver() {} virtual void onActiveShadersChanged() = 0; }; typedef std::shared_ptr ActiveShadersObserverPtr; // Set the callback to be invoked when the active shaders list has changed virtual void addActiveShadersObserver(const ActiveShadersObserverPtr& observer) = 0; virtual void removeActiveShadersObserver(const ActiveShadersObserverPtr& observer) = 0; /** * Enable or disable active shaders updates (for performance). */ virtual void setActiveShaderUpdates(bool val) = 0; virtual void attach(ModuleObserver& observer) = 0; virtual void detach(ModuleObserver& observer) = 0; virtual void setLightingEnabled(bool enabled) = 0; virtual const char* getTexturePrefix() const = 0; /** * \brief * Return the default texture to be used for lighting mode rendering if it * is not defined for a shader. * * \param type * The type of interaction layer whose default texture is required. */ virtual TexturePtr getDefaultInteractionTexture(ShaderLayer::Type type) = 0; /** * greebo: This is a substitution for the "old" TexturesCache method * used to load an image from a file to graphics memory for arbitrary * use (e.g. the Overlay module). * * @param filename * The absolute filename. * * @param moduleNames * The space-separated list of image modules (default is "GDK"). */ virtual TexturePtr loadTextureFromFile(const std::string& filename) = 0; /** * Creates a new shader expression for the given string. This can be used to create standalone * expression objects for unit testing purposes. */ virtual shaders::IShaderExpressionPtr createShaderExpressionFromString(const std::string& exprStr) = 0; }; inline MaterialManager& GlobalMaterialManager() { // Cache the reference locally static MaterialManager& _shaderSystem( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_SHADERSYSTEM) ) ); return _shaderSystem; } DarkRadiant-2.0.2/include/isound.h000066400000000000000000000063201245424655700170130ustar00rootroot00000000000000#ifndef ISOUND_H_ #define ISOUND_H_ #include "imodule.h" #include "ModResource.h" #include #include // A list of sound files associated to a shader typedef std::vector SoundFileList; const float METERS_PER_UNIT = 0.0254f; const float UNITS_PER_METER = 1/METERS_PER_UNIT; // The min and max radii of a sound shader class SoundRadii { float minRad, maxRad; public: //set sound radii either in metres or in inch on initialization might cause a conversion SoundRadii (float min = 0, float max = 0, bool inMetres = false) { if (inMetres) { minRad = min * UNITS_PER_METER; maxRad = max * UNITS_PER_METER; } else { minRad = min; maxRad = max; } } // set the sound radii in metres or in inch, might cause a conversion void setMin(float min, bool inMetres = false) { if (inMetres) { minRad = min * UNITS_PER_METER; } else { minRad = min; } } void setMax (float max, bool inMetres = false) { if (inMetres) { maxRad = max * UNITS_PER_METER; } else { maxRad = max; } } float getMin(bool inMetres = false) const { return (inMetres) ? minRad * METERS_PER_UNIT : minRad; } float getMax(bool inMetres = false) const { return (inMetres) ? maxRad * METERS_PER_UNIT : maxRad; } }; /// Representation of a single sound or sound shader. class ISoundShader : public ModResource { public: /// Get the name of the shader virtual std::string getName() const = 0; /// Get the min and max radii of the shader virtual SoundRadii getRadii() const = 0; /// Get the list of sound files associated to this shader virtual SoundFileList getSoundFileList() const = 0; // angua: get the display folder for sorting the sounds in the sound chooser window virtual const std::string& getDisplayFolder() const = 0; }; typedef std::shared_ptr ISoundShaderPtr; const std::string MODULE_SOUNDMANAGER("SoundManager"); /// Sound manager interface. class ISoundManager : public RegisterableModule { public: /// Invoke a function for each sound shader virtual void forEachShader(std::function) const = 0; /** greebo: Tries to lookup the SoundShader with the given name, * returns a soundshader with an empty name, if the lookup failed. */ virtual ISoundShaderPtr getSoundShader(const std::string& shaderName) = 0; /** greebo: Plays the given sound file (defined by its VFS path). * * @returns: TRUE, if the sound file was found at the given VFS path, * FALSE otherwise */ virtual bool playSound(const std::string& fileName) = 0; /** greebo: Stops the currently played sound. */ virtual void stopSound() = 0; }; // Accessor method inline ISoundManager& GlobalSoundManager() { // Cache the reference locally static ISoundManager& _soundManager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_SOUNDMANAGER) ) ); return _soundManager; } #endif /*ISOUND_H_*/ DarkRadiant-2.0.2/include/ispacepartition.h000066400000000000000000000062031245424655700207100ustar00rootroot00000000000000#ifndef _ISPACE_PARTITION_H_ #define _ISPACE_PARTITION_H_ #include #include #include "imodule.h" // Forward declaration class AABB; namespace scene { // Some forward declarations to avoid including all the headers class INode; typedef std::shared_ptr INodePtr; class ISPNode; typedef std::shared_ptr ISPNodePtr; typedef std::weak_ptr ISPNodeWeakPtr; /** * greebo: This is the abstract definition of a SpacePartition node. * * A SpacePartition node has the following properties: * * - It always has valid bounds (in the form of an AABB). * - Each node can have any amount of children [0..infinity) * - A node with 0 children is called a Leaf. * - Each node can have exactly one parent (which is NULL for the root node). * - The collectivity of nodes form a tree whereas the topmost one is the largest. * - Each node can host any amount of "members" (member == scene::INode). * * It is the task of the ISpacePartitionSystem to allocate and manage these nodes. * scene::INodes are "linked" to the correct ISPNodes through the ISPacePartition's * link() methods - and are unlinked through the unlink() method of the latter. */ class ISPNode { public: virtual ~ISPNode() {} // The child nodes typedef std::vector NodeList; // The members typedef std::list MemberList; // Get the parent node (can be NULL for the root node) virtual ISPNodePtr getParent() const = 0; // The maximum bounds of this node virtual const AABB& getBounds() const = 0; // The child nodes of this node (either 8 or 0) virtual const NodeList& getChildNodes() const = 0; // Returns true if no more child nodes are below this one virtual bool isLeaf() const = 0; // Get a list of members virtual const MemberList& getMembers() const = 0; }; typedef std::shared_ptr ISPNodePtr; /** * greebo: The SpacePartitionSystem interface is a simple one. All it needs * to do is to provide link/unlink methods for linking scene::INodes * into the space partition system and to deliver the "entry point" for traversal, * which is the root ISPNode. * * The link() method makes sure the given node is added as member to the ISPNode it fits best. * The unlink() method can be used to remove a node from the tree again. * * Note: It's not allowed to call link() for nodes which are already linked into the tree. * It's safe to call unlink() for any node at any time, even multiple times in a row. * The unlink() method will return true if the node had been linked before. */ class ISpacePartitionSystem { public: virtual ~ISpacePartitionSystem() {} // Links this node into the SP tree. Returns the node it ends up being associated with virtual void link(const scene::INodePtr& sceneNode) = 0; // Unlink this node from the SP tree, returns true if this was successful // (node had been linked before) virtual bool unlink(const scene::INodePtr& sceneNode) = 0; // Returns the root node of this SP tree (the largest one, encompassing everything) virtual ISPNodePtr getRoot() const = 0; }; typedef std::shared_ptr ISpacePartitionSystemPtr; } // namespace scene #endif /* _ISPACE_PARTITION_H_ */ DarkRadiant-2.0.2/include/itexdef.h000066400000000000000000000025141245424655700171430ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined (INCLUDED_ITEXDEF_H) #define INCLUDED_ITEXDEF_H class Matrix4; /* greebo: The texture definition structure, containing the scale, * rotation and shift values of an applied texture. * At some places this is referred to as "fake" texture coordinates. */ class GenericTextureDefinition { public: double _shift[2]; double _rotate; double _scale[2]; virtual ~GenericTextureDefinition() {} // Test the texture definition for insanely large values virtual bool isSane() const = 0; virtual Matrix4 getTransform(double width, double height) const = 0; }; #endif DarkRadiant-2.0.2/include/itextstream.h000066400000000000000000000112101245424655700200550ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_ITEXTSTREAM_H) #define INCLUDED_ITEXTSTREAM_H /// \file /// \brief Text-stream interfaces. #include #include #include #include #include #include #include #include #include "imodule.h" /// \brief A read-only character-stream. // OrbWeaver: merged functionality from TextStreambufAdaptor onto this class // directly. class TextInputStream : public std::streambuf { protected: // Buffer to use for reading static const std::size_t BUFFER_SIZE = 8192; char _buffer[BUFFER_SIZE]; protected: /* Implementations of stream-specific virtual functions on std::streambuf */ // Replenish the controlled buffer with characters from the underlying // input sequence. virtual int underflow() { // Read next block of BUFFER_SIZE characters into the buffer from // the underlying TextInputStream. std::size_t charsRead = this->read(_buffer, BUFFER_SIZE); // Set up the internal pointers correctly assert(charsRead <= BUFFER_SIZE); std::streambuf::setg(_buffer, _buffer, _buffer + charsRead); // Return the next character, or EOF if there were no more characters if (charsRead > 0) return static_cast(_buffer[0]); else return EOF; } public: /// \brief Attempts to read the next \p length characters from the stream to \p buffer. /// Returns the number of characters actually stored in \p buffer. virtual std::size_t read(char* buffer, std::size_t length) = 0; }; class NullOutputBuf : public std::streambuf { protected: virtual std::size_t xsputn(const char*, std::size_t len) { // Override the virtual xsputn method to do nothing instead return len; } }; class NullOutputStream : public std::ostream { NullOutputBuf _nullBuf; public: NullOutputStream() : std::ostream(&_nullBuf) {} }; /** * greebo: This is a simple container holding a single output stream. * Use the getStream() method to acquire a reference to the stream. */ class OutputStreamHolder { NullOutputStream _nullOutputStream; std::ostream* _outputStream; public: OutputStreamHolder() : _outputStream(&_nullOutputStream) {} void setStream(std::ostream& outputStream) { _outputStream = &outputStream; } std::ostream& getStream() { return *_outputStream; } }; // The static stream holder containers, these are instantiated by each // module (DLL/so) at the time of the first call. inline OutputStreamHolder& GlobalOutputStream() { static OutputStreamHolder _holder; return _holder; } inline OutputStreamHolder& GlobalErrorStream() { static OutputStreamHolder _holder; return _holder; } inline OutputStreamHolder& GlobalWarningStream() { static OutputStreamHolder _holder; return _holder; } inline OutputStreamHolder& GlobalDebugStream() { static OutputStreamHolder _holder; return _holder; } // The stream accessors: use these to write to the application's various streams. inline std::ostream& rMessage() { return GlobalOutputStream().getStream(); } inline std::ostream& rError() { return GlobalErrorStream().getStream(); } inline std::ostream& rWarning() { return GlobalWarningStream().getStream(); } /** * \brief * Get the debug output stream. * * In debug builds the debug stream is the same as the output stream. In release * builds it is a null stream. */ inline std::ostream& rDebug() { return GlobalDebugStream().getStream(); } namespace module { // greebo: This is called once by each module at load time to initialise // the OutputStreamHolders above. inline void initialiseStreams(const ApplicationContext& ctx) { GlobalOutputStream().setStream(ctx.getOutputStream()); GlobalWarningStream().setStream(ctx.getWarningStream()); GlobalErrorStream().setStream(ctx.getErrorStream()); #ifndef NDEBUG GlobalDebugStream().setStream(ctx.getOutputStream()); #endif } } // namespace module #endif DarkRadiant-2.0.2/include/ithread.h000066400000000000000000000010221245424655700171240ustar00rootroot00000000000000#pragma once #include /** * \brief * Interface to the threading manager. * * The ThreadManager wraps a thread pool which is owned and managed by the * main Radiant application. */ class ThreadManager { public: /// Execute the given function in a separate thread /// Returns the thread id, which can be used to query the state virtual std::size_t execute(std::function func) = 0; // Returns true if the given thread is still running virtual bool threadIsRunning(std::size_t threadId) = 0; }; DarkRadiant-2.0.2/include/itraceable.h000066400000000000000000000013471245424655700176110ustar00rootroot00000000000000#pragma once template class BasicVector3; typedef BasicVector3 Vector3; class Ray; #include /** * An object supporting this interface provides methods * to run traces against its geometry, e.g. calculating * the intersection point of a given Ray. */ class ITraceable { public: /** * Calculates the intersection point of the given Ray with the geometry * of this object. Returns false if the Ray doesn't have an intersection * point, otherwise returns true, in which case the coordinates of the * intersection point are stored in the intersection reference. */ virtual bool getIntersection(const Ray& ray, Vector3& intersection) = 0; }; typedef std::shared_ptr ITraceablePtr; DarkRadiant-2.0.2/include/itransformable.h000066400000000000000000000017121245424655700205220ustar00rootroot00000000000000#pragma once #include enum TransformModifierType { TRANSFORM_PRIMITIVE, TRANSFORM_COMPONENT, }; // Forward-declare the math objects template class BasicVector3; typedef BasicVector3 Vector3; template class BasicVector4; typedef BasicVector4 Vector4; class Quaternion; class ITransformable { public: virtual ~ITransformable() {} virtual void setType(TransformModifierType type) = 0; virtual void setTranslation(const Vector3& value) = 0; virtual void setRotation(const Quaternion& value) = 0; virtual void setScale(const Vector3& value) = 0; virtual void freezeTransform() = 0; virtual void revertTransform() = 0; }; typedef std::shared_ptr ITransformablePtr; namespace scene { class INode; typedef std::shared_ptr INodePtr; } inline ITransformablePtr Node_getTransformable(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } DarkRadiant-2.0.2/include/itransformnode.h000066400000000000000000000007711245424655700205500ustar00rootroot00000000000000#pragma once #include "inode.h" class Matrix4; /// \brief A transform node. class ITransformNode { public: virtual ~ITransformNode() {} /// \brief Returns the transform which maps the node's local-space into the local-space of its parent node. virtual const Matrix4& localToParent() const = 0; }; typedef std::shared_ptr ITransformNodePtr; inline ITransformNodePtr Node_getTransformNode(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } DarkRadiant-2.0.2/include/iuimanager.h000066400000000000000000000164151245424655700176410ustar00rootroot00000000000000#pragma once #include "math/Vector3.h" #include "imodule.h" // Forward declarations class wxWindow; class wxObject; class wxToolBar; class IColourSchemeManager { public: virtual ~IColourSchemeManager() {} // greebo: Returns the named colour, returns <0,0,0> if not found virtual Vector3 getColour(const std::string& colourName) = 0; }; namespace ui { /** * greebo: The possible menu item types, one of these * has to be passed when creating menu items. */ enum eMenuItemType { menuNothing, menuRoot, menuBar, menuFolder, menuItem, menuSeparator, }; } // namespace ui /** greebo: Implementation documentation: see MenuManager.h. */ class IMenuManager { public: /** Destructor */ virtual ~IMenuManager() {} /** greebo: Retrieves the menuitem widget specified by the path. * * Example: get("main/file/open") delivers the widget for the "Open..." command. * * @returns: the widget, or NULL, if no the path hasn't been found. */ virtual wxObject* get(const std::string& path) = 0; /** greebo: Shows/hides the menuitem under the given path. * * @path: the path to the item (e.g. "main/view/cameraview") * @visible: FALSE, if the widget should be hidden, TRUE otherwise */ virtual void setVisibility(const std::string& path, bool visible) = 0; /** greebo: Adds a new item as child under the given path. * * @insertPath: the path where to insert the item: "main/filters" * @name: the name of the new item * @type: the item type (usually menuFolder / menuItem) * @caption: the display string of the menu item (incl. mnemonic) * @icon: the icon filename (can be empty) * @eventname: the event name (e.g. "ToggleShowSizeInfo") * * @returns: the menu item wxObject, which might be a wxMenuItem, or * a wxMenu or wxMenuBar pointer. */ virtual wxObject* add(const std::string& insertPath, const std::string& name, ui::eMenuItemType type, const std::string& caption, const std::string& icon, const std::string& eventName) = 0; /** greebo: Inserts a new menuItem as sibling _before_ the given insertPath. * * @insertPath: the path where to insert the item: "main/filters" * @name: the name of the new menu item (no path, just the name) * @caption: the display string including mnemonic * @icon: the image file name relative to "bitmaps/", can be empty. * @eventName: the event name this item is associated with (can be empty). * * @returns: the menu item wxObject, which might be a wxMenuItem, or * a wxMenu or wxMenuBar pointer. */ virtual wxObject* insert(const std::string& insertPath, const std::string& name, ui::eMenuItemType type, const std::string& caption, const std::string& icon, const std::string& eventName) = 0; /** * Removes an entire path from the menus. */ virtual void remove(const std::string& path) = 0; /** Recursively iterates over the menu items and updates * the accelerator strings by requesting them from the EventManager. */ virtual void updateAccelerators() = 0; }; class IToolbarManager { public: virtual ~IToolbarManager() {} virtual wxToolBar* getToolbar(const std::string& toolbarName, wxWindow* parent) = 0; }; // The name of the command status bar item #define STATUSBAR_COMMAND "Command" class IStatusBarManager { public: // Use these positions to place the status bar elements in between // the default ones. A position of 31 would put a widget in between // POS_BRUSHCOUNT and POS_SHADERCLIPBOARD. enum StandardPositions { POS_FRONT = 0, POS_COMMAND = 10, POS_POSITION = 20, POS_BRUSHCOUNT = 30, POS_SHADERCLIPBOARD = 40, POS_GRID = 50, POS_BACK = 9000, }; /** * Destructor */ virtual ~IStatusBarManager() {} /** * Get the status bar widget, for packing into the main window. * The widget will be parented to a temporary wxFrame, so it has to be * re-parented before packing. */ virtual wxWindow* getStatusBar() = 0; /** * greebo: This adds a named element to the status bar. Pass the widget * which should be added and specify the position order. * * @name: the name of the element (can be used for later lookup). * @widget: the widget to pack. * @pos: the position to insert. Use POS_FRONT or POS_BACK to put the element * at the front or back of the status bar container. */ virtual void addElement(const std::string& name, wxWindow* widget, int pos) = 0; /** * greebo: A specialised method, adding a named text element. * Use the setText() method to update this element. * * @name: the name for this element (can be used as key for the setText() method). * @icon: the icon file to pack into the element, relative the BITMAPS_PATH. Leave empty * if no icon is desired. * @pos: the position to insert. Use POS_FRONT or POS_BACK to put the element * at the front or back of the status bar container. */ virtual void addTextElement(const std::string& name, const std::string& icon, int pos) = 0; /** * Updates the content of the named text element. The name must refer to * an element previously added by addTextElement(). * If immediateUpdate is set to true, the UI will be updated right now. UI updates come with * a certain cost, try to avoid it unless it's really necessary. */ virtual void setText(const std::string& name, const std::string& text, bool immediateUpdate = false) = 0; /** * Returns a named status bar widget, previously added by addElement(). * * @returns: NULL if the named widget does not exist. */ virtual wxWindow* getElement(const std::string& name) = 0; }; // Forward declarations class IGroupDialog; // see igroupdialog.h for definition namespace ui { class IDialogManager; // see idialogmanager.h for definition class IFilterMenu; // see ifiltermenu.h for definition typedef std::shared_ptr IFilterMenuPtr; } // namespace ui const std::string MODULE_UIMANAGER("UIManager"); /** greebo: The UI Manager abstract base class. * * The UIManager provides an interface to add UI items like menu commands * toolbar icons, update status bar texts and such. */ class IUIManager : public RegisterableModule { public: virtual IMenuManager& getMenuManager() = 0; virtual IToolbarManager& getToolbarManager() = 0; virtual IColourSchemeManager& getColourSchemeManager() = 0; virtual IGroupDialog& getGroupDialog() = 0; virtual IStatusBarManager& getStatusBarManager() = 0; virtual ui::IDialogManager& getDialogManager() = 0; // Returns the art provider prefix to acquire local bitmaps from the wxWidgets art provider // Example: wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + "darkradiant_icon_64x64.png") virtual const std::string& ArtIdPrefix() const = 0; // Creates and returns a new top-level filter menu bar, see ifiltermenu.h virtual ui::IFilterMenuPtr createFilterMenu() = 0; }; // This is the accessor for the UI manager inline IUIManager& GlobalUIManager() { // Cache the reference locally static IUIManager& _uiManager( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_UIMANAGER) ) ); return _uiManager; } // Shortcut accessors inline IColourSchemeManager& ColourSchemes() { return GlobalUIManager().getColourSchemeManager(); } inline IGroupDialog& GlobalGroupDialog() { return GlobalUIManager().getGroupDialog(); } DarkRadiant-2.0.2/include/iundo.h000066400000000000000000000067111245424655700166340ustar00rootroot00000000000000#pragma once /// \file /// \brief The undo-system interface. Uses the 'memento' pattern. #include "imodule.h" #include #include /** * greebo: An UndoMemento has to be allocated on the heap * and contains all the information that is needed to describe * the status of an Undoable. */ class IUndoMemento { public: virtual ~IUndoMemento() {} }; typedef std::shared_ptr IUndoMementoPtr; /* greebo: This is the abstract base class for an Undoable object. * Derive from this class if your instance/object should be Undoable. * * The exportState method has to allocate and return a new UndoMemento * with all the necessary data to restore the current state. * * The importState() method should re-import the values saved in the * UndoMemento */ class IUndoable { public: virtual ~IUndoable() {} virtual IUndoMementoPtr exportState() const = 0; virtual void importState(const IUndoMementoPtr& state) = 0; }; /** * Undoables request their associated StateSaver to save their current state. * The state saver might call the Undoable's exportState() method or not, * depending on whether the Undoable has already been saved during * the current operation's lifetime. * To acquire an UndoStateSaver, use UndoSystem::getStateSaver(). */ class IUndoStateSaver { public: virtual ~IUndoStateSaver() {} virtual void save(IUndoable& undoable) = 0; }; const std::string MODULE_UNDOSYSTEM("UndoSystem"); class UndoSystem : public RegisterableModule { public: // Undoable objects need to call this to get hold of a StateSaver instance // which will take care of exporting and saving the state. virtual IUndoStateSaver* getStateSaver(IUndoable& undoable) = 0; virtual void releaseStateSaver(IUndoable& undoable) = 0; virtual std::size_t size() const = 0; virtual void start() = 0; virtual void finish(const std::string& command) = 0; virtual void undo() = 0; virtual void redo() = 0; virtual void clear() = 0; class Observer { public: virtual ~Observer() {} // Gets called after an undo operation is fully completed, allows objects to refresh their state virtual void postUndo() = 0; // Gets called after a redo operation is fully completed, allows objects to refresh their state virtual void postRedo() = 0; }; // Adds/removes an observer, which gets called on certain events virtual void addObserver(Observer* observer) = 0; virtual void removeObserver(Observer* observer) = 0; // greebo: This finishes the current operation and removes // it immediately from the stack, therefore it never existed. virtual void cancel() = 0; /** * Observer implementation which gets notified * on undo/redo perations. */ class Tracker { public: virtual ~Tracker() {} virtual void clear() = 0; virtual void begin() = 0; virtual void undo() = 0; virtual void redo() = 0; }; virtual void attachTracker(Tracker& tracker) = 0; virtual void detachTracker(Tracker& tracker) = 0; }; // The accessor function inline UndoSystem& GlobalUndoSystem() { // Cache the reference locally static UndoSystem& _undoSystem( *std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_UNDOSYSTEM) ) ); return _undoSystem; } class UndoableCommand { const std::string _command; public: UndoableCommand(const std::string& command) : _command(command) { GlobalUndoSystem().start(); } ~UndoableCommand() { GlobalUndoSystem().finish(_command); } }; DarkRadiant-2.0.2/include/ivolumetest.h000066400000000000000000000041411245424655700200710ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_CULLABLE_H) #define INCLUDED_CULLABLE_H #include "VolumeIntersectionValue.h" template class BasicVector3; typedef BasicVector3 Vector3; class Plane3; class Matrix4; class AABB; class Segment; class VolumeTest { public: /// \brief destructor virtual ~VolumeTest() {} /// \brief Returns true if \p point intersects volume. virtual bool TestPoint(const Vector3& point) const = 0; /// \brief Returns true if \p segment intersects volume. virtual bool TestLine(const Segment& segment) const = 0; /// \brief Returns true if \p plane faces towards volume. virtual bool TestPlane(const Plane3& plane) const = 0; /// \brief Returns true if \p plane transformed by \p localToWorld faces the viewer. virtual bool TestPlane(const Plane3& plane, const Matrix4& localToWorld) const = 0; /// \brief Returns the intersection of \p aabb and volume. virtual VolumeIntersectionValue TestAABB(const AABB& aabb) const = 0; /// \brief Returns the intersection of \p aabb transformed by \p localToWorld and volume. virtual VolumeIntersectionValue TestAABB(const AABB& aabb, const Matrix4& localToWorld) const = 0; virtual bool fill() const = 0; virtual const Matrix4& GetViewport() const = 0; virtual const Matrix4& GetProjection() const = 0; virtual const Matrix4& GetModelview() const = 0; }; #endif DarkRadiant-2.0.2/include/mapfile.h000066400000000000000000000017301245424655700171270ustar00rootroot00000000000000#pragma once #include #include "iscenegraph.h" #include #include const std::size_t MAPFILE_MAX_CHANGES = std::numeric_limits::max(); class IMapFileChangeTracker { public: virtual ~IMapFileChangeTracker() {} virtual void save() = 0; virtual bool saved() const = 0; virtual void changed() = 0; virtual void setChangedCallback(const std::function& changed) = 0; virtual std::size_t changes() const = 0; }; typedef std::shared_ptr IMapFileChangeTrackerPtr; inline IMapFileChangeTrackerPtr Node_getMapFile(const scene::INodePtr& node) { return std::dynamic_pointer_cast(node); } namespace scene { inline IMapFileChangeTracker* findMapFile(INodePtr node) { while (node) { IMapFileChangeTrackerPtr map = Node_getMapFile(node); if (map) { return map.get(); } node = node->getParent(); } return nullptr; } } // namespace scene DarkRadiant-2.0.2/include/modelskin.h000066400000000000000000000057451245424655700175110ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_MODELSKIN_H) #define INCLUDED_MODELSKIN_H #include #include "imodule.h" class ModuleObserver; class ModelSkin { public: /** * Destructor */ virtual ~ModelSkin() {} /** * greebo: Returns the name of this skin. */ virtual std::string getName() const = 0; /** * Get the mapped texture for the given query texture, using the mappings * in this skin. If there is no mapping for the given texture, return an * empty string. */ virtual std::string getRemap(const std::string& name) const = 0; }; typedef std::shared_ptr ModelSkinPtr; class SkinnedModel { public: // destructor virtual ~SkinnedModel() {} // greebo: Updates the model's surface remaps. Pass the new skin name (can be empty). virtual void skinChanged(const std::string& newSkinName) = 0; // Returns the name of the currently active skin virtual std::string getSkin() const = 0; }; typedef std::shared_ptr SkinnedModelPtr; // Model skinlist typedef typedef std::vector StringList; const std::string MODULE_MODELSKINCACHE("ModelSkinCache"); /** * Interface class for the skin manager. */ class ModelSkinCache : public RegisterableModule { public: /** * Lookup a specific named skin and return the corresponding ModelSkin * object. */ virtual ModelSkin& capture(const std::string& name) = 0; /** * Return the skins associated with the given model. * * @param * The full pathname of the model, as given by the "model" key in the skin * definition. * * @returns * A vector of strings, each identifying the name of a skin which is * associated with the given model. The vector may be empty as a model does * not require any associated skins. */ virtual const StringList& getSkinsForModel(const std::string& model) = 0; /** * Return the complete list of available skins. */ virtual const StringList& getAllSkins() = 0; /** * greebo: Reloads all skins from the definition files. */ virtual void refresh() = 0; }; inline ModelSkinCache& GlobalModelSkinCache() { std::shared_ptr _skinCache( std::static_pointer_cast( module::GlobalModuleRegistry().getModule(MODULE_MODELSKINCACHE) ) ); return *_skinCache; } #endif DarkRadiant-2.0.2/include/precompiled_boost.h000066400000000000000000000010041245424655700212150ustar00rootroot00000000000000/** * greebo: Precompiled header module. This is included by the respective precompiled.h * files throughout the project. Many of those include boost headers into the * pre-compilation, and they do so by #include'ing this file. */ #pragma once #include #include #include #include #include #include #include DarkRadiant-2.0.2/include/precompiled_interfaces.h000066400000000000000000000051031245424655700222160ustar00rootroot00000000000000/** * greebo: Precompiled header module. This is included by the respective precompiled.h * files throughout the project. Many of those include boost headers into the * pre-compilation, and they do so by #include'ing this file. */ #pragma once // Add DarkRadiant interfaces #include "Bounded.h" #include "editable.h" #include "GLProgramAttributes.h" #include "i18n.h" #include "iarchive.h" #include "ibrush.h" #include "icamera.h" #include "icameraview.h" #include "iclipper.h" #include "icommandsystem.h" #include "icounter.h" #include "icurve.h" #include "idatastream.h" #include "idialogmanager.h" #include "ieclass.h" #include "ientity.h" #include "ientityinspector.h" #include "ieventmanager.h" #include "ifilechooser.h" #include "ifilesystem.h" #include "ifiletypes.h" #include "ifilter.h" #include "ifiltermenu.h" #include "ifonts.h" #include "igame.h" #include "igl.h" #include "iglprogram.h" #include "iglrender.h" #include "igrid.h" #include "igroupdialog.h" #include "igroupnode.h" #include "iimage.h" #include "iinteractiveview.h" #include "ilayer.h" #include "ilightnode.h" #include "imainframe.h" #include "imainframelayout.h" #include "imap.h" #include "imapformat.h" //#include "imapcompiler.h" #include "imapresource.h" #include "imd5anim.h" #include "imd5model.h" #include "imenu.h" #include "imodel.h" #include "imodelcache.h" #include "imodelsurface.h" #include "imodule.h" #include "imousetool.h" #include "imousetoolevent.h" #include "imousetoolmanager.h" #include "inameobserver.h" #include "inamespace.h" #include "inode.h" #include "iorthocontextmenu.h" #include "iorthoview.h" #include "iparticlenode.h" #include "iparticles.h" #include "iparticlestage.h" #include "ipatch.h" #include "ipath.h" #include "ipreferencesystem.h" #include "iradiant.h" #include "iregistry.h" #include "irender.h" #include "irenderable.h" #include "irendersystemfactory.h" #include "iscenegraph.h" #include "iscenegraphfactory.h" #include "iscript.h" #include "iselectable.h" #include "iselection.h" #include "iselectionset.h" #include "iselectiontest.h" #include "ishaderexpression.h" #include "ishaders.h" #include "isound.h" #include "ispacepartition.h" #include "itexdef.h" #include "itextstream.h" #include "itraceable.h" #include "itransformable.h" #include "itransformnode.h" #include "iuimanager.h" #include "iundo.h" #include "ivolumetest.h" #include "mapfile.h" #include "modelskin.h" #include "ModResource.h" #include "ShaderLayer.h" #include "StringSerialisable.h" #include "Texture.h" #include "VolumeIntersectionValue.h" #include "warnings.h" // Include registry methods #include "registry/registry.h" DarkRadiant-2.0.2/include/precompiled_main.h000066400000000000000000000012371245424655700210230ustar00rootroot00000000000000/** * greebo: The main precompiled header file, as included by the different * projects and modules. By setting the correct preprocessor definitions * the various precompiled_xxxxx.h files are included in the chain. */ #pragma once #ifdef DR_PRECOMPILED_BOOST // Include common boost headers that don't have link dependencies #include "precompiled_boost.h" #endif #ifdef DR_PRECOMPILED_WXWIDGETS #include #include #endif #ifdef DR_PRECOMPILED_INTERFACES // Add DarkRadiant interfaces #include "precompiled_interfaces.h" #endif #ifdef DR_PRECOMPILED_MATH // Add DarkRadiant interfaces #include "precompiled_interfaces.h" #endif DarkRadiant-2.0.2/include/precompiled_math.h000066400000000000000000000007531245424655700210320ustar00rootroot00000000000000/** * greebo: Precompiled header module. This is included by the respective precompiled.h * files throughout the project. Many of those include boost headers into the * pre-compilation, and they do so by #include'ing this file. */ #pragma once // Include important math headers #include "math/Vector2.h" #include "math/Vector3.h" #include "math/Vector4.h" #include "math/Matrix4.h" #include "math/AABB.h" #include "math/Quaternion.h" #include "math/Frustum.h" #include "math/Plane3.h" DarkRadiant-2.0.2/include/version.h000066400000000000000000000010311245424655700171710ustar00rootroot00000000000000#ifdef HAVE_CONFIG_H #include #define RADIANT_VERSION PACKAGE_VERSION #else #define RADIANT_VERSION "2.0.2" #endif #define RADIANT_APPNAME "DarkRadiant" #define RADIANT_BLANK " " #if defined(_M_X64) || defined(__amd64__) || defined(_WIN64) #define RADIANT_PLATFORM "x64" #else #define RADIANT_PLATFORM "x86" #endif #include inline std::string RADIANT_APPNAME_FULL() { return std::string(RADIANT_APPNAME) + " " + std::string(RADIANT_VERSION) + " " + std::string(RADIANT_PLATFORM) + " "; } DarkRadiant-2.0.2/include/warnings.h000066400000000000000000000020551245424655700173430ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined (INCLUDED_WARNINGS_H) #define INCLUDED_WARNINGS_H #if _MSC_VER > 1000 && defined(WIN32) #pragma warning(disable:4355) // 'this' : used in base member initializer list #pragma warning(disable:4503) // '[symbol]' : decorated name length exceeded, name was truncated #endif #endif DarkRadiant-2.0.2/install-sh000077500000000000000000000324641245424655700157320ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: DarkRadiant-2.0.2/install/000077500000000000000000000000001245424655700153635ustar00rootroot00000000000000DarkRadiant-2.0.2/install/bitmaps/000077500000000000000000000000001245424655700170225ustar00rootroot00000000000000DarkRadiant-2.0.2/install/bitmaps/_black.bmp000066400000000000000000000003661245424655700207420ustar00rootroot00000000000000BM6(  DarkRadiant-2.0.2/install/bitmaps/_cubiclight.bmp000066400000000000000000001400701245424655700220000ustar00rootroot00000000000000BM86(  PPP@@@@@@ppp ``` ``` ``` ``````((((((XXX ```xxx888000ppp PPP PPPPPP PPPxxx888888``` 888888 hhh```(((@@@``` 888XXXPPP PPP((((((PPPPPP```000@@@xxx ```PPP ```@@@xxx @@@ppp XXXPPP000```PPP@@@```HHHhhh000```XXX000@@@000@@@```@@@ ``` XXX```888 (((XXXPPP(((PPP(((000XXXXXX000@@@888 hhh```000000HHH@@@(((ppp@@@xxx```888 ``````xxxxxx000 ```hhhPPPxxx000PPP XXX ``` XXX@@@@@@@@@@@@`````` `````` ``` @@@(((xxx ``` ```PPPxxx@@@@@@@@@888``` ```ppphhh``` PPP ``` ```xxx888XXX```ppp@@@@@@@@@@@@``` ```(((000PPP```hhh``` ``` ``` ```hhh @@@@@@@@@``` ```xxx000 ```hhh ``` ```hhh@@@ @@@PPP(((``` ```pppHHH(((  000HHH000888 ``` ```@@@@@@pppxxx``` HHH``` PPP````````` ```xxx```xxxPPP xxxXXX XXXppp``````xxx(((000xxx000```@@@000(((@@@000``` `````` 888@@@000xxxhhh888@@@ 000@@@888``````@@@@@@@@@@@@@@@```PPP888888@@@000``` ``````PPPhhh 888888@@@@@@PPPPPP```000 HHHHHH@@@@@@pppPPP@@@@@@ppp@@@@@@@@@xxxXXX@@@((( (((HHHxxxxxxHHH 000@@@ PPP@@@@@@pppxxxXXX@@@@@@@@@```@@@000 @@@ppp```@@@@@@@@@@@@@@@```@@@@@@@@@pppHHH((( (((HHHppp``` ``` ppp@@@@@@@@@ppp``` ````````` ```````````````hhh 888DarkRadiant-2.0.2/install/bitmaps/_currentrender.bmp000066400000000000000000001400701245424655700225450ustar00rootroot00000000000000BM86(  ppp````````````hhhppp`````````ppphhh````````````ppp @@@hhhhhh@@@000``````@@@ ppp HHHxxx888888ppp@@@ @@@xxxhhhxxx ```@@@ ppphhh@@@@@@ @@@xxxhhh888@@@@@@@@@ ```@@@ 000@@@@@@000ppp@@@@@@@@@888@@@@@@ @@@xxxhhhPPP000xxx@@@ ```@@@ pppHHHxxx(((000HHHppp(((@@@@@@ @@@PPP((( ```@@@ HHH```000@@@ @@@000PPPHHH```@@@ @@@ ```ppphhh@@@ @@@000PPP ```@@@ @@@ `````` 888@@@ HHH```@@@ @@@ ```hhh @@@ @@@  ```@@@ HHH```  @@@  000888 HHH```xxx pppHHH```(((@@@000000@@@PPP @@@xxx000XXXppp000xxxhhh888```@@@ppp```@@@ HHHppp888```HHHPPPPPP@@@@@@@@@@@@@@@ppp @@@xxx(((PPP xxx```pppppp000 @@@``` @@@ XXXhhh``` PPPhhh@@@xxx@@@888``` @@@ xxxHHH(((  (((HHHxxxhhh ```000  000```PPP(((  000@@@pppHHH  000PPPPPP 888pppHHH@@@000@@@ppp @@@HHH(((``` @@@@@@000 `````` PPP``` 000ppp```hhh```````````````hhh````````````xxxppp``````xxxhhh``````hhhxxx``````hhhPPP@@@pppXXX XXX @@@@@@ ```PPP HHHppp@@@ @@@hhh PPPxxx((( PPP@@@@@@ ```xxx@@@@@@ @@@ppp@@@000000@@@000 000@@@(((@@@@@@ ```xxx(((@@@@@@ @@@@@@ @@@888 @@@000@@@hhh000xxx``` ``````xxx@@@@@@@@@ ```@@@000xxxXXX @@@@@@ @@@ 888xxxHHH @@@@@@ ```(((@@@ @@@ @@@ 888@@@ @@@@@@ ```xxx```@@@ @@@ @@@ @@@@@@ @@@@@@ `````` 888@@@ @@@ @@@ @@@@@@ @@@@@@ ```hhh @@@ @@@ @@@ 000@@@ @@@@@@ ```  @@@ @@@ @@@HHHpppxxxhhh@@@ @@@@@@``````XXX@@@888(((@@@ @@@ @@@xxxhhhxxxPPP @@@ @@@@@@ PPP``````HHHppp``` PPP``````HHH```PPP```hhhHHH@@@ ```PPPPPP @@@PPP  @@@ @@@@@@``````@@@000@@@@@@(((xxx@@@ xxxPPP  PPPPPP @@@ @@@@@@ ``````000@@@000hhh@@@PPP@@@@@@ppp888000PPPPPP 888888 PPPPPP 888```888 ppphhh ppp888 XXX```000@@@xxxPPP 888xxx@@@(((```PPP  PPP @@@ @@@ @@@PPP@@@@@@```DarkRadiant-2.0.2/install/bitmaps/_flat.bmp000066400000000000000000000003661245424655700206140ustar00rootroot00000000000000BM6(  DarkRadiant-2.0.2/install/bitmaps/_fog.bmp000066400000000000000000001400701245424655700204360ustar00rootroot00000000000000BM86(  @@@((((((PPPxxxhhh xxx@@@XXXxxxPPPHHH`````````888 ``````((((((```pppHHH((( @@@hhh``````PPPPPPPPP```XXX(((@@@000XXXXXX```pppxxxPPPxxx```888```hhh`````````hhh```XXX```PPP@@@HHH``````@@@ @@@@@@ ``````@@@ @@@@@@ ```000@@@@@@@@@@@@@@@@@@@@@@@@PPPHHHPPP```pppPPP```hhhpppPPP``` `````` XXXHHHHHH````````````````````````hhh hhhhhh ```hhhXXXhhh```xxx@@@888xxxxxx@@@HHH ```000@@@@@@@@@@@@@@@@@@@@@@@@@@@```@@@@@@```````````````````````````````````````pppDarkRadiant-2.0.2/install/bitmaps/_nofalloff.bmp000066400000000000000000001400701245424655700216310ustar00rootroot00000000000000BM86(  ```````````````hhhxxx``````hhh```@@@ ```((((((```@@@ xxx888(((````````` @@@PPP000ppp @@@@@@ ```@@@ PPPPPP@@@ `````` @@@000hhh @@@@@@ ```@@@ XXX000@@@000XXX@@@ PPP888@@@(((`````` @@@888888@@@(((ppp @@@@@@ ```@@@ xxxppp@@@ ((( xxx888`````` @@@ppp000xxx```000 @@@@@@ ```@@@ hhh``````hhh@@@ 888`````` @@@HHHxxx@@@ @@@@@@ ```@@@ HHHHHH@@@ 888hhh`````` @@@(((000ppphhh @@@@@@ ```@@@ @@@ @@@@@@ ppp@@@@@@XXX````````` @@@ @@@``` @@@@@@ ```@@@ @@@ @@@@@@ XXX`````` @@@ @@@``` @@@@@@ ```@@@ PPPPPP@@@@@@@@@@@@@@@@@@@@@@@@@@@```xxxHHH(((`````` @@@000(((hhhppp @@@@@@ ```xxx888 hhh```XXXhhh@@@@@@xxx```````````` @@@HHHxxx@@@ @@@@@@ ```PPPppp((( `````` @@@@@@```PPPppp@@@hhh``` @@@xxxpppHHH@@@ @@@@@@ ``` PPPhhh hhh@@@````````````````````````ppp@@@ ``` @@@PPP xxxPPP  888hhh  ```000XXX```@@@ @@@hhh``` @@@@@@hhh@@@ ```hhh PPP PPPxxx@@@@@@xxx@@@ ```888  @@@xxx``` @@@ppp000 PPPPPP  888hhh  @@@ ``` @@@ @@@@@@000@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@``` @@@000xxxHHHppp@@@``` @@@```  ppp @@@``` @@@000 PPPppp`````````````````````````````````````````` @@@PPP 888```((( DarkRadiant-2.0.2/install/bitmaps/_pointlight1.bmp000066400000000000000000001400701245424655700221250ustar00rootroot00000000000000BM86(  ```  PPP@@@xxx@@@ (((```XXXxxx888pppHHH````````````ppp@@@ ```PPP 000hhh @@@@@@ @@@XXX@@@```@@@ ```xxx@@@@@@ @@@ppp@@@```@@@ 888``` @@@@@@ @@@888000@@@@@@@@@ppp@@@@@@@@@000@@@@@@@@@@@@@@@ ```XXX000xxxhhh000@@@@@@ @@@ 000```@@@ ```000 @@@@@@ @@@ @@@```@@@ ``` @@@ @@@@@@ @@@ @@@```@@@ ```PPP @@@@@@ @@@ @@@```@@@ ```@@@ @@@@@@ @@@ @@@```@@@ ``` 000 @@@@@@ @@@ @@@```@@@ ```HHHxxx @@@@@@@@@ @@@```@@@ ```ppp```hhh@@@@@@PPPxxx@@@XXX @@@```@@@ ```PPP@@@@@@xxxPPP  PPP```@@@ ```PPP@@@@@@XXX@@@@@@```@@@ hhhpppHHH  888@@@ PPP@@@ PPP(((  888pppPPP  PPPppp@@@@@@@@@000@@@ @@@ @@@```@@@ hhh PPP@@@ @@@hhh @@@ ```@@@@@@ @@@HHH@@@ ```@@@@@@ PPP@@@@@@```ppp``````hhhxxx`````````ppp@@@ hhh``````PPP 888@@@ @@@ @@@ @@@ xxx``````hhhppp``````ppphhh``````xxx@@@@@@xxxxxx@@@@@@xxx`````````@@@@@@xxxxxxxxx`````````@@@@@@(((@@@888888@@@`````````888@@@ @@@PPPPPPPPPHHHPPPPPP`````````hhhXXX@@@ 000((( ````````````@@@ XXXHHHPPP````````````@@@ `````````````````````@@@ `````````````````````@@@ ```@@@HHH````````````@@@ 888000 (((```XXXXXX```@@@(((hhhXXX888```000xxxxxx000``````@@@xxxxxx ```@@@ ppp000 (((``` 000  @@@PPP000(((xxx```xxxPPP 888ppp888000hhh```((((((XXX hhh hhh```(((@@@xxx  ```hhh PPP``````@@@``````@@@ppp@@@@@@@@@xxx`````````pppDarkRadiant-2.0.2/install/bitmaps/_pointlight2.bmp000066400000000000000000001400701245424655700221260ustar00rootroot00000000000000BM86(  ```  PPP@@@xxx@@@ (((```XXXxxx888pppHHH````````````ppp@@@ ```PPP 000hhh @@@@@@ @@@XXX@@@@@@ ```xxx@@@@@@ @@@ppp@@@@@@ 888``` @@@@@@ @@@888000@@@@@@@@@ @@@ ```XXX000xxxhhh000@@@@@@ @@@ 000XXXHHH@@@ ```000 @@@@@@ @@@ @@@hhh(((xxx@@@ ``` @@@ @@@@@@ @@@ @@@xxx000hhh@@@ ```PPP @@@@@@ @@@ @@@PPPhhh@@@ ```@@@ @@@@@@ @@@ @@@XXXPPP@@@ ``` 000 @@@@@@ @@@ @@@hhhXXX@@@ ```HHHxxx @@@@@@@@@ @@@hhhppp@@@ ```ppp```hhh@@@@@@PPPxxx@@@XXX @@@```000@@@ ```PPP@@@@@@xxxPPP  PPP000@@@ ```PPP@@@@@@XXX@@@@@@XXX```@@@ hhhpppHHH  888@@@ PPP@@@ PPP(((  888pppPPP  PPPXXX```@@@ @@@ @@@PPP(((```xxx ppp@@@ hhh PPP@@@ @@@@@@888@@@@@@@@@ @@@ ```@@@@@@ @@@@@@ppp@@@ ```@@@@@@ PPP@@@@@@```hhh000000xxxppp``````hhhxxx`````````ppp@@@ xxx``````HHH``````PPP 888@@@ @@@ @@@ @@@ xxx``````hhhppp``````ppphhh``````xxx@@@@@@xxxxxx@@@@@@xxx`````````@@@@@@xxxxxxxxx`````````@@@@@@(((@@@888888@@@`````````888@@@ @@@PPPPPPPPPHHHPPPPPP`````````hhhXXX@@@ 000((( ````````````@@@ XXXHHHPPP````````````@@@ `````````````````````@@@ `````````````````````@@@ ```@@@HHH````````````@@@ 888000 (((```XXXXXX```@@@(((hhhXXX888```000xxxxxx000``````@@@xxxxxx ```@@@ ppp000 (((``` 000  @@@PPP000(((xxx```xxxPPP 888ppp888000hhh```((((((XXX hhh hhh```(((@@@xxx  ```hhh PPP``````@@@``````@@@ppp@@@@@@@@@xxx`````````pppDarkRadiant-2.0.2/install/bitmaps/_pointlight3.bmp000066400000000000000000001400701245424655700221270ustar00rootroot00000000000000BM86(  ```  PPP@@@xxx@@@ (((```XXXxxx888pppHHH````````````pppppp````````````hhh@@@ ```PPP 000hhh @@@@@@ @@@XXX@@@```000@@@xxx@@@ ```xxx@@@@@@ @@@ppp@@@ hhh@@@ 888``` @@@@@@ @@@888000@@@@@@@@@ 888@@@@@@888@@@ ```XXX000xxxhhh000@@@@@@ @@@ 000 000ppp000PPP@@@ ```000 @@@@@@ @@@ @@@xxx(((@@@ ``` @@@ @@@@@@ @@@ @@@ @@@ ```PPP @@@@@@ @@@ @@@(((@@@ ```@@@ @@@@@@ @@@ @@@000PPP@@@ ``` 000 @@@@@@ @@@ @@@ppp@@@(((  @@@ ```HHHxxx @@@@@@@@@ @@@```@@@@@@ ```ppp```hhh@@@@@@PPPxxx@@@XXX @@@```HHH@@@ ```PPP@@@@@@xxxPPP  PPPxxx``````XXX(((HHH@@@ ```PPP@@@@@@XXX@@@@@@(((xxx@@@ hhhpppHHH  888@@@ PPP@@@ PPP(((  888pppPPP  PPP``````@@@ @@@ @@@hhh(((XXX000```@@@ hhh PPP@@@ @@@```000@@@@@@@@@ @@@ ```@@@@@@ @@@```XXX@@@ ```@@@@@@ PPP@@@@@@```xxx@@@ hhhppp``````hhhxxx`````````ppp@@@ xxx``````HHH``````xxxPPP 888@@@ @@@ @@@ @@@ xxx``````hhhppp``````ppphhh``````xxx@@@@@@xxxxxx@@@@@@xxx`````````@@@@@@xxxxxxxxx`````````@@@@@@(((@@@888888@@@`````````888@@@ @@@PPPPPPPPPHHHPPPPPP`````````hhhXXX@@@ 000((( ````````````@@@ XXXHHHPPP````````````@@@ `````````````````````@@@ `````````````````````@@@ ```@@@HHH````````````@@@ 888000 (((```XXXXXX```@@@(((hhhXXX888```000xxxxxx000``````@@@xxxxxx ```@@@ ppp000 (((``` 000  @@@PPP000(((xxx```xxxPPP 888ppp888000hhh```((((((XXX hhh hhh```(((@@@xxx  ```hhh PPP``````@@@``````@@@ppp@@@@@@@@@xxx`````````pppDarkRadiant-2.0.2/install/bitmaps/_quadratic.bmp000066400000000000000000001400701245424655700216400ustar00rootroot00000000000000BM86(  PPP@@@@@@ppp ``` ``` ``` ``````((((((XXX ```xxx888000ppp PPP PPPPPP PPPxxx888888``` 888888 hhh```(((@@@``` 888XXXPPP PPP((((((PPPPPP```000@@@xxx ```PPP ```@@@xxx @@@ppp XXXPPP000```PPP@@@```HHHhhh000```XXX000@@@000@@@```@@@ ``` XXX```888 (((XXXPPP(((PPP(((000XXXXXX000@@@888 hhh```000000HHH@@@(((ppp@@@xxx```888 ``````xxxxxx000 ```hhhPPPxxx000PPP XXX ``` XXX@@@@@@@@@@@@`````` `````` ``` @@@(((xxx ``` ```PPPxxx@@@@@@@@@888``` ```ppphhh``` PPP ``` ```xxx888XXX```ppp@@@@@@@@@@@@``` ```(((000PPP```hhh``` ``` ``` ```hhh @@@@@@@@@``` ```xxx000 ```hhh ``` ```hhh@@@ @@@PPP(((``` ```pppHHH(((  000HHH000888 ``` ```@@@@@@pppxxx``` HHH``` PPP````````` ```xxx```xxxPPP xxxXXX XXXppp``````xxx(((000xxx000```@@@000(((@@@000``` `````` 888@@@000xxxhhh888@@@ 000@@@888``````@@@@@@@@@@@@@@@```PPP888888@@@000``` ``````PPPhhh 888888@@@@@@PPPPPP```000 HHHHHH@@@@@@pppPPP@@@@@@ppp@@@@@@@@@xxxXXX@@@((( (((HHHxxxxxxHHH 000@@@ PPP@@@@@@pppxxxXXX@@@@@@@@@```@@@000 @@@ppp```@@@@@@@@@@@@@@@```@@@@@@@@@pppHHH((( (((HHHppp``` ``` ppp@@@@@@@@@ppp``` ````````` ```````````````hhh 888DarkRadiant-2.0.2/install/bitmaps/_scratch.bmp000066400000000000000000001400701245424655700213120ustar00rootroot00000000000000BM86(  hhh``````hhh`````````hhh``````xxx``````hhhhhh``````pppppp@@@(((```HHHHHHxxx```@@@(((``` @@@hhh PPPhhh000000``` @@@``` PPPxxx@@@```000@@@ppp@@@PPP @@@``` @@@XXX```PPP ```000@@@000@@@```XXX888@@@(((@@@@@@ @@@000@@@XXX(((@@@888 @@@``` ```@@@PPP000```@@@```@@@xxxxxx@@@@@@ hhhppp888 @@@```xxx@@@((( ```@@@ @@@ @@@`````` @@@```hhhPPP@@@ PPPHHH```HHH``` @@@ @@@@@@ @@@```xxx000``````ppp888@@@XXX```@@@ @@@@@@ @@@```xxxPPP``````hhh@@@ @@@@@@ @@@```HHH888PPP```@@@```xxxPPP(((@@@ @@@HHH @@@ppp``` 000xxxxxxppp```XXXxxx``````HHH @@@pppPPP``` @@@```hhh888 xxx@@@```pppppp@@@@@@``` PPP``````HHH```pppHHHhhhHHH``` @@@ HHHXXX @@@ppp(((```888@@@@@@ 888 @@@```@@@``` PPP  PPPhhh  000PPP888@@@```888@@@```hhh@@@@@@hhh pppppp888 888hhhppp000000XXXhhh ppp888 XXXppp888  888pppPPP  PPPxxxPPP  HHHxxx @@@```000000xxx @@@ @@@ @@@ @@@ @@@ @@@PPP@@@@@@``` @@@ @@@DarkRadiant-2.0.2/install/bitmaps/_spotlight.bmp000066400000000000000000001400701245424655700217000ustar00rootroot00000000000000BM86(  ```000  888ppp@@@PPP@@@ ``````HHHhhhppp(((xxx`````````xxx``````````````````hhh``````xxxxxx``````ppp```000@@@(((000ppp```((((((hhh@@@000`````` ```XXX000 000PPPxxx ```@@@@@@hhh hhhxxxhhhPPPPPP@@@ `````` ```xxx```@@@@@@xxx```(((HHH```XXX888@@@(((@@@@@@ ppp```(((@@@(((hhh@@@888 ``` hhh ``````@@@@@@PPP(((@@@(((```888xxx888 xxx```000 ppphhh ```xxx``` ```PPP000ppppppPPP```@@@@@@000000((( @@@pppXXXPPPxxx``` ``` ``` ```@@@@@@ XXXxxx```@@@((((((ppp```````````` ``` ```PPP ```@@@@@@ ```hhh(((hhh```HHH`````` ``` `````` ```@@@@@@ ```hhh000ppp```HHH`````` ``` `````` ```@@@@@@ ```(((@@@XXXpppxxx``````xxxxxx`````` ``` ```HHH ```@@@@@@ ```888PPPxxxxxxPPPHHHxxx``` ``` ```((( ```@@@@@@ppp ``` 888XXX```XXXhhh (((```XXX000``` ``` ``````000xxxppp```@@@000ppp000 ```@@@@@@@@@000``` ```ppp ppp888 888``` ```000 ```@@@ @@@hhh  hhh000```@@@hhhhhh ``` ```000```@@@xxx`````````(((000XXX xxxHHH(((```xxx@@@@@@xxx888 888```888 hhh```(((000000 hhh@@@@@@```000@@@xxxhhh  hhh``` ```@@@@@@ `````` ``` PPP@@@@@@ `````` ```@@@@@@@@@ ```ppp@@@@@@PPP```@@@@@@@@@PPP@@@@@@pppxxx``````````````````ppp@@@@@@DarkRadiant-2.0.2/install/bitmaps/_white.bmp000066400000000000000000000003701245424655700210010ustar00rootroot00000000000000BM6(  DarkRadiant-2.0.2/install/bitmaps/active_layer_invisible.png000066400000000000000000000004571245424655700242510ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME"IDAT8˥ 0 E_"HGHGt8pˉ ]+0KGH/FJ#HɑgE8j\Uޣ3܄s`ɻ[TZr+50GhC%3p+% w`8^LBTis!o`3d)l `.@]/ <ġEk$Qs2="0abJIENDB`DarkRadiant-2.0.2/install/bitmaps/active_layer_visible.png000066400000000000000000000004171245424655700237160ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIMExIDAT8˵k ? XZja-B+гr !@{͑lvfeTBqDn/@=)3.Xd )ȃЪ 1v.t:ɳh|yMJ !(PUmޮ qXm%IENDB`DarkRadiant-2.0.2/install/bitmaps/arrow_down.png000066400000000000000000000003161245424655700217110ustar00rootroot00000000000000PNG  IHDR 2dbKGD pHYs  tIMEԖ[IDATu1 @Ri/ba7Ha^ 㲰H;_' KၵO(0[ acXI |?g9I IENDB`DarkRadiant-2.0.2/install/bitmaps/arrow_e24.png000066400000000000000000000004141245424655700213330ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIMEԖIDAT8˽ӱ @ /! P :6`:%J -- :KA@K'KOoٗ:fأ@Y<jHi;LpyQ|Ũ-c^©ѡ+1Hp֛G :OPaX }WCz{ʽq,'~;NfVIENDB`DarkRadiant-2.0.2/install/bitmaps/arrow_left.png000066400000000000000000000003121245424655700216700ustar00rootroot00000000000000PNG  IHDR \RbKGD pHYs  tIME! RWIDATӍ1@_Ј 7(@rĖ;[%O2 qq- )x)oPay(14WF9MnIENDB`DarkRadiant-2.0.2/install/bitmaps/arrow_n24.png000066400000000000000000000004231245424655700213440ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME {bIDAT8ݓ10 EQE8A9G3p^}TVK`?'q$;wIe5"ޕ" {H N<{H $Lfvv%1Ou7O4fcC4MPm Wh|)*snIENDB`DarkRadiant-2.0.2/install/bitmaps/arrow_ne24.png000066400000000000000000000005511245424655700215130ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME;nqIDAT8˥ӻJA_6[,-eltB| "ocgᥰP+? ,agWt`7L'"gtjC_1e \^t97.XEpant7Y@ <ʊ[㥦3=FmE]>IENDB`DarkRadiant-2.0.2/install/bitmaps/arrow_s24.png000066400000000000000000000004371245424655700213560ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME:^IDAT8ݓ1 1E߈{ maiI @x A$K ɶ~$o$̌Dg`xw$#W8+^Ь?w?/$AnB] cư\%r$c ||+ vlV]a5IENDB`DarkRadiant-2.0.2/install/bitmaps/arrow_se24.png000066400000000000000000000005551245424655700215240ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME9{]IDAT8ˍ=/DA]ZB"^*Ukjj&tDSSKu43ɵ>d3 MЩX?Va.頬S|#RCQQN,Rq!.0[*kU_8OŻxN{'U}lM2R>6mu yjIENDB`DarkRadiant-2.0.2/install/bitmaps/arrow_sw24.png000066400000000000000000000005641245424655700215460ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIMÈOIDAT8˥һJCA/' AkAATVym쭵-_F@ CXN897lf5Ԭ%W7Լ9>qP`*#lH8qxgs}^FN8>`O1E͉خZX.XhK<?fť MƗ媇K܎;s4,7xdx0vЊ6q3ՔFc`.R3D %z+8IENDB`DarkRadiant-2.0.2/install/bitmaps/arrow_up.png000066400000000000000000000003171245424655700213670ustar00rootroot00000000000000PNG  IHDR 2dbKGD pHYs  tIMÈO\IDATu!PjMoQL&=' 1@^`Y;f%Qq7&=Wq^uX_<\ˉ/Ƀ\9I(IENDB`DarkRadiant-2.0.2/install/bitmaps/arrow_w24.png000066400000000000000000000003751245424655700213630ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME9{]IDAT8˵!` oc<'(8I8'@X,CYҍ&5m{IkQ3΀+f&ܛ*b7X`W(+hPgV s#q t,6?SB[7OIENDB`DarkRadiant-2.0.2/install/bitmaps/axes.png000066400000000000000000000003021245424655700204630ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME8 ?OIDAT8; ! BB6m!_&%JJ8%HW . s4g D``l`PfyIENDB`DarkRadiant-2.0.2/install/bitmaps/bgimage16.png000066400000000000000000000004041245424655700212700ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME2IDAT8˥ D8r%+W2$4gQ p !ܽ|JB YDo;Lx0X⫿ۡǚ s䆣o _Ϙ2ڎX 4sJ>җ1vHW+A;(&֎ r:L|EIENDB`DarkRadiant-2.0.2/install/bitmaps/black.bmp000066400000000000000000000003701245424655700205760ustar00rootroot00000000000000BM6(  DarkRadiant-2.0.2/install/bitmaps/book.png000066400000000000000000000014111245424655700204570ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME#.IDAT8˥Md{:s'sq0 !%Dmp&Dj'-\$N(R @[Ce AVQ$ fJIg}紸es=bfNsj+ѵc9lst+% CB1j`x(/!"h! X,k-d4&$gn7{|=GV5(/WHFN=0aLLLz.Án#aDM!OsˣzYF!I$IdY<^033ӤJHzH&j. 6(v1==N RU Nj䓗":;;Ԅ94]2rδ:bgoD"faaa4MCєRp":::~)˲~cvv ÀM&wCΖ/F3YAe&=mt>՚B B P$bSUUahhX +++8 9 tD"Qtf2qCeP`lP7N166lnnd7(,L&Sc6*++_Fk9Ze:B B@Bv;]h=?O*@Ų[AP.|8>>(l.+xMB888ѧ) TmmWOD"P(=yR-NU !0L8{yخT,D"*AlllFd2|>ↆbuu?~QnmmQ%lr#P;|nH1p}}MmmmІ$9O8IENDB`DarkRadiant-2.0.2/install/bitmaps/cap_cylinder.png000066400000000000000000000023761245424655700221740ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs(K(KV{ftIMETIDATXýWoHg~rsis/m2P#2KvH"B1밸ZR(>Ba⧲X#'66FE bM̢&w3KV C{} ǻΛs555f8H$4")J➓9NYЀ, qBE|>nw<|[㸛}}}qOdY&db1J+X,FDQ$,rƍdi555MNNNUU $iq*!/ŋmE`@<XhqqcۥK} t:ݡ3 X,Ǐ?H@(700i0]hă2 يb;m= rmnn~]EQ,2́Z2N\.Nka;^ok׮=88ضg~驐$ uIzF###Ohvpӧ!IҞݒVqzS/Eܾ};F !d٭&"@DQ܊dlB{jZPpfq:%uuu(**0o i&A<G xX ~kXhvXֳfd2EQD"D6x 3lv@p7E~`֧͘IENDB`DarkRadiant-2.0.2/install/bitmaps/cap_endcap.png000066400000000000000000000017301245424655700216060ustar00rootroot00000000000000PNG  IHDR ½"bKGD pHYs(K(KV{ftIME4PseIDATHŕOH#Wǿy ILĄYMARphZnBm/,C/RS걊VE,%R5z% LH%dljq}; w{{{G.BI$OOOO<>>~lƯ6{~ُ݁@$80PTfqvvvvv~<99tP(L&4KR,Ld2RK,ɰ|>...t: 4whh#rX,EGGGX^^~|xxu<333?]כOE,--omm='QO@y{{͆|>Ԕc 6 077{Q|sppiuR\^^brrxI$OT~YoRۍ:jEUT 3rppE p<ϿL|hazU²,ѫGR Ba@ BwZ_ `kF@\FOO B|YJRJLVK(nUUNr EQ ˲k Ȳ #.MA*ntUUeՊvnB0͐$I%Rl69c PJnK'@(v"E|CX37yڹX,@P(Wdȼ٫jocX_fAGSIENDB`DarkRadiant-2.0.2/install/bitmaps/cap_ibevel.png000066400000000000000000000016001245424655700216160ustar00rootroot00000000000000PNG  IHDR ꂣAbKGD pHYs(K(KV{ftIME틽 IDATHŗMKkG5!ƀ QKᮥ5PbW] *mpQ~FXpzc<'1^ z,f6; P mۖ{FCDDឿD)Zy^-B4F**r?߁ ?J¿ADZzZS*H&qY2Mm9@u"LLL>8۬7NNN~o_'w022r&"%HDX,id>lVJr9`0x^BPFlۖ rxx()BA,˒E_><BPҲ,d2b۶lnnJ89NZ%lVL|`ttTNOON;gxJJ),ˢZ,LMM}y{{5όXZJ)F^B (`aa/ox<POW|>ToyJ=hF|>?(Y^^fmm+gm3==| 8NiDyJPP766.5" ~ﭮ.q4MreE"I!3b JD:YEDDJ߫1w@|;66mT׉hnnx<^-r Ày0 iBu4M.wrE; ۶׳z6}43334::!t]i<Z ,4M1Z;0* 㟔Wo,Z>(Z,:җbFd2)?^[[l```P(햄% Id2\|144n}o9tvvbzz%K>̕RGG ~F$ i"N`z$a!H-q]` c~~1 KKK3B`ߴN*2t].+XL&KfOVU?(R_\\4MC&YE@lmm|rrEQWUUFV-(۶d2 B˛%"8 cLl6@P۵,KẮGGG;|>Zr^.GA \\\Ţ̫,ifRx-i.Eey[){ph92\@S4>-9ܣQ/O.FqIENDB`DarkRadiant-2.0.2/install/bitmaps/check.png000066400000000000000000000005071245424655700206070ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME4PsIDAT8˥;JCQjӈ X,@TW*nmXfZi%X7,f܇jǩ"Vz0DZܕ\&8pշfE}R>v!$>fp{kZ_a\b3peF8+zE# P>M勬op#"'4~I`74ϠoiA䳮nV 4E a3pPq]}Z{ׅS L]Z5Jn^+ +FzdoYIENDB`DarkRadiant-2.0.2/install/bitmaps/cmenu_add_model.png000066400000000000000000000003601245424655700226260ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME+}IDAT8˵ D ۰k8^ "R\.RgԐ[!MUF{\3-d-*t0"^A:p  Jxؠ Zp>$wb6%u uIENDB`DarkRadiant-2.0.2/install/bitmaps/cmenu_add_prefab.png000066400000000000000000000004571245424655700227740ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME+IDAT8˝@DlB$5F00f>;vI%X&MTKz>K0£7CQc']XҠ$\4QKڽ3IdQu:?іC(i+IENDB`DarkRadiant-2.0.2/install/bitmaps/cmenu_merge_entities.png000066400000000000000000000003731245424655700237250ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME1u:oIDAT8˥A 0 D߈Ǜ~Qb"m$#X `7I xf>.7@V ` u];;uKn߳LjxDĨq¢]ČF";g3ev~o|7ipAIENDB`DarkRadiant-2.0.2/install/bitmaps/cmenu_revert_worldspawn.png000066400000000000000000000004301245424655700245030ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME$IDAT8˥ EQ$1'؆F4A7Iy2ՋHbk\|SD$MuY5(Զ`̀J3pFrQE$uN"S8}ӕ:PfyW FZ,_8LˈAKb`V b`IENDB`DarkRadiant-2.0.2/install/bitmaps/compile.png000066400000000000000000000003771245424655700211670ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME$iTXtCommentCreated with GIMPd.ecIDAT8R @ sNLCy df/BCttȑ1-2aOϵ@tHZ[")nLi7RL.ujqfGJ WGIENDB`DarkRadiant-2.0.2/install/bitmaps/create_decals.png000066400000000000000000000006431245424655700223110ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME1u:o0IDAT8ˍNPm*Q $@TN`x ay҇Ԃ@@ fvn{EDm bbD]\,D#5>sNBM4v|\c4%H4Yy2l5AgX9UpGp լS*VpP`^)Q$zTUE̠/;la?/pЮvDk}XEK#|R$;)m@^]J _1klep)AIENDB`DarkRadiant-2.0.2/install/bitmaps/curve_append_point.png000066400000000000000000000006341245424655700234170ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs+tIME0=)IDAT(ϕKBas\","Z+Z#"ScJ\MZ$ZTr3;{>s i8n$]3ܭփ_0^ai;4!TIlb-٨e7B`? CIP= #}~_6@R x€KqAdc&6!a$iWR&AduI;^-I?ʒ%Kv?_vs*y4p46;8q&Hnh>ǿ)nIENDB`DarkRadiant-2.0.2/install/bitmaps/curve_cap.png000066400000000000000000000004041245424655700214750ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIME0=IDAT(ϥ ! Ce3ͲSN1pRebIU@rIJ,Zw8@a  ePU%:/vNk b>/RpsyfANV0\'0}ceKG3IENDB`DarkRadiant-2.0.2/install/bitmaps/curve_convert.png000066400000000000000000000006611245424655700224170ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs+tIME/5 >IDAT(ϕ1KA=,AF?RH,Dl,wF+;BS[$hu@cnXݙvfoƙv3.3y/G%]=:V>4 9Q+8zpfݜb$@rΪy>JZu9L}g 2̌y+@?'i!苄G($=2u9 8I.qwa6 L%ԁ`8*kiचWi`?^6g7ɀIENDB`DarkRadiant-2.0.2/install/bitmaps/curve_create.png000066400000000000000000000010321245424655700221730ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs+tIMESIDAT(ϕkQsX>"!E[' ]AtTZ˛Ժ-.Nš*!R3DژZIKX3s99/ytx Jz˵@NRcy  ] {w3|m?ӉF_`X4=$MI:ڑ@[ತoDy59IWG@Ls ͿsO_ µgϿԖJA\ˡ^=c&(o3C)^/0 FNwHJ%| WXHOOơ&ǡ++=r:xk3Y]`ԕsnW8Ӿjh6jyO5=D` (^{eiIy)V0 IENDB`DarkRadiant-2.0.2/install/bitmaps/curve_insert_points.png000066400000000000000000000006271245424655700236410ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs+tIME[ǖ$IDAT(ϝ-HCaoww""eڬ. VMULങDi &EqIM7]ƼIqfY8tJB"OI\ fHc<uA~9`sIzF"#?mm`Z/|\a.b}X{ ׁh5kfͲm5`;`E㿀h.KC۳>-YL9\&[./ak/G XH1$-q<$рIENDB`DarkRadiant-2.0.2/install/bitmaps/curve_remove_points.png000066400000000000000000000006441245424655700236310ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs+tIME/5 1IDAT(ϝJQIL6 ""*&O X B [[ w(+ VbB ;?nd!.30p9\13Tu8jzƀz3T/$'oGafH*K#"R' NUwЮmUk )YCJif=9qKvMFw}"nDU>s,lS@ UQy $d\i,P/!9A`I8U2x$92Ol:2<@Gd |i.aIENDB`DarkRadiant-2.0.2/install/bitmaps/darkradiant_icon_64x64.png000066400000000000000000000065421245424655700237060ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME&:6t IDATx]]uk}`͇11`CP$K(EMQ6RFR_>TU#*JڧJDBQP)-=3w~0DHWgZk3|8> 3f0` 3f!<|ޫC6|}u^D9/9Qq5O_Y fp~n+ !Nć(,mx((?oO=̃7yO<sWNYBD#{}q OpkHF#i40LMAY04&:l!Q"}0\ q6iEțwjmQd:?x& AvJR+ Imw\FZ-c<8}O<@{sP:s*#3PzO =}bi8rXNg=:v 8}~?E4isn 'QQeȣ"G3 5C +{iknO3},o:=-8[vˌ˶U3)UG@'_KV\ hKb4C"RAApno{r^:,A R:3'Ó?_ݠVk߮V-)J2{[ٵ̈!?TD}f$U|9Lu& m* 1Eqzi[m}&D>I bRd"}?^}k1ho6ќU& 0VeϛrSS= U Y=7+#UU*aF< _%5VflV؛V z2ʒ2hF *L,.rv88sf˵ߑ pr觴 ."ksEUb!5nu̡`"52IUIfwǒYX,n Vkek՜rZ+90cqy~ɱ蜛]щm`^Uތ foXؾw޽קR3w5*aTo~(]ųl& |%UfM6KιBݑ=Ŧ&SK++Tuf$zU̞^oBM6SWŽ܋h"2qJd[gNꆲ,s`Si 8'mՕZ=N /uyZE]a;;+ucG.wdʾk#27Uh*=y~ڵh4"X79FrcB5ὣi!N&=ΪH)fX6)n6ĘHQĪqB'?J#WfLXDύFO3^dR4=>vO+,':_"㊪x_[?5 V 07ဢEם/P3N =u(Vb9RҺ!}=<'y㍷ ;5'>y/o3[an^kk5q "XYgΪg.ŇO)7L>--i7^0wn I=jT*8Tejo~hfKFh/px"Oi-*׫ Cf.?3f0` 3f0v/p¼0rIENDB`DarkRadiant-2.0.2/install/bitmaps/darksplash.png000066400000000000000000004507111245424655700216740ustar00rootroot00000000000000PNG  IHDR|@_bKGD pHYs  tIME\ IDATxkeuޯq1$0I(0ڱ.EN**Wq\T/+TE˱XITIA!E"yApf0;3y^Gwsn{(%t%1ݫk5Lʕ+yYrIc9c9X*XX_XX_XX_XXwa3˱˱G`,i]KZr󷜿%-s9c9c92 9c9cc9c9cc9c9cc9c9cc9c9cc9c9cc9c9d,+mc9c9e޲Ro9[y?wy'DH{ηy>RȀ,R%V$IxpEVt:mY舃=iJ$tkt]Z6hpp>tb& B0@Ȁ(it+V;+$Iֆt<=ܻ.h_ah2 NShL:0|RHH B$ۧ,KVz] @"@ƣ1Q_]'318t:ZQ# cFU*)1V<"K!* ךּ@ 8Sʲ /r*BRdLQhS a9ѐ^) |Zkʢ, 6@F s8se8ۀO)aD d4e<y^`4nNwF $BJ8! #JcPٴZWj-a_! zIiyUREc!NS&h2("'NZRT%9)Uh@J <;!*V 1hS}t-(h0IID)1`th8"uJ88:d:lVH 0F CDI H 1EPɞ1@Fj|N2"CjtdY>_b<1גB`(JERRڽl Xa(0 I')Z)(mJTV 4LoHTJ™? D)JTQFB7n$5<52303:V H)eQT=R:f2  D D):j)NF <))P`BmZLo~ܹRCpg=6Ri"GjK+,+=#%I(J&a$*Ā2]+Lq1Z48cˀ ASiU9cB0OPENj9$g5Zf&?4Nj:Nlpt2tݽN9_&;l)M4WOha|>VS]R!PKŹBqԴ!Z@rp<=-47ޑ2)@ XJRɃ${F(M_Æ1qp GT< C!h+BSD@l~m[ٟWvs3@|~6wsi0D)h+}iSh7f(M >lf9s!™SiimgO*o3IL20ν# 2NJbg~J<¹w`1P ?S(iLxF grg5se(fW{+ә _W:ؿOb.|wBeB*PW 7s>kj +߅)w0 f._+ڙҹq8L,cQg e,(~ߗy5~VkCQj4a 9cZh+0JJ!BIn=ީXLv6LRg£sP+m}gb0SyZ*Ù|'P9rc2>͢c M$ưHU&J $G"6QόL;]#){Wb;3:޻ZwE! a5'*]#lNg2soWJv%i#U{Ӝ fgJjA ٴS o/%kx Yq)p/M'(eI'c|\Dy+\FO] l\ǻWeˣ wel`_FaSڋt/qE12fO~'S ֲSwyިjQ3,n-O|^˹锣aWA!a DKg<|47Y h3߈ʁZ Cr]6vcޫ|Yt^PD36i4g~;\߹n7_y8C& br, Yqi(3QdR:B${IgcNzuaz={]z\>t"=7pySl> 76_ۄ6sg8<8YT|3@㥔zPd< _Sx)񌵓fy!~HX&c~g9q*J5f~<҃6nA9#p}&<ȱ6#/:v=Ush^ 1=Vxr{Q5ah%`YL'O0 ^]>oNo $oTT͆[[[p>KaH.*X<`=c<胣f*ox؝B#牼$r"s9ҁ $!v-vOit=@ dUn4!6s-kr^9 tjBFLLqUg]fE1Rg-0jzQyA(A>u!N[x_YÚc* OQ=PJDU;yɕ,r.; o;b'qc^}X+G}U7!+İ{BG) u,5s%Eօ^ǨI/)(MOUwK&i<Q>U~u\6]եj)g>\dzACn 6' O1JOA lHc#) c(FY4!~U݆Fi~sw4n["TyI͋)0& P}BP2XCd]UTd((Ak6 Eun:FQ#yfw_G§g*ʣ%V'k ge($BLôTLP|Y(=B;[SQ :Ps ZW]WdhsjÀV#qjS[($ I0En^ELҜ,/0ʜ`#5y Q £eN&)4#ˋ? ?IB_kz^.GY97aXWcͅH"dAӤьVΕکB-gjMLȼ$I£^t2{NQt%Fqu!';(VF 7}ӏ=bt8H3r.e !\fBi6I, qJne(y72bCZm{V :g"#)+$/T协R"TD$hwm<Ʃ>k<̕z>#[č8 p m-[G+jyHhŃ]Ҭ\j~T (KIޮP.r>3M@^#\#G R`y,͙RFG#&GcGc=i%6vóԁ6A QCJv* mH] IDATٌIt" l dh`opohNsQ1?Xi;էޣm!26갍iVPRGȥ.\vr< ['Ѱ][;էڥѮ6zi=Yh_N&#`D>NIHxTϒ-!fs4bZ+m6OoPLvؓ(*o]x R%++mO;M8@Ӝ`Bz0d?i06PxIQ([ 0ϼ ήKG!9^y7_#vOwH1EHv8䪒a%#X6V&;+m6NYY4a` Fr@kIy&YrdXMOU^fs_!hYYt/@&ikj`7?h܅<"f4 Rq8JSi;LؽwŎ~KnáC/rH+ |h9swD<)r9xpp)"/̫V]<96lKIG$f«҉#ֺM)i^VZ SIF$*7ig#@(;9sU4wH`䣗ΓZ0@@R)J)5hD)1qDi'1}cfqv{)oq4L ]4G)yZUckcB xɲ>9²$FŻix<%#Y;7L6j3ΰ'A`D^46 i\Xg&[DR^;҈#z&GÔ,/x6 ̡.0/,II7Z z8M8MpՍw Q 2LcՁ+Qn#tIVn6'Q &6sGT̟V ]&+&Ôi^𸝧{ rx~йv(%q41I7wHgn=6Qdl_d ! Vjӫ/%6{:=wso~_D6 ~XO˗ӯ@ϰ_h$*FqwF{xO\}C=JEJcty"84QF^m;/\ GYu͒łߤ #V7WxF?u"' ֆ\߉M~C҆^;7%{]Jg=NI!GcI OUpH~~] {Ӝ( Gne,)`Q`7W._U18fjZ,h&ܾ`8a05 g6u5Fx[5,:'n48;;YƝ;U ãCT6f뛛DIrrxIŊ+_Y~o)qyeL*,a޹͝oǭoCέk~U$kB۪x)OiBO-D4z6g+Ca,VpW=xTQӜQ-$e V،P?68cRQdi ']'~4{ 6h邱A~v_x>װZ3 Ҍ(=y(mh:aJ҈Qb)jE]"H( N|Ы۷ _}:ԧ&1"<؈S9[idQb3wR& zʳ{=+mvs9r.ԍK-:+(Ľ4#-e48yҕ1H"f/;*mvUsLm g͕PRq!|v_NlB%oQ2=8b2p;@FAe{U(].׼p Q-J3uc_&Kg``2dY^) L݂1N6׋1N1?}yAi[S(QJ>ւzCmV<1qHض Cn#y[!a@Wk]:k]~z?yZgz;u IJ9c1rQRi_&۟-Ҽ?}*Omc @J "E_ ˌi7X2(էb!{UTzocNAXyqW)bG6zSD:v[+D, (41aZ N_:Ǔ[s+o\'nllwZ ]Ocë'qg>UJUJ7zu]]֋0v~+k`7@@5bڽk]6V΍yS:mUL}:qXt*N;DWLM-GS! sYQ8qx0b4+t2e2UilcgmtQReu}D8wѓ_x>7j2nwIw(i >㔧hMh' lNbr.]|?p5HV8t~*JIEocUJk8>v+O_~n;qv|< J1Ms"(gSZTbf~}Vm,_پŭuJE6)A%Mh |{yck_$66V^QNጛ^Kx72Ah/\H,%2ͪ6Ocv댬ڍCnUqzuر4z"}5[6uI &JҌPsOٕYzau`SPUŮQJEQUe6>\Ġj $€( bۑAu-6VX;B5]>Jv~ًܼǽ߻c[뤓)e^!LQEUx[k(QxBj#N2aN6%cU YV0 FyWد\Kaofr3KCi$0S]c꬧(X JzY|^'VB'ȲfHBNSxlj:d xp:pḦ́ߡ{zfog{WtbW^|u&j2(R֩mfV^T-esQB` Li1H)mbh$"j ܄{]??TRƘR+MK)PUel_\#w5K_}5{g'g8h8a.No׬_}?s]c2|s (eND46Y㚍PIajr9u:̈́^#*}dkal Q%à֠4[ FL꺪55&!ј9U%i'~#4B԰ \C2x1SIƣOSg)z}&)w)ӌw߿J!R s?@g_||.MV2l&tzmFqH63~zRgtn;v4i^p"ޏ̜vp m$ьk\:UʹǷf+a4Ms(*/f}BqD(Њ∿]kqo%l[LsLSNs 2e8'GO{4/w>'lۂY$Gކ'4À! ˎ[ xlCZis?OQY]a&  ";M0ϕȭ;{˯͟>7߹h8KrZ%ZTKDqTU{{4nĄIDDD)M:S<礙qD?w4|I.++mL aHQfUNHn^3Q@Z?ܣ{D0D#Q'd~ 7^8TB Q%vÀm~6k3 8/i^?._8ù<cp** Mr?8.4G{|yJހs>B)aǾb?Y #x Vϟ-4;P 0q0e2ppxDF^[C C ivZܼsUp?q!*?&y#wFiMV*&)۷՗_/Z%a Ќ#~E~E4{Q8ck*+owz<&_{U$Kyt}k|+$+mT80磊(wѴʻwxEά+`wW?ć.Lt*Ŵ(U~//]EX7yo׶o_x9b[LsvKtusFhM^*F)/>}{Woׯ}⧟{iĮ/_/B^} Dժ  F+K >ޠGgxi:Qȝw9O?d0Y.3g*aEQ+wdGÔ'/ g{ހm{!Ax>U;hNaل^nRͿ_>‡uDPq"ΝU * M&i3V, ¬ft6O<8::1YY2 鯵P|cTU~Q'/yb!8xxJ^yQ|֌I-K0gԳhw*!bJEL\~|+o۷7y|ҹ 6 m7 L@j(JQj_ qE-/ €s=/~-/ /'>LvK/q;b.f:pZ%Ϯ?׷oa?s=QU> 8:Ӭf!Q=tT9v=_|"2>&B<|y)?!Q*6%kdR28qַjV-mBDzg֔yA:J~YZ6ZW4?y@"Qހ(abJG#Ο^Z5*Dk&!;H{tCD!%&?QAkm(^S U;k2Yx֮΂3N4lw#6yY i:$]q:B>o<ψ& ,MȊo}εWxɋ\~0 {@1Ul4UsQŠbڥ60SX^|00`|8Œf Y0ϖ]yos=wF7FP8( DR,r"l)'X\q$qC*NTJURv9q%$v {\C>}.Ywn ݷ=z>>PƲn:/F|VX#7˜ob W C*n[4u,kq22+ik/۬[LF|I AS.XX^vWUT%3VLf&:6AM^I/AVcGQ޼dPj-~*qzkC-u, %⧝$b[ >4V2|R5 Bkk-YԬ/gC3  M2-A=u4=M9N~ zg CYs{uK^丑(xXa%Mx&XD\iף5BK|F6[p 9+RFv1imz.ruikF=n|֘rRLcHOȧh#GwwڶZdyF9[D"M6 l$Hb7A'A5Ѵ=j , {d`%$O;#/X}ۼowp}`ǔma( =f0(q7yϣ֭66b<խm7.["hJyhƀ~1mqI)mOSw.֜MNKTY2[6+?oicPFJtUðXJYd c?@w=뺣[?m 1T y9O|E)n}#Jo\>Ȋ"G.pi'GCX s 8^z8+h،;A:`.;z6 dи1B=A5c.lWc?y 2OvΫņX:vMH>4ȳq8Z v+&ۭs SwaU~S;/hiۢz,x`!IJf|_ꟈñB(yeO_␃ޥ6lItAaؖZfRhxGq}KRXcQYKZq}?9_z_<#[!~䇟i^{uOȬb?aq~~3(U:eoYsw>ɵAsQY3b V:euDs}έC2V@!qF?xE͢t>͘뛋ΡXk.a#Umޠ};r%2u٘uЎb T1wVYg^;[^/*oy>?ܻi5}'$?z~_ǀ~'~'z٤to>_Q=(ɸm cSqf6K "xvs13mь&(琛{= o?2(Ilo>Ԛ-pUC+eAn$Al< )Ѝm'z밼 _\uj"XLoL g8ceNga*Kx^{{XY,2g'e7aZsf4RU*#$q kGڞuWdž2 K/]fh0 تOUB1)@G߫t݀iY`q26h:zFYPBԃE(5}hj!룋5gK"G^ߧˆ˚aҏy};?q_1)3~uzќzzV8MjΖ֬AZsIo ]B* M̟ljNpJ5Ԋd!'d>zg!w/udE cߪg[M`t  㞇Y4MBPh~&]"@hm}RP;.e5*ʸkh\D;Aj??m"F>c|d$q=My𥔔ՄDq' LU!=N09O}sMO8CfSFkTQf%A׶8 ՚{#/ ھGHE&%M1JrYטfg(76qY˪mq5O?Mկ\ǯIL(J7ݰ"8t BTdsUaf :m"KT&ti,CNE߆߯Q7`=܏Ͽg^|/r/ri^OɂuRpV[E9*e"tm"s4Q'ew@6C؀DĈ2S=Nh 9 q%0!N ; 7 +q;2wUv154uMkfoev\7qzBd"†QdD m+qH)Š5 H)軞Ȳ = -1N^h=0 B.ȳ<(,+}CuH!軎hd*`YCϲnPBP׬5׎ۛ1*\,8mxg7IٷWNj.0X޾u{AVET<δVdqnbe5$0ws5 6vMqTT<7̀X/Xவ Ft z#]EIGՏ}?ܳ|/WWqzn}y_f~&}hF#`+ˆ?7js1F[,78~X 4eݱXsrjV1<#a-״놓eCXV 荽O6 2YltDE٨L>a&b(eQadqLtlDUD_&||(I)*öV ]$t8(2ًL;G[2o+߬Wˁg 12XPCpQ5M)ļr|XqpH{ھSJ"BPT%E1 ^4j:vyV}Ӓ];dZM!4KLf]B"ghؾm?|}H%+൯YB;މ cYZtߣk4go6bowo`2E!%٨ c{MIe9qIPS츇C4 1fep;f}UsW>/I5eЏ3kq}e}gЇH$a IkDUb[qU=nz& ]ۑujEUYqMN7_oo %>)- /2͆mh)'LS Z3JJX5UYzn!XZ؋< f20N:2ћ%{{SHdК՚[oNQ8M,٩,rZ)}c[Bp7go2AXzQPY&\ۈeeX!`0 -> $1)|3`\ja;?0̧CUdy|rise~ Ljë_G{%"+w# {hb29==ܤ|W^/>CUruiDVVma=D5wi""DM2Je2N-:j 3_bFO|8=RTT@עJ6 "IZAM>1\e *Ïrx֝; WpEQ#%,f@?YE2u98% Pϸkxhnm2Vӳ5ן^yiV5(k¿umGg,U2w$QHCT"8[̢1"4;x5T;Î~b/QU⸪5/l28l.lUQmy0VCfq/V5e ˋ m?EY1NXh胆=@d>5kSHIUysc, ` Hcۖ,WTe,J6 Gׯq0=ʫm3Lƞ*JT)I]pL*i᪆z@s&yqvq0>×2a\a=7EM7"d D% ~U hd"P Eh*X/M*^Md\My|/pX M? $81̋\UNoHրJ@(, %b>b¡ҫ9C}I9@-|%!c/o1#"rj IDAT p_X 9툈6yCļ (U"jjW$2"+s bGklJK~vGsWHobnØ?io).͢.w:G-PK<:/LeMׁj22G8nN[rL y3L躎3dp $D sD Kz)2̔ò5tÙOG9yݡ( q4~/{38!\|gf8T̸ (D> q %`O2bJElU!=ǕJjVDYlį>L]J Er|`)(g Nr.{+߼}6_yt 'pdI J!0xBB)hS90X0@^#"4)Q<_!`l_ǖ3Rz'.c{-/?}}:ڶG4 17|\8=v@ٱz42e%gҮaQpULX4-O>>wb?h 5D&Y!V,| _~7ʼn.{/E]G&Ƿ^+[ ox`29xC goӏ}`0_V}{+m܏mb:cJ 2>ERAu=U.q.W  ]]Wzmt}jB)֏$߇JlJՃ4]X,xדq:ߢxZNX.7| űD:G*E^L )%y* Rȥ#&Մwr-Z& fTЬȊz,UUba^Ѷ>ߛXQ87n2LY״]Gӵ:'~cG x<Cx-2J<"L=A;%,v`CUdð9k3P% +DQZ)/V!h.`v5 N|WoMz 2yX&Q*8gq֒eqλ*5mͤlp2AӶ- !$z~ڲȩ3NxW+UɴPUޥXMS9khU9_N8%[ S'UE)a / uò;RdYlޣrTKZJB 剒:+4s,tʨ7jg3D}\GՂmm%p~HN M u`AJ>9:z'7ŋ_y3ek |3ۿF)^HgQ*C,!^` $5l9/̗W{ zan>y,Нݶu=Mta00haC=_泟u.Mz HIrY>&Z1 )嘍aE*Ȳ'iFd|B@bz&U921$ٞ,Rșoy ]7-' ֫R~[Pe_#,Ka{ޢä~u*Q^N{|wS*86s xDOAʨyd#h~6v-E,vm~Wpr BIYPS UUq~~{) :?еxo,OAHھ 9zn!J"*J2G*d"v<.=t\c!+@J]DF5oHdөk):2iUʨJu L N ~4D А%m%RK$X@KzV&(ؐeGArQEi`ӮYK8'v批"A9 :tJ^~oB" eYgx`(Z4]%Hѭ,)tR 9R-m?xkܪ$ Su,kus)V%MP5uӰX/ʒIUq0SͺZl"Cbְn/"Fo kȈ;,ˍKE!T(hS:pQyUa䢡}L2ݛpx敯}U"D ò-\IcYg>|sөG~)`i}Ck5ܻ:?( |w?W1x. RPPN7TӜG!EI~`&L]2 6a6!,ja µtH+`֨Ik\?TT3c.1![N%z`"]0 4$َ&pGpI=嚡wep8sуZx7JkFZ`{dYzV1$KL3rM$yKģ=qxuMJb:oX7SUIUu5mC\!ʒ :<( b^9G\,(RCӆjf0s8:B߿E]mE a0(GmщX?3eO|/ˋS~cf';pη_z9i֠qJWKv#12w8&v+6KLav)¦~ۅDVYwa-je)8N?ރ*lR]YK(d(@V^ZFHi9[KQ9ow4i0A-݈{99sA YaQF1hgA p̮Q.娉 GIk)2˙UY UFQK^sk()~uCIւ gn@[s ۮaJ϶a{2 2zYTʆn[t@dizM"`y+,rؿv{wYQ0d?T}Uel ?Ͽ?g2%ɔ>2]ocNTcy԰u H"t Y=!OQ&O"xāNam좔X ȾS 2E )&*ފMıplHO#_ss`!o7~r5ڹ+6oa0ܳI[Yk`R NX<(1ujCVxPikھ'(Axnc*DJ'WeQ0)Wt9@@H"o GrڻqeYގ1R,5ZcACg/~6b جD&G؞`b8$J͠JP'R,Xl,dR,EU`afǁEO9vї*vqQ .q-p].Op~V|{@6+B4/:'1C"CZCeTUU$XkPR"ǫ\ܿw{]<+Nȫ s/1ۣ, a`]לsrzBvf^Iu =}~*Ϧܸk :*2NB2h62˨T Xfy,sKp24/覒1RW6|po`*`dͣ@fá!Z;(r_ ^zpK*0xiˀ#HͼR?P%tO]׍ s"W9JZkqAH)2Ɋ4!F/܌3leQ-<@S<^$e-*Y9 (+Nd6eci1~L93lBğɰ ?3|Ū3)A>Xz](?bA"(Bdƶ -b)tl%b!D՝  SO1,WEtAyޓLZ:qŌJݳ]I+sD-jXNޔ2j@$n6 m,ZʲDH, 6^8 +,yYPM+W+ ;yUQVY,/C9sRA{ ))r'%a`6O- )9.K5H!)'AY80WCMSk,2[,6fٶ7Dubɹ:>f1gh]mi/Kdin寇ގ?׾U.-E%9w~p>]5_C| IDAT\u%kMݐhH@m}e"8fJMIGX]jMm۸GB"AȰ{@bODUF&7U9H7;!. y%:M7Ykؼ9Z//Pkps)i.Sd:Wm۰8kO4BJ5@ R ^i-zy$jP<J{ڦe6kھxenf0F8)rlJ]ѵQw`i@\(^yZ)jrYc֯k'zk26\u4F(AE_=AOMHT$A փ%MBLSO-Voƍ} 0ƀBKb=Xb5fsBO3 m,YXQ|,  ,}_B0ϘY.]PJrՄ uMYdkө0ڛhe>{T e"cZئłzMwVkQ}&Yq&i[]G;wĢHPaҮeMt]cÂky~~>6ѕLnҎkSfS8֎bfJSkŅ9Ƃ0dm#mTj 4^3aVΛ Excg7C/Buξm;R*^M 1o^\:RA5sޭZ3(PH%&]TPM$qLXc`2,*8ȳhsNcv-JudGwn]X\\d!gWα`0$rU^Yk-XozyQmcc!B0 >)XWMŶ'-h&khq"fSv1a_ Yعm=uC7݌"^yYg96yu6l~~QRѠvY ٮ'Lڈ܈ZS~i.25ט5a7 fm۝͋)u 5YkΣ?wmսfKyIIT-iփBdk-9t ψQ1t2a2SgZcJ6bhC].w_z$IX] l C&y' ϷTrƭo8FƠ&sl>o.DiPv}bTAU#ȐbQ*g{lNu[CHr*h) GwtsI P~$ l, Տlus~/J6!yhjSӢMmf1sſ73^߼ƽ.ݹ9D00S?S879?yR๗^ ">A8J\_Qk̉#GICdЉB:h8a fOFSď` Hmhm֦IjfGj]k ZמbʵS-fjO&>~bOB(YYvkA Cr >YK(%(Q aJItt:X9w3γ>dh4PR  YqUcMJG -sS;\t8CS1â[Xo;۳i4x>@Iˆ˯g: kӜ=? Η?3V*iB3 ?|3H6r혷( ҖArMy۶mRb&ߦu`v!h'&nE>}>0Ys< n zJA ˍ]Ə|xđW_fkܙ8J)Zkw '%r>cΈlncuLb53zpov3 _A)l{f\-(ˆSML&)8Z!RJo9\/`x2EH1Jm`.8!!Lۇs.R^xL2TOൗrݾݬ:fpJ͵{a9uhVƴi X]koss0b~2BIDcpwƱcH[L<-8BL-6[щRxc= ,;EK/cO=W6X# =w:NԱc$a3P)LʴUHᑁT=B,􌙁1RavR.2_,ƖvYa~_V1m;41IRb-q!Tu6Vu*8"DEQv^'1n02lopnuG<뜏P8m&fBf%oĴl1sfWpW^fS8RB Fx@mE޽ +'H8|80?鯝婧[+I#.A֕(mx,iW݄n6Pۈ>i/Oy/ڊnotUS*NSRqDK_3.iWz||`Ϟ.?xfDQč﹕^~u`N;b>OKSaL]*yG(}>ꫮU~ql) \Ym,!o0̲}R~k)8ə )JMm?^ ꒡bA~@gJ:e8g2M'I)ݿ1,Ȳ^ .<Ӻč3tq$0D9q}#vՇ'~`mָ1H(TPA`c ϻ]RSj ͪ7pwZH5tlo [nnMtKշzFQPJ):rᅦgo81jh;LkXA'{X޹toM4ݝ:Myp;a%=k̘`y:h8FA7lzirTlmha) svWVvmcc:v' !EnY(p>H1YBRҌƔneŐӵ~n[v}8ߟvoqg=}8I {YOή_tқGkͥ]ʝMdYF$#,' 4CFٽ7 ..Ptcn@یO"Nb{,XdǎEw:&<.TAFbǏ.fo #0z ,, 8Zs@zi ]PjuN9hLzU߱So:G<ĿS ="ua%ő"~[aa>!˻yDܝ}ӌ2>,D gxq8rzmxQ݂ہ /~K, X=<7]{H ↛oYkk8?X7=O`JUm [yOQl kLF01mwiaR7qWխz'R!oˠ<:ypg2ԉVyƖH4ϐ0ޯ^)f2< Ϯ/* swqKˈ$>5:2b]\zc?|cNaYdVlogV]geKJpzhT! RnXJ0TjhtE 'l|^xlix!.!볟,_z gsh|_/GDI T)rbAk,ta ~3prvEs9prxb (V[EqodF=w$ICwd<ţGPA@Qh>i:n$3!1ch]eȉfC Un7t[Di꫒EwJC[ܸ6Q Q1Y#%"pA`@+>\yeR"Y!I)ic-/%S Aҋ;d斝s,-.2I3֞EG̅=Y`c :fsH&./q偃(ηY$coh)k]uY~CY;-t¶dug-xF6xEkxNi aӬk|R XZ{وJ=54|X \*Nn.ץҘpZ,V÷@VܙHƞ@;AjF^x3Żh^ekq~gwdJ-ca5ǝ*߾˨@oDZGHC\'l'f8qx?fW;~ro}n~p 5?=8{ac^I֧>I$A5$a%Ua鯯mB8A\h\ IDAT~!ڳ;(јAW dim6t5SG|צ({BB\Ս>/`hda|4m jV:T!@JP"EGF!YlYl|#m -WASZ J)˜8 }$Y A%"z.IC1jNB(!Z&cI_Z+ c'YNf!'`N(tAGUl6v7vTmfL5_L-iumIȠ1L;6ֶ* BKW^k"P;+soz7<;$ rGzM[R`$i14Pkg41c'֌8|[W? V$}.`~q]hr4a1ھ;/$(E ܲOw7fYǑ7?)`QA CռxྯR]_ sy#x 71Bb@eEU²u 7rgt*F^f@eǎ7+ Q,/Sn[l&z _@!6OU(!o6ƶ7׮ [ BKjꗆass\pa ws"#NBqD! < ?LRF18a4#"C Gc`~~N'?QhM߯>%13S C 5Dd/7u03͡`7;Y 5CԄtkԌ=66H%`!?Za к[7ؘ]`R@ <\ 8En_Z O{b7ȓ}ߓ\8{c7Ys @*aP[ng63)Yv->I:=6ΟcqTpu À/@Yƍp3kq@Qg~G<'wLJNG=xK,v;p2o(GyC.E)pWٽ{kkXgY^^fYz7=8xa21Rgor}/}yse|C)W60 TYZs!=4y{'9qw &iӢExB@'E֮]?߂_(47Uր*\z# s֔fdgYp4b2|`Õvʿ'[NUѧ1WOFAF1QYdz !M3T]#Xm&( ݜLć^<d;T CM9hr+i gsmwȨ$ ɹyx@!3]q%_k >tGK__8}ǘ{p욏͑YB>ϐNRl R9t;:^O$ RJN8EQ0goҍԿ_ kz'F\}7|vaBWx酟3GxjYqmL{r y|E8_2&.?] X>L'd W^sgOf{_ €y=\B K:K:B9> #^yenfKDQ?yGv#ЕWaSzd+ӧu\_gr'wy'W]}5կ1x5<v(KK;=# <KX _gfQc )?|q] ="9uv\Gzr>gO)֮k87Ɛγ}cmA@Z;? {aS9i__:|) ۘQ :MGz"@(*%$(P,-emV˝hIB8 ƕ-)4W ieVj\(<_HIEQLu|$ صcsVcڌY)Z|oc@s1i^]fmشrhZ.c R~@X Fb<poeQuo[?Mx;1'[+g$hG/[bȐOmo:ġ%GٮLl;4 %6PlQZ[x([j@)-WXVWyskQ* "IS8gD!=kgʀ),I1*x;)~뢋]0׍  Pg'ϭϝwqBE;{WG#ɳ y%?szu}׿ AgvWcNVήI)oVZvmvnReb>lAݪ,iK5n|iΎ4H}<77O׫agOyVW r S =PA@ćDA19$IL C$F A $aTl#/ t$I$QHX-Mj`Ihu:,/-s|u )Qa@\uGϞfiŭٸ<Ϧ%HX;ozѠGV&M2Aoll7 7 Q=RccA9 ӥ ) mwa- AT65ˎ:=rpC{桟O;,yӎi X/D_[y8!xFO6a!*k .oRoV1ϲ[hPʙ T*zH՚2-ı߭O_Љ<Ϝ?1yDp$ pDQ&nB:Ny9td)q-<__'\sa{Gp͕|C 6&4g&{"B)KK!\Jscyt] s&})m-ʊfD1} fEAFEdY.ΓɄh`0ɫ!+@vR9+q2C4뱸HKY aH'kManyc<'s'NE;qߞ=w~[|\{ox•asuwW=T&ZƠu36cMk҄t4vږ oۮ\]񺀝;9s~vu" )>Mmaq8`bqeN̲uf6vi{, qƤ2{(,,M=[!j3N㡞xKcorWx^TֆՕF1QuX!y1JD9<ǔJJ$annHI QY]E ;&w{XhZ3"k"  t2W\{ g^z sT}FMleƍNjwUtc1HZCJݩ[3bƍ|MU( ug-\u!A!vb v|MMoraxL7IXB_H A2Rp]景E4hhR1Z}_ƴz ݶbK[u"1V QӜѷ3N'J[ոCa-V{ߣ8s !Ks{ [jf!#x吜Wp/2b8>-MVXw|HD($ a˝loJfA7iV’hIX~yʴJnW8?G O𳉰7- qikaarI^8"?#>=?rtsQwai/#RRAH  ;aG#~3_{/{QRP(vոbx% uyCܴ}F([a0vur7WQäIQ$qG:w1S0 1vleJ%븸a$R2)0P()j(HJ+De77墔EQxX'Ȳáa@ X u:8mȊt w(YB*"~vYwG_*&j р6qҴ &m2hl-7ARZ5ZW8.|E39wAuTl%8? ;]=aWM6՛LEحWIg[% uZwsQm[$lwlW7I'j\s׼ ߄X>\e8`eيrŕYыtjo$P`K+<1wn O)AfYAୂm xAw.gzTs4g~sƭSỹ{TݎG?nE,0ԢW^*<ω(nߔ8MFCܝ(bSnX7T[һ|eyN瞓/HRщc/PtX[_'y)a01rZ,o#" h7 s6S>5M_u(mzX6vAk QmkqLc/-BJ,ĠSɾ4h큨‡9ؽ;dBgNͷE,1r#À"s!jvz ԰Qx>E1K;5!MSևé-aU2$tɝ71'֯QD^`!d~}3jtTcQiB5dj*G&\x6N3o,(﯒=hb+wuoڨr5hD7?G^cuOF{6wJ&mQ,X*t !D %LD0ӚaMk"MAJXBr% g(P!w9ȑt#??3!y/ܶ* Ch^yӓ?1Op喛b|k_꺷2W9+(  ( o>@r|2i8dOKr4%o]S?Jt@Yط3VKŗ;g(J1Q3x$0e&Э!;f, ͔mB%=qʴ5zRUȲQ0R<TɃ#(wJ B%=j+j1JP2p] Qxma> Qzxi&j׋e<(?=(w!nvi(0㤴V53  hՁzzk-[I[:YA@g`EeVn E`qDAR IDATŨ tLSQ>f[%.X[[JЉ.f~1:N ?@.hрKvR!-x96-\R3hac&}4gU8 áo}X;w`tno-6Z㸂O.}zpa kTb#lmrV#:s]52It HNȊ׸F&V6\!8hWpS r3% !]w7t#DJ/Oݦǿ]X\},3ī/e|#wѣK~-s$15@>p.{,(ӾJ‚>IJ΀ϒD9#ʨVdcֈ!qv\7Ng_D =AP3R!L Qx1J)jє  '#;QP1ZI!q!A{G9y7O .- aY|D_ V\H Ku(Hk~Km, xP3A']DE `0,}?q:lW_[#f:zF')iG5&D5a4~oR顴(Ta]Jb ņ' g,b,D 0R0s7O|GuW)vtݑ;0wif ǹ3x-;vԋ_vƦ%#Z.jIRET%Uy΋k (0lBh 6铤2v Puu<8 Dqi>|K.}7āt_mr'1PKxG?C1ex5;~^v\ Yl.o7,ۃdĝ+[?IR % s>x8"dY)$z,- B*UJ0 }8H5yվι|h";6>\j mȵZS{zh+L"c?LN՞)֩y7~ސ h/r~1Ҍ8e דGQc#lmvŷŬ`6ѵFgDX4qZ!PCS!65I 2]dҬ(yHJ$|^79r:rk)𻗹g0cF-h[aQKJrJ{HD2&q%k`yh/B|H "gOikK..Mcↅ;9{8k%2Ž޳sfmZ(@ٳHgn]JI'|z>ΝqB(LA ":Up:^)@ʯ\l*;ػ F\kV!FԼ_L-%Nص{*Po) 0B*EĽymW}Ypw$A{B$@#h v8U$*$T*T9Nnbmlc  `@{mks ?Z":ZĤV,_EN7|~?9i8 I`7A 7!wWYߥg P D[.ֻqZ@H t(񸽲~'b{H#A !ۻ ji1disT+EB/ -Fi6r0gk농!yfw\(/5.4Mޑh! '{Uxcp"_ ?7z+뛛(_";htZ$'x%[@FC4*ʝQFYZVjWǨ(a^i5|N6" 00n,?èڌiYĬBxfXGtz ʕ*DK"ሄ|{j-eZ fP~6cm~qޫ8bl|pN9/A:?_e߁8˘";ܹs=?wb6(RQ^>C*^(I4ѺI%ѐo?mzQz7տ<<(]to;rٿ`wl 8T!Y!Jì'0p؀L}T%{Y;oĂ\@cUUH0;~mÝF 7R2i'eL4BWzDU 1*ώ kYNca¸LЕa,ay6³>[qp?~ ly:z2O#DZ#$8|vϿ@+bQa6j@s9LW17K*8Z*[J %Z)8=beٺt'錄INMxg{8|.]8ǽ?ٗOs,-n?qwE{ۚ[?[Z_}"YG4F IYD:f<sOs|&;Nr8O> V6x/^lS9HsO>|c*)Rl+7?=4}vZLt ve<,Pvan_JMw )Ʉ|Qe. Dt":iG,uQϳl%+!C L 4eYB7_̞'O=T8kjL~n*TԿ:x-4F/W)4!dǸjR+$шɘե%DdkkiZ11vkg7Ci oZ5W !Z09V>Z ~:dwR"/>4?4v4uUM%lY30 )7!Wl._)gw,B|-E?j*"ϤƢ?Tͪ1;8`q]t=fnHsV)%N"67?(u5زbe*I!GN3ؾvTzyb~$Is椨=JXY;>c>FG{ƖUYkhW9}8ϖg~9_Bqr׳䉓,Ny"ϰnc,:qNn|/ra.]RfY"`xIo}6nj"@ LQ;`R{,+^ML u9bʻtҰMp) R8*=˦dO2U !?*/(8ZNskSmSS!4" ik,VX,D_l/S{c;[tɘEZP|qbꇼӢ4(QeHLiq7m@ƶOqz,bs ZV6!?._q+ Ir薓\>2Z6o:ʕ x{G8x]L#zkrgIGZPO+uM'?szB~E`i1u>K~;L,!nmo?#Nf'8ɓ~ !%{>6LBg>9yӽ ӵ#Қ|W>|~r.n=MM!gWI׺Odqpbiz"ϙL28dyh8"c$qD28R Poʲ,|WmTJQ^l\9 "l݄AZ8I{@寢c[5)%5(j4҉<ߢ4EEA1LUECoEB\Kդo6GMuo>R\P A;e\B5LՆ^z>, kcgh`9!{-z*xSw838BD'+đ&Ib"1FU֪Zsb EXA30Ys Ib~,?@dm\O(;IG}\dcqizΓOdS{ބR@bրYg~(~vww(np8"5yYo:y Iv):̙3rˉO?Krvmy1ĝ:׹z}7} !fEB#Gxy}cߠ,*Ƽ6f{-jrc &mg)@)gW!k'>ﲗ(W%!^:*zi:UeI8YHynpUV1P|t#m-*+VN U" y#VZ,Q֒FXԡ3+ 5{k$t]o$7E'dJSz.Q 6Q|*(s䓟+^xy,2HxӛLGn9{nN|JKpݝ@ݧ?峬q(9 u8 7>֑L\dyXu{K^^>g +61O(w: _Â=BG%O(c.prZXUN'cD$t@t(6sQve(P`S'y_gi Bќ8q/UDbSF9㕫wo^'pHGcGq:)Z+`pyxjXK5` ̬zFCm &g2pgBR#xwu~|s[xr}˛aoS6Ȧàq?Osg[闹x2[7w&֊IY~_ "?|7:i%%=\9_iMY "eYq1:QǸ\)*7?QrSOʙW?xK[.\;*b*c8)~k ||_,moǿW@-]Z1>Wt_kiӬn*7XwL#^ziΞ;8ib nwU0;)D"#ֱ39EUMSha$)v -%YUQCe UYdTv -R ][5kMGqUC+M#TC R0[{RŌ{= `-ٖxjmۘm7M@7 ڤQ4kUn¶HY/e>EAnI>hHKKsU +gkC`iUSYnUGIO5%RTȱS>CAk:(C3k> ^4d4բ:f;΃c7u+1<ͅewsgSHW_fmu{r?SgڸV`5 ǩu0ֿ?pF{Ƌ/}^~?ȷb0?c M;t m FaMU sy[|Նeo,`_)\.kZSC*ւ$PyZoF&*Ko,&QY#kʒ5&(s&S i~mD!st:iX,q j$0PVd9"rp~F*JOc,{$i<ȷY'ߌkyo|E~i0OZ6e ʩc^pC?wIhRy1pE)/?0e,@Ej}>y9կݰ8tdfdf+oL㼅ם,^D \AYt fɎ_7٠E4M3fȇA 3I Nf> %zE,Y&/)9:Pkً[%>˿xV<ƹJzb:r33K׆6{Ͻ;?~|/; 5V7՝i|.2|RPՍn/΄D' k`foEkVc['Z3䧠y97DL!k|'JJW%qű%y^餁SŒ)br>9OFoEƪnN6_B$>%5T^9Ө IDATvs]w鈢(ky iU&µ z<9-QlvMze;dj{C:[+2!WC{"@jѣ_Tw^5!ј .(b[xo)bez1LtD K?:dvLZ 7c5fj/7 gYA |kA]JÛx/YHyEVF8/ ̥+sLwUz_{vQϬc}8=#ZXj:^wu3J+\[t/*r #n_['*xJ4,N֖!$MiSkU[+0xo%}~Dà8|w1J q~Xӕ2yfl1G[oPU~y H!H㈢*)mEgy}ׯ͹^F-UI[6 9@SU.\DD-[,D5w#GUb<( UΡic{aK r%vif6}H|ATI! *0"%=1i=a ' ?9J7X7j,R\1]ki&Epe 6s ^:cdI!"k&4{ͼ1#ǐ$!*!{X=+N8VaIAe~Wou})~7K\/{:UF?`rbQJ@V{u1sw/|(ɺ9 "Hj9۝I q$IY_GÆIq=B"p%^E4$r .sXg=%0SA!]m(@meUɄ2BY1Y6uN&7smƓwo},G;wkWk? ]:inG Ɇ)Zk.[t4H!|F>fTx7M%8A+ Û/'$Iry)>+&J>5 D>vP8!fvƖ̷-ǏoGُkb^`&ޚ\W45μ|άX@5o2^:Ywz=IkqrJ[%~}}_ӀM K!Ʉ~K<%(bd4=x 49[RlNg`ǧ]c{0Xk+˜8~5&yFYCau!HBR!K) ZZv[ؿ&Pgy2fZc?)6]x,t}%ϼ y@v&k0)_kӁA?93lnn~7\_ 5*+| |w!fnu pAv3ݝ=M;rη6ȳl*~};| ^9Y=O'6ԝ}_shbw4bC.J){ՙmpY_eH`k)sLc"*<0ER)NKV '>0>/5MMAc^[]sW[ kc k`oh->Mjk&X(6|ROEJ3mo_~|J1D~ 0eM {|gc`zXD$ƩQ$Z mzH=\>FLtl0 a Zhd ]W.)@:uI K(!*>{X8ʾ>GM6`/|Q}o㕭L [, jmE{-#es~vs4_&ﲶ$s~Ӣjߟb>[eAʙ@Jԍ u;Jn\QIɏmc*MaĴ;qp}q}kp֐>bi۞78 &tEA7XV~ү6us^ҡ d6b]@~? 6d8ԩD_VgqM)B;H;8( =wrճ .Hz$ishZ`Ҁ?I۔̛xE-Zbh3¡:e Ue=t5Ýc&LUb! x;Or~g2uv% 1ci,tQ2ᗰv6hH>еW_x7"*,Ak8aܳ,D zDgC) Ӆk!I9,54 5ʠ@5 -24R-9;.N?FܲD $"On7>Wc}=o/si`A*Wٵq3ح~#Η>uq-RpyΜ=ݷݿYǧ/{iE̴r`]fy=icTR hʸnrmw< zM ~>v:,k 2!+~,z}3TeR Zگi]41Uˬpʡ/VI8#MbkWo^Cg;`{wi~Vssxs]Ԓ|IܬA'):T#1dn9ȋ}NǚplׯoO W.]MG8z8?67:S*n_{??[ >N.F}sWmY69z뭼tGl9\)=/F޻:}UJum~|ۧާY1YщS C !t:yP/aa)46VV.\u,q±[oGe.vvU{-8"nQ0;cK`ێGm/0E ,)H"΄ B*:zxAIح:33-7cD67<"Ai|bijIk(IELzAiN8EAh AQ񖐹p 1!qXӪzJVP(_!!v2Q1-gPZ;:(EK҉i^u/|Y{~ɭqܹ鼢 .]-Y2j۬13zpt g]O]e6nYGqS3-TD)"[$LV2d T:z}D8J'@Ie)i] u7@TZNLCy*#?@{h)<[Z3?k|ow=ȷ WOͥʛ۵8>߫R;t(ӣ1\[rx{9sNV9~ ^z$ߚ5US~6a&6܊,7,?R4Yd;5v5ݷ7rs.qrc_o{d=uXKEtU] EQıLoNe Z*8F+ea날,V^,dBe*AD1NZ! GK>4;X|=͙[&D5Q Ϻ9\W =Ap64qcM~8.t6Y^AG J /fR:wug)\1$6RHH#N${[A&Z0 IO,KAzn`:O,gG A#kBzb)Db E(#PkPBĺ -%Q+/""Q^E׍#.S+_:SJ8ߩ$Ȳk*0_oz9?r;1VS"춭kbܿK&VS ϔí 2+ʹP')gEY"r!TEJ&YF^eIY8/p֠Dǚ8IB#ؗ;ޖ:D%cF9eYRP#(2ffw*֢r4%M-Zf{WK!|4M0]Ԡ)M@\ĭ<7;f F8 ,28؇6:2& xFAt"w5% .Sb>g?cMB`ZALs' .':"jz~B!2/ù e-N87KR.:0xkX(cILQUӰm!z&ƒٽ863aמx_|߻mc3LYo_ê͟_l71 \c1&cyp)s8wxǃ>𳜿|x8IyKl_bU&~Q|cqX:yFYނ  p2AwN]`(iYЏ塀B7tFLե%d202,Pk^}(^ IauuՕvx2NkKyɝ8%M RM41dA5 Ԍ9eJLc-YQ0) ?MS\Y`+3%z`0gBd[4ӂ`d nbVh<%oD9mЫW\9w )oZ g J*-v-޽ }ܜ?0 XR|V #lv T'~(2/R/JA9?W{Ha:,ACefLB/TDiᇯqL"H%AlUv EMzn"d|}KŊ+,QQZGusɤ`8h(ф'8}e)&s[gumξI{=RY(BJpwI$˸ppcÇ~tnN\q:1On7 T,N\)u)3P ~fmkE^?S'ROc Wv:M2xǗN~a(?((w+K>$yk+W++KD:"7W(0֑9) X,-(i6K$+#x*lF͵M`R~ O\PZ0/q$qUBH-(-H!NІ8-_vdwHƵ aI)$r-vl$4'kؽtHO?DN^k+$Ys9GR+X>*3&uVM5[z"tR] v{mlpSh}< o_w/)ia%I;ro8g`ZkP W^~(Nr.˒Wݺ>󃂐*ZY-TL~*e>"2.8%(W9kBe<6Mn[àV+x4,Mr'''1A4&l΅);)PRROIt:0O2F1ǎ~^==5t8xs ʜ&1U JS8dUŪ1āZ]K1RzIYԍ4T[+n\d9-[n9Ɵ/^}[h;^jTcUҮK_݂IR%łDiDR-NVh!%JcL;IK I8EGt wS]r ȜcrcIH1 ̆)RB9yVZ;4+Q͵rIڣJi++ss}^x?BK1/];_?B.ek这xQP[T )lB8,DY4竊) B\pzI=?VЉGa\eYIҩV"d*!+DI1U 儃<ϱiBQUtFJI&tyU"0. ĝX^= 2 ^(1^^;Te#VDm!ZeIlB?ξuip]#c~Ss#cTl]@sh8$cf"-,MIv\pM]ulRN]NPj/W-E(R4HQ aBz&N"= GZ=чëMK0}4kyj,&aPSeRN1%w$[{hPk<~;wX;!iToGyE{ځ,ٟoz=ш/1 vp[ӧ!TƒtZd OfܞNZ 8t=׿- o>^ Pa7RzVDU#G}~Kly*0qT*=O`+k4@ՌeFLzSaԫh653_t+|/D'_35?bޞ|;>P A$G.Vx N`i QB`L}Rd1HkVVX]Y!Ox2u]ǙN3ak ^hx2_B>C)EQ%RHH)E-,-^WU ,U+{4bV5K߀lAJ1h)dm':"nylY O?67,ZE~t/t+a%")-F Q_r^}.RO-a_ pIEJKV,;rM&vb%D93뙼ד>۲%,JBI\$[MD$޻k}̋{hTWW=~wٚHXۡ#hHtx kPh7 -%'4Oj0xIXׄ䨆+XN}h攵N>"w埾6a7I4ZZ} dqa=J T1q5v,#W/Fz/=y魷9w6N{/׿䓼zO\ jubv6V@9dT0z Z89X[!3)ssXGy]\]]V~A5@eޚcT̅{m>Zcè􋽼%R -IRA(P1tZHiu:cktn2U1h),L^`'ɕx<;RNq"ĥtEXƅVdɤgE̳6Ϭ <{ U&6\ӆE`h=Kp1OԊS,0  ΡRAX[ǐPV!)'~'o&I]z4\~7Mc?>nB _UmSEٻj&:yu+oNtŰ?$suzI9UUggo5Ʉx R@ץ( Pu;6ݥe~?Ko3rs3,_(xJڦ$YX:Ju0ڋY>rPLF#^z#=3|ɧfn{ o:=19U0)LfYq ,<_ Ip/>.6 yXij5.xP\["; ()4d'uG()i(cwPq;lffNgEE4QyMSs\{[He($463 `Ou|9w./_%;ۜ=~~7J.rs %\ӽb+1m䩢YI @(x_ D ?wll$H[$>=>!+<6^Jۃu\L v;[}~:K l_}5$)(:ϳtӮ'XXH/Hn XtPZ8kpbFEm4Tu=g ?!H3&gvNHtGUP W74ut Ny6!iD,ee8Km4MC( Uz.ZkV`0`ߧnjC&`:AGr/e8?df>H@w`)?2z Y16iF vBLJýݛv=yfs@U+$ (;XwTXh&tldbh 9D;oC$ ,Bc㕑>TT&S9O7 8hX$#k.N8ִWq8?؋6ђ 2gP2 eDH Թb:w%ZP8IjSu ŋpi:OmO|_*w{Oˁ c Y "wv4RrZty@@;.nd|߯S+qw0tqyWn2Ԉh`BpJ{'=:gN!`ÝP, q3?O՜.vXz<*hry~&[}#ӎo:O\9Xş0U@s]YUSZo쌰mR#%xeHXJaϋ* 6ON=;&l,Zz3 _Rtš)I"x uP'ÄCp(o\'44os<`S݅WJǧ/:I[VS_spI|>ӬX)'4ט}?ơ}fSXiU\=/Vrv];pM#)ku чh?I"h&Aw1~]Ǣ_K%IN1!%dZR9n J\گ:in,u9ƌ$tF0O"(:%8RQ7BBh4uZxT @@:tAx5- dCɴVӄQy´y\ddǦ>.hcK'Ny曫`?!RD 署tX#gozo.<3?C3i$WEPQͧ懯mwŝ= җnYS !L~IR+*.§BS]DGfݺtHs.̸+??J?,q(2z\,$i J:c|2)8M\V.ވ]KY995( 1*, 7c1b%RReC_rV+|!T%8H¡"<ƻ.\kmss[Z{ꕫ()hE2 iw:Z^PVxiU]B8^Ɛg)ZJF^?tiZsQ6^ck4otzuvcg(!Ą3lU4Qa> ]<5xFYb2`Cj3dYL]?L=aq0*@xR%ޣbSU-0~?sZD>tj~g_ /)9S:ȔDܕHlӬ܇`G y$M]Ml:ƍUN?̴|<"F(!> ( J{)Kw҄_~ ^G|Gw1-D"2h@k̖1ZRh*z5.c$1SspD٘lzN\lNbx>t5ԓ p3UXtUwPBMXlMR0RJ:,McT MSTx$IBQ4D5I]*caj,Ick,8G&diDiT Y4Mä%~߽t]^Ƴ\y2CKZ^fggݽ=F]{daiqawg$IXZZf4Q! #WIPEA5(!y$t늮1+Wx泟կ3{C8r}uMp{uR3'x (IL Ldi.=&8k/ w7y )H$;y%qj" &J ]s_{ـiBJXXHQZ|xD wg0c,, @weU%EDJ2+':!m#KOC`=h=ώ iÛ?uޛHL#2ђL}ƒR(Pՠ=.cX^$`*އyPBZ,/-,Jly)=VV?bJMuRڊtix< O_x%$JiT nGޭBHڥ"Q 4uDEYJj1:aR̺| CNTi1%D\jZk%Ab-Ȟӕ4nᛵ$ 4!P($Jc ' , *pX,Mﲽʙ:r^Wq5L%'`<cL1áe,.d'%VA# h],zGca4EJd2)iyYCwn%2nnpX#qnM om nJP9N~i^3m vT9lsEҼTΣ*i``^ 4 i'b5-څƻIPcx/v 1 KFKh}C1eDŋAa䭔r>S;y'^! q1+6 *MZ7~K/@SUܜ(5n;}斯Bq:BPӟ={b`?/n.M?. =G˫3qUd0`KhgzsL7J"B8,Gٙ6SV B1r!E?U!Ư)G,GV Q UN}R /%B*jk( &aBV@UWz$IB5A]d:a0RG2ih4된UU^_e}c^ǎstP%BJhHʊdBa4#rv'T3?Gcz9SJb,|܃by`8J t$ZN;'qx/F)ΎCO>OۣH]x!.S(2nLRZEN"I%^^[3TwΒ{ \ n,C `OguI90'|c IDATX>- 5'Bъ5oCK"aEUYcHdh涂sOm00ܨȾ: Gyb x҃3oQѸ5#'A[G ߸ ƒBPV%gϝg<j}b뺙䞇rcmP&>w smqSͯa;ϟ|͹wEwVVvL|^8kw׿Vj׼ o$;qzA*MӥjFϞ;4RQ>Bӌ'!BHTb0Ӱ;_hPtajׅr@޷ba)sq Mx4F) 1q,HZ˰,%i7UdZRTƀH`/nd"_=- Sd \qyX\F\z=k 43Em-?O̓_]C3S^4"6Ͼr~@\x>ɯ ׹rbwcјڃ !(<}b4Kx7wfM1!|8uV^:eN>4emIҌ'ui룢t9*@_J65˭o p!CG-Zx㆓u4Epifkp& p5L$84'R嬵H BJɄɲTu%RrR!_;FhhZv .-#':\8qNlZpB "RV׸xmq=}"јMU'L,͂KVVQcwwc NB% p֓~Uה7#v>mN&HiE8b@;z8?A~,5?;@u3"y)U8=ApQ yuc1M8j\l\_;VTT"dNhSLx+K8tO"]ؙvBG<d2B$IF*i` O&pE(zHol1]OEUY%&OhP! : 婼= X<Ƈɸ 4~ic%;chR|Ό(aqO=+غv7MB6[HMJH!w|:m<0q?].>k'P>n%rg.L]_;/'xd~gM;SajZz4߿x9dI?]N jcHLVU $um8:NL̦Yvo]0 K)3~P$3_$It:P fayWov}ML* tjC2B֔eM$6nZ-ʲd42ٳgY^ZQNF!RJZEs!gefjZwG(qƊ})Lc,^?|3ޫzi7{o1sL.57:d$n*$,bc( Y+)XQf-Vxy2P :kjY "C8;W ^zAH ?Cxzv~qw@ˇmB<01nN v P5&]lMi⃷Dqƣ!YuTJ3SC;߇\iXX\faqcH.Lo?eBq S>Hk2&Up ky#_21.oÏ𛿱ꍛf|iW}M21eD f$*'4F>iHF+ס '{^fz=;J]5wvKR$$M)ˊhۤiƑݡ1]k*`e׍P 1-Yj`CE&L2Z IDGx kqz&7wk:EnDa|(&2x:xK]Am-utLf?jQP%%O'*`>\Y%⢟u]H/(jUUn!L*@䫺 фS +Kتf

ѡ!\N8_HϤj{ 8G[C]3O>z /`v?CM-ƷrKp81 z/}/,i&_+z=N.>,2b1s݃Jց¯f0a<8r6~(umps|")H9{H5hgQe%LA,hޣmHK-D)ENIkYHtHx Y[Rϣ]4Nc-¡NH?gP ҥ /GN~G B&e=8y:dt'pLjGT3*T`$_t;#SP751'Ij[38/q򳏿?|3 ~tM1nԉc|[sG2NH8^H 5D}$y+?'˲ ;W/; nl]Μ; Nf}5Ngltn)tf T[!@rNPtt{:?Q#&PhkC Gc'4jjH!5ABx)˒d}%Jk|rJ՜297+E @v.#ai3iitiMEk|Ӑf9KKKADK3w0MC4&,4l F),Cd~-p/'8OPB`L*3ΞgCb`@r4ek\kkwxgdťeN87^,/aYA.Z7W PU%&M]t'_| % Jﺓ7#`hxbR7m*6c{[<| It MxKmqMhL##Ehf"4C0|SPITg7:)6Z;nj8Ėc"cO)Ңco{|6VF *X /R[iLn~};Ð>pYy`Nqe`Γ ~"OZ3.dj?][Oee>>&Pq,?ޱ~2V8"e9;?˯_ +G'>LU$Y ͟W_%R #RxO _r=pi6_z^xw;35E,M]n\IxhLpzxO^X;Wy,gt5r7~ cbba>鑝"Q/z Tb&V1V*K=Su0{{uC? IssIURЭk G?YpgN^\"MSzUʱ>~~kH~gXL؆_z k :3,ڟ9vz7:ns!u5|g?:<zklwe9~44M=,.'l(k3{={ zLcvR &2RUU;d]h9?M!$bn>Lw* BGDp)K9^`>\ĵifn9ZyFBPG|^JkZEAggJu]a4`m5 ii3ph ILhv\ՒkZ9B?!~jxϜȱ8)GcVҊN;8ᐣG9z:;;3VEUvUpȨ?9rHZ ]~W+Wb,{g:}w2x^{|ӟ~ ʷX9i(k^*@Wvgb{6,:] pX_ ySp:~<&tM֧ =+|IeG ȤvzJu DlH9hr~8gZsPFXi"!}hxGѓ(8zZ:ˇ05h ?7}gx;owy/i>q}<;s,-[o9=!>?Ow3O_UDs T2?a23 wy5̳yM>r;> +sO<pw927np9 kt=.|g ~pHm,Oh,e@#!8 IDATמ^~/`~oK*(mvvBm{N5k<-';K.XJi9YSb3Z$I+E M!~-p `R̤UR썕xhEcR(!I:3 ínCD~o ,Ţ<M,^2J:&0 ͹TrsK5- L4C4#Xm>MNk=L>Lcc~XsTh|Xx73YKz%Le9~ n! G[>-+OL\+S`8˗oЅ;S<oGG+]r_wۗ."ի>zC0xa=~qt԰iR~/X_GiʵW8u,> <oys|O'YuEuwñ+4ֆfX|I>M2c>8ԏ(V#YAg# ]8*mzX%iAښ{((#ĚfursVӰd n%X:bl`CL"~?gӢv݅–e(# vZ,UJ"|}p[\L:%k, |1MxE#IхkP녲'v*mOl*S7Z)MuW)^e,*/guRlB ֆcIEȣ*:a.Ks]դR)ZfҪAJueVW2XR gP < 7O,QA ٓĽaJOx T>C_gtٴu B8ߺ?vys)Ν:I=O[Ȳy) n 7z i>#ck5[-:_ʯߤVq\p(CDshqxWxaϞ]}Ϣ<~K{hn\YY6m̕+Sv/CÖ*\=*ׄ uTY#͟nOViӨ8iֿ=eҢ\%pz  $? 0/ӄa :xO!QEr)4_kס! BߧsU@jMV3)G-x.q!ﶻP뱼D%{QYa&S&m-v 7 ivj},O6BXI"ϘBcӖDQ^UҢ B؇`%kyЄ- SjCMX~z3`,T,!\4qGaM!u,'MR1XI0ʋ iemxYטA@+}0hףdyEQ(2 7#C(e w:yjL$IJ%IS%BC &MsV 5~he*m.,GHIfiv-;S)玟F̈Ǥ46Fki dM45 YN0}m's[X\\ı͍Fo .YK4iR"|ߣI $GE,%1:{Myjq[F.~ƕH1 X)_Y"+6$_fV _)fP-i\֊vT@*bXZf7i8$4'dYpGІl R@2a vsOAN"BkFmB>?c]lڹgN}>>O~[lڱºQnڽg8N_wجY72Ğ{yWp4wqI\rټy3O?5~:Y ;{&Io/Z7ij>M)1Ŗ[ibm+u˄.O܈s.bpㄴC O2֭Ca,3zm |?0"2e`7P^;&J:o_#1G NK666Hy~}7ǯE׿4C]Dj* v,܆#Ȋ'2Y \D*w Vڢ[MR؃Fqsb,4k}n:(e+weTU&TQ9бL}^Hy$YW[l.C-;MhB J(*h 3a3n"qE`c4QBq7:;CS\=EԇyqAy?_\O=/֝ j{. 3Q iY;F|ٳf҉\q%Vu4IZ)a⪦m6)}Xɶ ִq-?|1{/L&6RkR]qMt<iމ{]rH$2,'r.Bo2r0c*am 1MIޡ I%ff4ku3F!媏9X8IȲM JJ4rzu{=:^o04lZN&Orn֍ZڋQ@.%i7DJۨ$)-"B>;vHbin~{=TxAﻤYiW׷s#\]ZF wdb^,# ';/.qC+ _xW_~>V% aPbuݳuql'mVUiJCiY7]a//ׄ#ȕ0xo%`BxjUL:.R=%up>ekn2W+ ˠyDQh0~ C~SBL3ߓ)V$QZ(Lܟ}Ć$Y,$Ij>Vv)DZRE!1WuE;sQJI+V\>wB|-˧Q_di)F&ҹ3|wfFNZ&R6 rYC5FېLvK&,cr| 1kN)ULh Mbr+0P`S[t@1w+>HMJR[|1(K Syz Qd!u 8EHi˱Q|ްKOځK!({?7ņ;xGy?, mx ȔïWCo^|ZV箻& 6OpLi%5$ٟS$gO\+AfYQZ@`zP|7mĕǦ(ЅE:ݼti_6ZhsZLW(2V%˸0WdҨ\"ZSm փ>lrxV!ySoLQF=٠#* zN`hd? \cd@;foZ zEA64N^1Pc$sCevjӥD#c4(r6 >19[ ,XZX"Tҽ:|ˏ}4R=|im,,}4kwt{=Ta,%](B$^*`m ^4rB&"5iUx$*M#y #0r]r`P{݁W_Vj啟]T~~|Yy|+R$QySIV6:גBN4>YY\:}sBTԢ,WΛD+~7ރ* +\Z)5;敝-[{y._Xu^{48imML9^ <'YK|;U ^r+Vw}7Rw蛤aUl8s-Xu}䧣׀rBx7E9E' 7,IL20"YiJ$.,aycFG5+<0GFQ0ãLLl6e-O3<4DԨnni@aypzskinV^ٻ~fv q%sgdQ ,S5[dIK%R h1?= Z[xk5il<3WQI^K!^Lמ&NSEB9 |gX{wsĩA^)V|eqEo8o!uXZ\&גe)Ear }c]5qe-m̎pȳMH5G!@}v&7c̝:Chæ%ͫ2k,:GHcI,Kfv"׫jo$ЎP4E$Tl ʯ<(-<"b JTQ=9!,Qx Ms$Ocf"8>MRvê|8%<?|G\]X6zeشuSG떽 ~}VJP;yCCP$8$7m̩cܰ{/SSSBkVHUM;=Epz.\z[_./mu+zx.Ea ٕϋANj?VigCZ[ayn(h 3>6Ǝٻ{ѡ/-b.pI:rv/6\|˩5*t(&h$IJӡZ6KV{JIZ:`,V͔噙|tٹ?0Nde&֯gٻj/}{! 6lιgذmzǿũi\ogEq̲4kqjiجqՊN3nݿY R/WjaTAY)Z*rʴ}[P,w,,u~J[!d9D{qi%iθ~v;}{̧>Ş];:K\<.,.e)R|hܰ~V`]% l)t;X $yNXuƊ8MS,CkE-@_~dd3ȱyǍv5a4,ó2/,DGeBwkiˠHĄ+ehxK,LϰqfdEfoTR IDATfI,=щqd^8]t-<;&ZjA@Zhh]Xߺ hyuLF|>gϲkLVh?%0gڢWTx!-6F9I:u;\.xj)^1"L: ?/JXm ~yG8r 9Wtt󁻘t74E3?7M7Oj|wsN~0E]ul\+4 ^}%z%kR~"ߕ^}K9,elb9Il\{C*gp,-S @}Jj`cr^Lj9cҬ@'),/ȥO>1 NT0w<'K(⣏>8[MwB#]W]8lJU4*mUE ظc7QGi=\Xɭ8kԂMf6VJk2ߕ;Gxм( >oixyɼ*>>>z>̶[o#N~W_xnչk7>SO>l[2R#<s),+́>ix:fzI>)~_KʯO |"u8yyXe fu>&,lb BpAn?Bql68uqzuZ!jZ!Vk3&j5k'M&, ^&U41uthibt%QAmd'3{}<YkPhq-]-+o`t|?ԚgIRRQ- y\ =HS['M4ALOUIO<`AiNn~fg8!)9,G [Hiu$;vwPynxƹEBߧQ}Ry kDAc_Su:t;=-Q!\A={x",-]UiW,v dWxBGd@ol=q>gBX2 \,F|+)6ڏBofx|p cGyr6ر}+ Wnl4G7qE޲+Wh#pj5dqLp}4HℱQnw'^{HUpPK (b0H5eiz] DiNIވBR3 OBA8n-p٘Gw[H Z.YWc_UvnC^ "y6adFc$Q}k#l2"MR9|%]_ӏ}Jcx/D ^~N¹9JZ(#ԒAե%&"/$7î=;Y:Ǖ˗ټe+n_eavZ24<Į{|ͿPsfPg0u YѓB͛I5Jne:ڬ KZs4 ;mnyu:?ǖ͛Y&OGkmr(ٹ榦HsռMWjA#Z#\OY*|Pw^ThuYbK^QnY7>(GT4PDv)K)%Nm'ص}3W: lU;ryRzf$ Ð 똥~N^;m?(r߃Lw:UDmH\6kwQZ87uǨ 5u:(,R±e9< ÈnKBONlIB+7ƆaosaF#<#v~cG#k_/ Z ,tېJsjJι13."0[KܴV`뎝swt\vo_#{˿8ex`ߴq{oED:Y&I{=oa|G{-[SOpyܽϾ#KM^*Ogm7q3nq|Q#$qLUx=^X.=S ¥,w<3xx1ҊF%e+s-y;('< >y!,TD+RHSū8}ʳ<cޟKӌBJRk*VO 7ԫBXז<7'|ܲns <:I֤.}r_ҔF DL҉MGYNL w~^{)zLjU$~albEHMvaPfKO[wZGpV\d阙| &Rfgz!MVdYІj8nt,0^Y5qdbs8沄k ^.]Z4T1J|LcĮi}te (҂B>sp(49:ƭ-&7ld->~3E_ Ο:~ 8uG?iHSGGi6[oqE8v_./! q1qC~;s9e?3r!xG>K,377ǹӧyRW~nÙS',E՟:7p%ïν=ӧoggXnNfmز[c|Ͽ;wt(j 6 غmǍwg \'cLntvލy;Wħ 9j;g?yy2>N9n΅ʯ:üAa{>494իWɳ[?#4勏sӫX5%e-2δΊ5f]Qki7݃'.]Չެc~Zibbbuf\&vyhdTet#% Wk+}Lb p<3'Yʍ| 'c<# #N1J\ZXReB'ISяSB)+ͩzr>激 /$zﺤ 2\@gv? h>A4ujQD. ڝ .HI-5#dJvr˩)CAŀa i}3/(dFݣ^<+q+?%ګf;]EW%[٩M+B(h6p= 0_fБұ%d5J*T‚7#6o@/"p1G;fRW/N;'А+/VC>z770n؍?4‚yO]sCG%^vn>+?rX7ɻ/|'?g`~ {nfx5 [‹+}|i#j5>g0ܙuA?yGFH7ȉޥ_/u(?$᱇>Ķ;q]Y/_E5:6Ak/<dI'>ivIeD=0/}opoaۍt?p ?L_GU XJ`pPvaZ.Izu#yfH«iQK`AV|9~/Mqyz/PZ7f\_/Y\^n~躲V8S\^4 +8* zBK}h9Yr]Z,K]\VN0!&QIJvpqqHqE,µ)_tulb&Ðz>N`iRkԩFO/Dd94bR),=huZ,-\8a@/7n;ǯp  /W ޴,Ջj&8i|kS +CiBZmet Z(\G+Fj|oŁj8B6̷smttc {y#gα>G8{ .]fƍ\pINy6+/3;=7۹4>Σlߞ䕗^.k.6No6wd󖭴x?%=M#Vwzqa_| ?AKriz333p QkZJjIߗЊc Lhk隒  IۆZꖼwT8HjzEеU ce~㐥)IE%mcImdA ADZ;V3dMӎRdi&&s]|?@clTxOhYƣcZ&sZD$IhF5^|5NwHǁR93wmQ 0+p#5+D3#pM4}]6Bq!p\ iB\Z4q]4KPRQºRfmL U1LrTtlUU L-U9%=|Mns>htC/>t]:/Y̤3bxlxr ?&w}/GΜczj?ӿ_ irWwۿCۅlǎOW)T{|K?֭}>~?w`˖-HY1QFϹ3زu;:ıGyA-[>gϿvhܖ跮d^\FN"'&}L( 7_>X9Fzm=wߺ{9)V׸QT3 !ȓ,Mɳ̘iM7O <|- Y LэTFb)RH BomIBf/+A.%gy;==9 HP @)Dj% -ۻWUUeelU\-ג(Q(D `L7缷߾3f ުp >9stGol}ȩw:gĆa"fiRN_uEyQK .sP:<k,*P\z!ZS AnA3)%(+ 8\\)(+yngn~,wgNӧ8x\wѣ$ϝ̅Μ=7|{^zi/'x%KvƑ^|`?{f9aNB:[$ 0%Gs^A ʕA:J1쯳S9 ǹ=~bƾx`HEVOqh4/E-$y}v͢dӔq]D{EAhs]*T]c ع /MC$( URsz4!̙ٮם}I~iB&1_ P{oGidK}8yvV D%B ]AfI3ՙ"+JFc-IadEN'h)ٳg7/q46A&`/pmy<|G+rJ0 =Ƚ:"-[<{^-3|5eIĄ*.V[/(Hn.mR&Z?IAeYGpaCylTQzڍrU\'u|ofw0kW^Ѝ73k/K=.ʢgǟൗF1A%RǝKeQ2r`XjRr9>?Hi%!XV_{!e|}üKٿke91]^;<x1zNƎ"v7/TQśvbmɲ, ߶{{Idi:ƈLQ)w#IGAWa ZkV%)ʢ`25N^2DJB\bScvK΀lbCG enMY0 ܆NZ0BĴ `4Rxx[WIݫ-k3իY,e/,A:Φs5(rI5Q4CAnV~wTxkeHEŎiیҔݢjUYRp䊓x6/W/z6#/U`_[ҙj!e ofrje͟L;:abC{&+8.+(4(CX)JN`uy\1%T G |<6rŅ AU$|i2g/}VWmQ'y 6\w-| ؋/&z爓O'˿9B*>sƪsCK=lu$V& ƫÇ@λf?8&?Qe~TfXjfZf&eٚtPJ(Ɩh!{a}y8F`\HUZiEMiK%CYU^nOaDYv3bҘi%-˂<yA#rp1+D*3 oa![aأb@J .$Zi Zۧ69m310O]hB`vٚY9")%Q!TRڬ LMO CY%nqI {*vַZZI'xr0|NY&qXT r=ǎ;-eث~4$*OesׅpW7]lN=5c7~vhfu| h\Kko/8~4Ա Y8pbWګGY[YY-uPJz{/O>yU۟ Gx{Pz;/|o̯o11`Iqퟤ/O)ٱk7\s=VWڮGvКacm,KU#턲2Yf#IE9n]VqᔰUYb+:ӳ3.{4Liѝ"M)DI5Q.=%7jS^_d9jb2eQ yV4r5n_m!%Jǯ)kE[`GR6xYKa ƤDQ8f#UUl_ (n`:Aו' C'(BiY0 hʼnϝ i'.p;~Lۢ.@h'$Iӊ׎/{_R.MqPpJs>ib3=6M p,Mf@k#Ns.4$lm jO">ٿ<})wl3˷w\|;({:b9pL}kSgC5< } 4P(sI]@M27HS.A2*mϟ;G.f0skycpML1LsG2 ,2 jhQ8i* ]rVjљp= "Pa4ٺZUV]m"V!MߴEJeǍ?A2pc}M-Vܐu'hvc 6-Œ"cM$YSCR+&qNtՆ((uE&$Q2==L×U(v,r]w9q}Lp/hͪ'Mφ 76?Y:_nG1ebn'MZDLn꟭;F!q0Ss}ծET8AX L m.:КXܽGz]:p #~Z]n Wo w?1w]w=kOsd~;_;ᛜ=uhHYP2?s͘Sg'Cfv‰jykIG#zEQ1 9N+m=PT²r3u[RrH4JQq*U G ['[ KKaHbb;R^4#Х뱖TH\//l51LE$ ȝ,$c0rkJfYUcl

@*L@Z ˰0r$ (J,=cFlѣaMAޖe? >=o1'/5MvsQP6[5fMF{;lh8DArKK &4+lF(Nr[ӻ瞻N͐W+o~ZjcU$a?z&, ~CÈ]{0ϣ=9Q|t]mқf_%oikp^+×ʩ.$!ùM5AJ_ !jkUgl $tQ:,@!;7)+<=AJ7Ch%-6VWX[YFIGQ[s)rh* 0l:՚ Dpql%E/ ]9A OfοxN˥RnY q5[k6Ec߭MvOK,;,u;cuȬ72="IO/~_R9?%ᅬg~aa(O#8jXo8,u $nulʎkQWܜ+tj挱cz)B<زa)Q=Tc8u*p iNe4ul2) ?}'…)Mu C |G);;!_N8&PΩ$\"4#MS0 IbFWZxyL@*yQa n%VI4_*@EhQ%8J6,HRk鈍ހ`@e488hwm7g-s6w<'3.ws7 [ t_;95N,{Tll׼i`KE>f Z>Z1zF B3YG4Vb\ E7orɇQ<~\X 3Ff=ֽß4ΒCYsoMŀ@-[}1>ocn@{Ǎ7cs.m~c5QHEOWm== KQ[XYs00J:]6!AۙAHE$IBi~5tX}"("; cn652/ 7n^)nKl_1|icKgQDXy^׺,a%EI$qRyU1 SFc-T%fS9cd~֗Q|\7Lx`{B81$}slxƌѮ׾:4f5ŲK"95,CWïg&ygf:> ^sG)xvtHtM* {~t:NoiN7I+ ٿc^~ nرk{7NY3$jh~fS_<=2C[ / ݼv@ߌUnEc e5dEI8O)P91ZWVl4"KSRz4s1kLOdceeQ@JeRDAPps RF,QT@:v JoQ{'7w6\v6VaK0)EApg̠|"Z0)k&4kvN]ܛxx4Nvp~GxG%nBǨIE^p]wXo@oͷ6 m۝.E:] `Z;.{ !ӎ R 1=g,EuśEFWSe$.\py]tRl M3?@vtJ#X% D%quEct%;?pɩ7㹆iH("sz IDATix *TvXt0$~zGwb[FRM'/J ;Z*,#%FWT(#}Z@[ K~|yXp8Y.@bբJ! /Kv,-18׏S)/ x9|֑RlTVߎ[ڥGUb^Eٵk7eY>wa&W8x 13dގC?;3K^Q^0E CU8zp7dV$q@sb7E*J/:|c1z;c2GD o\X(DŽaͽ8t-a+kGR!n>2EzZFQ@Dl-u*x$[)c,]鋼¡4A7XC,v!fs;PU'?+gЙEj^?s?Oy(G~y%W6L[.`UE\ ˊaƵ{ {)QQRX@" bcpϢ(I (r \'GCdq053EQVTs崞ET֧xVsEsG (rv UIӥsYa4.xIMll%IZZ (V4MZK{YCڝS3{q # -V oOr')[,I_ ,]Ea)+unYQ`yFG_HyLˆYќ[_AU% sVڭmꁬwv# {s\/mo=E1irf&fp5it} kJd8&d-\9}smv8:ҭi =۽oW1NYd?1a[(,Xdi턏|R9EgzؓOq`+Nvs3>pM,7=ǞCxث(_쎝,4rnVEU>Νg-lLq;HK_Oh{9ᐳ+Ҷ(uAlp˲P;8 R9ɳ/ሲ(iMT1 @3^"Èv˨c81Nm4ZZe0Ƴzp1'6H( ]Vnqec 3=˲d"هY꼅E$t)ηߩ|-eo M@Ke^e4>}ko>1J>R!ZեeTKF@G8y%rZq4MgԦoW(J ƐQɠGHIۥnvwSm9'ѱ2nt%pQ\i]kny] _4;5ѫmD_jbrI΁CQQNڀv|}p tBP֎5>_+~pz_XC8tgg< SޓPЎ#/cw sqફG>#} LOMS)w-rXܱ9k~Q6V!]Y9&;o{w;{yλ{w}~Ä>!?Sy-+YNu8nqMItZ\{|ixﱱDZX.grf@+; 5PDQ gg@@l[^p8:pyT*, UUA`bNNwk*, ;d`jq+FSJH)7b؎8HTe. +(rK)vF#@ R)y>F PQpg 3Pn% wƐR6 fعo8sG=v7![np笯28Fv^@oV5_3s& - k.$!TE{֔s&nh(wؼ4a!vzpD62VM2ٱskof3 b,,gȋ%`0ɜe4 gD'ջ[@5XBy ~JB<#m*j{hVh˴H0&++J;=`ܚ{k?foC݀ֆn;!l"4ٟņc:5E㚟]_*W-ΰ!Y\Xb}}cʳOfmm23>~Ν>?CYXw7P8q?_|pÉ>]`qq &}bIwo%+.0S?omw}|gxJW[2mSkeqeҭ+V_EIh,BJg/ִc -+z`$պ8TJᇺ Pa`m@YUL2 }W% *t;SEQ`sfS֞W.}7Ƹ\:ʛaZ~U.=ϽP"/P> 7n]KGB ]MYb{.bnmomȭь}ʼrfiw$IBlڝy3|^)W/g< @WOa@VeIE 6,͈T U9\2/H ypq²FEX 9 Sbʂuo,d(N E[a*wңgfm)6#"Tȇ)F @4T+W`΁d( JB Ŵ(k83g3k?iN|Ա%f!0'F_=}9lui4?hG"-o;w3vч͑#sͷ݉WwBspͷQUn2,z\ ޳>'|jy 7MsWY_]g[ηX_;5^2{ʺ{oК$w+u (*l~3BZ$v N"CZlYmLk Qh.*6F)}UYQ~!Ԧ}@xcm۫=E{f ^ދ'HCDQ<\KIMvAo**! ]cNX][۩*Ƴ\9Ξg0nhuڴt:貤,*:e_2;=յ7w&?a.ƿRHЎRVX)Kg}affڇ85rQ^.XKG@.#¼ B)`qæAQX: I|ySrB%&8 ]Th4yYa 7NMx)`|֙4VN u]AH02mO [5`jSI t2n:tw<=ֆ$ hBc× 04@V߆w9ʢ (FB3' c!Ɔd‚Նvlȝuu͟"<-N$\ġ$&nH#>vigԆ" D,[=ۮCwIknl0 VAZk\G& DaD$Iś="\)Ic+qת,r |_Zo÷514 TtXF%;$|k݋X q G5'KZ*7JI0t-ʲB r͵ą 'e_ Z)oZx hV~)$41fT2l"V.JhkiǾOM3~usG~,odl o+Hɴr[-G?< ii.P\l {i;(=5k!G3sy vU*cyyy.{^Klav)-6oɯ^?j<\Ts!Y:"(is!+vL1iMĔÑSfs,A=V6.*Xsմ]Rn.3GT CٱwUrVNaN:!(ȳe@)rs7SZ>G𺆚' €-vcK k1MW)E]7%t:]ϭi1!B)8^T%J" ft-SqLe[rmfRTޠd6G 0BD ,G|]J5q%3Z? 6O] =4D fU%zMy?OiLZ`ZZ~ܼe^Oggn~< L̟ߞi/0g.;YZɑ=CeY>'M3`~kS'OqE0- ^巃M T,J{+9.C$4 WK0+!Q̫ `88li?ZkCR穂b80s5VB_z5ϒtqz7^8%Ue5;?1<SX( 6p 6%ȳ,SѦ(d~~ A[]쉓]8O>e9BcUX7CkX΄a芼ϗ nr~3zl+V yqDssݢ}*^9^+v6}1of]7<7΃J1^ J!I#0DXpH6Jr9A@fix)&Ġ~HP6ü??`j(r=WVΨѡwj OU4MME, | |䫯}]Ks-?o{سgiV0;3ŏ?/q4qu7?W^By?UC ܙ3q|[[]@,"Nǣ<*P-/0^##f"fY@E QC5OݠWO] %NZ6zX:ZSd+ZR"aa KKd鈵 ˎΈ%tRsXHξTc\l|aM~HeQb+ʅvNܢv%Μ9è8RILQ~V6vNvD4+JZm 荲KL(}v^I]k-QѓPJ2H 0pTN\wR9+c 8~xQ,0bFs2k=5qݻYp: [|ޛ81aPPH8ʦ;,1ZQh0hcAH5[l+_lc\{ԋc S3QjbSLj (HgysGf>}a__˦K6&9q!yYRU힤DrK\hR.ZC@aЎ[X[xLfgnL5I `؆8[шz3O cWb~rPM, #WֶBK*EfFsHތ+'g*cam8ζΌLrwo=wa~G~TyŪ־/WrAjaM/(ȧl5, (n˶y15]| 㜈QRF1q&qekwBf޵4NYe`WXBlyUHyyܫ]"3CGqNk:ѡ؎GiO"t]uzۯBX&Twa4XkLimZXM',zXHH2ۢh`8uH XDܦ2+Lk5EMVk AC(AeQpCZ Ԥu֨فko)w) iY.,';\֌[G灕O:[V:C"‘ٻ/~Slɉ<=ur7ܷ+`6K s_%j*.~`fj04}#]P {]k R5 [2 /ZKV d@)|g2qOE|D>`q DRCC"F@H$ޫ-`m a#OJNIJ,7E>+rUXhZfa~3,ׂFJ& ٙ[An5[4=$AFY bC0 F{(z1ql[iɓLi40M(Jh6m8AyR RU ~W+\Ҡ*K+_WOU~lcp jDUd&Y^K=՘E\w^.Te^z@fyD>ocL G~ǴmMOYHsĭ N5ͦ/ cnNvuGc^9XX王g/?g?)>k:\ *0eY|4_)9kbqh}fUȣ,$烀`80uI=FaHDqkRĔ["YR UMRJ/0c359`8by9Ce0ns(2jőR2PccZ6A &)"=:pǶz4%+HlsB0_f8 _u IFճ8xC@3! $֚/!i|dJ"5UkYW܋M:ei3+"Tg̫ Sŕ,*a$Y luB؏0IIKR;?W4LPU 3CzL,;VS^Mtvlݷk}qq llu9}n$*6ݫgun'*l- [$23NddnW$8[}3|5ρ] xv8[2H6 diHC@Ikz\OeUNd\9$3E% #LS Tov_Ȯɔus_6 &'wE8:6 DwJ,ғI*IRm25Ʊ4E8e4Ab}]L<]RU)w>qb($oӶpL ;$IКΜCAELZ+Vl&>R lT̫DoZQQ)pgbEM)* W8SF4j <嵨* #Q(b<C?7"LRn&nf~sn>|Csq=~)Lbuy]Dg5|^Osnٰ@䩃oJ> q\4+=^na.yqy#СC=p}Ng}h&:ʤD Af-3SQBwxF^0 )BhwOrz t"KG>!1>AszƲuкT(0}$%iZS =Q, A9'Ma0=9i$ıClGGI0"ʈc^U[LX5J7SK8~;7|fbzYLb6tGضlw844X #Z60`m᰾r/&Ƕ,Lf8zlM*blȦdS,>ҽZgoriU}UQHnQs2%BZ?p{X;LJ.J&v?zReߨgG~뷸LLL`Gy$8s$ O0XxaqxA'N>޶n&!S&$W@:e;}5FSSl9WOL߷}Km>?t8`}:a^g昝0zIRnA Z3SDAH;t%U~x'+ ?*LБ̇|[WTiG ]R(|ul8I2]mD$ux责rvN@GEk!tL3fv跿_{j2 gyR*6H@f{Q1rqQk" ooo;VYȧc<~P3| _*w>}_gzg1Nf-buy3O>5[Kt9]^VBҾZz_s~'fWǭ'm݌~l'$e̝=̷|pǸ7iMLi{ÙUX[)yi&ei["iMLuB_8С˧>633ZΝ;?~p.Jzq1ǩX IN3 ť%.{IڮFZk)2իCCXf8Q/F)ZtCng]^ў1M&%/?,~2e(a#_5^8% [6DY@2D̵mAʌfH1aihFS1Z:'8Bmq,!hMhwBaQ0bD*1Lg ʠT/PFئM32# ۲ t_8ij*ca@.&nsס5?rž=|_k2H8UAP SaDEL;"6y։zSj9RĘדyn`΂<~eAm(^egT 6Muj![oZ6~mݎsΒ)AgW_s-_;j'3/--{Ǿ}ml0 G;Qsϳ~23"?z($At}P=7-3J5-:Q-AY[:d< /"/cne Z>Q-0r]ؓX%:<<^7tظmd0 CY3-KoPOf_0 FF?%NuSs2R)'i&6L8۽0 l!FA$ J\=;3t6M0-K%1qG1Qa^jAAqЛbǓ,OKT> ٤# C,dǞ=,^X$qhu!F2-fw ;|leY+wd( rKABv5ȣn k^6N*JB }{yvY_y]piHLFmٮw^nvww6gϜӧN7s[0o=?p}e8ǟ')\anV~шM=va]mw?>ʕW_^RiioWb|ǫ A3$R$~۹==m`>W.rjaWVaB'i.4-  #zMd\vF`4$ uhA#CE7 qB5U5RNrYmT>)m'p=(E,Ű,q]8f4ibȇf&عcC!K24@y3Q\8PRhxC%x=}&R[JR2w.݋2F2JQɔi&&'072aYյ 2O3,?Oñ5(3fi2X\i4a01 ^8;DrzGUqaY{^5ݜz$:.N1F-T(Lm^bcw3 SMnfΟ;AO^o*KpC <[r/Gt6/O'sޝ=eDZc4e8q|'y'=~n8xሽv bQWRJ]iFĩdiG v_7K۷g\դȊ/j{3a4Wlsϳ%NR"ai7H-zaJwtWn֦ 0-\_wZ^giJ$ |@eF$-rاLѝp, WIH$!ӯf&}qL"S 4N@ р$Iuw!<0")q5E4IuD`eE)=+h=ץjؠ%12c.,x8y>d`m;B;γ3‹Mv0 <ߧ93BB" BRJɥJy7}J(>jԨ:C3ht&_UnVqdJ =AW*vo\y*sc[я6jBPPsKg!I;n?yG?!Ͽ|+vnoSxy}6'oY'a(ěx55=du8C}{w;oƫ;ffIKGȑ\2 clߣ՞M(Qe"Lo!iИ`&P*^*Y2) 'r,^JEF5i[*+ι(.$թcm$C"a갓$I幌ЧIBRjobey^(5!l4-U7 P4`&!Z&mۦh 3I')i*Acmi41M`]eJno ˲9x v={wsi.._dcC&''pI< W4:qE԰zgֺ2JY8I#&`x"pK'gDBԎ91 ;k~?y~VC0Tbsy2Q^Wq/gj&.s'䓇wߍiZlltj{/%H$w~~ˏk IDAT*6e!4LC׫7ßݹ `ՆWprU DTFl6#=f`ZK4=18k:[2HgXh=_GQ=ٕ@zxc#5M% ̍A{2 %$T,hS9O~Sm 4LhuL&b`V;-յu76tie4U /' I~0i44ZMAS+`wcaa&a4MF0!ӄD4p˲4 rʤT09u O87Jcbv9֗W#0*c?N!kzWU1M]YɔF[n=xv^<2+:SgĒooy 7v+WK ?~[]呇]_~3ou+Ll`Dootk 8^)eMWUȏkyسkvÇ>G;Ÿ+vN_?:zj8C(Y Pn)::aK>x (O'"wc3]JITӲ;( X٥5&yЮސ0Ҟ9mc{ 0"mVtd2trg9EzGn 29k[exA +(^Ir KMdF T< $G`Zpl359I&SFCFa@J:^&RZ _FFqH/S33&F֝UY Ԧu 'M%}izˋ$IظLt|DJp0@)SzJ:K G8S ľ}[X`"3SSLL:DA@{f],^\`~ vIU"U qA \QlGgysux?.ui}&2ő#ISVWY,.^#np\21CY*0skTR8^BGZ)AѤny.]FViMA(q]4Dd:0@)kkA9jLLx\ dJIdc8Fkc7 I\18eRRJKҔ$Iv PDqr^0gnΝ9=\qAN¹[^BfW_x3v4,<;ߊi;,;w G?˿?X. n&g~ p˟Tw^vcnZ~{dyvgIzEdU($ ubْ7{z ws~i@H2I4 1^ʱ(aLufhO2% q:ygEOCF#F#tp]!T)l"SLakad)JYLMNl4XXXbeeeAFFbFXM*>ҁ}6Fؚ+o_t=ҧ?.&Z>oGM0?:>k2)d%}t׷^\]<ü|b 4e:d*XJFٵg^>K/la.ohk5\:mZd c󖷼'^{_ i^ؕ^ՎG ~sT)l-oH7l(et_W$QD&ؽӧH`zU/Lv玛nd}'ΣL C)L"!b0@#g0 MzfLiBU%2~tIeP R*Q{a+Q~J>]l23=mY4>W=p*1v,m`&Q9NZv1ml%DA@["(`arlKo[|k( emƚH iDI!p8wޡ$ Qf"O*505cuw?wX%شE0jjzQ)PY)K2 }X^^cϹ>ƕ^*k268x5)\}L@ 7@^O;ok_ohw?5;yVsMdK>D$ FQm$IcxK$2$%Nb&&CaWf9 +˫ ˆ]Et׻,_\ݲ?ɇ xfoJ0^ĝθl ?PxEEX8s%C8EH:K84ZN;J &NdZQYP3K8 kZIg&i;&a{^# Fy+K $ncn<_g8[1&i,S`믿|\la(bB:eQˆJWJSNT;/}r忒G2֖{tffY:{ Ipik]g&#SМ{-.-/*jtpGO VeU7*."CWuu߶2yǜ9{QFoau4 -mZzg؞C&cW0(SyzCA0fX63hhh4M4|.!Ef1(A CeQ@;`aaɹ9,b>: 1L1 g(@6mM_h6A儲U ~(rrFE р~~?c.xA$^+L p.mW{O)SeDg{g~.`:LH)}gF)g!dW-]XuTHB;T& A(~ ~QXvQH* 2X^d벱-,!JJO{<\cjLӠjoDhI EnV/^z.ְ, USu0e12Ff%i;wiûvȒ$!,DJ:ZΟ=OoK%Am e'ʵ>e]\I"I(q=VAf0ecڶaVWH;Hߵem O!Q䬬v ҩC2u[jRGLUT />]`0?Y?|N szrh~v=⻇_(?ua:^^|%qxGlz{\A'OW7[Z(NE{}}\\/Bm?ϐ0??[S瘜Ł>sX # #V^M 4N( خfd5^W/)kHnE_U UWz,?Wp[fdڀk=;iD6XI4Wr'@jj¦Z ئ|¯B:Z(W'pH=}K04 z}@l4(C9++vc,'M# `rr?qr=DzrlSw$NnӜ"L&1 %(|4 8! װL5ySSQp0 CiJ&G$IvxH.BU ʩu|(6nu"__GkHryN.}8x xyepNq$ ⼴ :[tw>x b!3Eg7 (Nxmqmw!Q~S+5, Maqa}+$r kne%~.X6I_@Tlpg)vVnPŒDdUrc1uȿvK:iʅ'hML\" ή AęQ+iBNVP(C'B h\+ a\ ݘې/C7:vlR%QZx.~0bX训&Qmrj ykq M#zݍm[eLlaݍ 8fFeti4 L$B880R6;3;R=lYE} Y|V;jY+Ղbpj11jCRQ烄>o{G~kt[o|ϳwzN=k|,/wq*0Rl+m< m}w /O~.uL901nʃW?"I]^xy%z$Ň?'Y[`8Loc9|C^\E\O<Y_X1JlL0-Ye+qRq QX" ul_WDgGQ*DR%8Ӹ5+gϱ~< !x4bisa}ȡ=+ F#9E~[譮{eٳ<zV^bG@#N&\Y3wq{3e ׎ql}Wpl~os'?roQ@Eno~w3OOeo{KY[Lj`{ S;YV4QYU.>EwYҁ9SZbeO*3avu|+W;jwOVAJS r4-b<]0[U>̛$JCU~ey 0u22!tpq-27IS,+6\A&2Aw8b,253ͱG13A'\y*.C3Or uO@m9AR~F[E)]>O]j޻[oEΝ:e$i7[ S>,-ӸhrNU{0`̋,'WӒ?Qb A{0mZYT1 o 0*;m y^QzókֲrT_@{{Q3 _4pX]Y&vљF;aI[*8v5*nQDZuԑO .#.p5W0\_s03 &Z33,-筿?` ]$٢Q</{LNjtR٭ ~  \1;l!ee;<#06L9wgnf~B\c\ 7ஶmEꅓk4 u9nq m3=3yp!Y//,b^W؉lگC328?bmߥ$tDgEn궛P m SuܬA^NNJq,Om2e1m BQHZG@(h6ٹnW/8.z J@}Ӫ{c;u)~_Hw8&ړS$<~r$2],ẸKjŲ,T"3 J3fIڭ (d=~XYxDoBW~!+>R\aS"Ff1+~5+|a6t>{ {<{Z.bfW݋:些o@&1 &0հ|\$Ixg9|Ųk>KQ{F'~87t] gYp/icΕyJ+_+.tj@/f)_=gVӚj˪,Ndcyum2i[Zs CO&?5^Ո(rNȌsd ږu,@%[0Y1-[Ul96K0KVhL3F5 2YUc4Mrdעn' IDATu֮2mzdJAŅ%~{/LJdn?}mZ ]W\{׍'IR B)vV"4(cZM}KL0\^(?2ia&*dEa8\?c<:m4@MwWB{?SI63^ kԈ݄& CU! 1F2N)*R'@?O!v͕?}V68wz=oyM^8zT/(ͯv'u&&'sq W3k/ͯqfEc^K[3;k㎷ǎHdzܩc|/3Ȼ_%«FmUӭ]}c q;jQP!euZFMi:M_Fl(&M7 oiʖ;C\nwmim6}"2/~^@6*2 0DaZ&s-FUh6[iJBa"hvZ(1-8X[g80 !8 PjS^ `9wn,NXY~Sw}cZD\&e9m2&1c96BiXIf2OdIBF AXpz$ 8&"!عl cu"iŵ q8lJ/T0]rC-B TmOtFͪt?x$K'q<O?˓O?ÇL4Mnv^}4LN;οߗV_xqwnV(C`C&oX4s~gQyTOU$Sm:WV͌S7@eA71v|&rX4{I毓5JHGEd0.Od QتV003x%)I 9tX误lQ&qEs^z5: *r*l*`&}a+rMo|\8~*uvZӱ0L0L$OVHcęu2inq]TO!s+Nw}<ظG:`wU &Xit^u$aH$2! ox>vc( ) 6י7²g> }fT\㼑* "|Q\:@eUGEڔ~tg;;sENqݼo! yQHأOУOkᅴG~QR{Q|p,UAI'NXl PVZ'/jjQ)B.ǜdk(yQ#{ש:bfYkz˅D)b)*'~]AF]FA0 S B03=];9=D$QXr~ať%$-H Nekz8 23]ZccH*IR X1( Q|;|jK%RK@ ^#Xzbf!CjòHeFnl4AH0&I"$Ֆ 7pl+'Pfn F\w;ΩS9sqsgy1:^u~ (@E{nY&1 cY7uTcՏ"Ll8R:0L4`LLNiO!Ӡj㰱Jr4TC$J7Sqde0oU@Y{n൜m}K ԫ,Uhw$Ϟ._%ַ}UμI;5ηq/}<_˶t60̈<;9DcrSc[}䘅B2.Rƨ)r`ܸςQzʸXBœ4Oߜq!X24] RH$C"$ x4g3IkW/mYe&j!5@U]Ebૼf>0eimW6e <%O3V> #\+<Ǟ[i$Ej{p0jz:,G)3J)6ɵ=$y,}G:dJyd"Y+iw;8 V \QkA5:Qr"Yj趋!AKi#c{J9J@H,0:LYd4héj {Y&ls4!8ēO~)گ="UϢ[|'+ cIm:z_wéheȻeg(kP]); O9Н z2 2^?ßB2Tqh6r(.í7dG"S=z \ %ycRՖ (íW9i,+ms+3Z(4>̛` BRl y>G1* i ґH4V 8A+8agZu߸6IrY[@+]eOkz5>R<'ϥߺo.}q j7|ÝϵsVoy[z`{xruoyf r/s4~{=-  \+7BPSڟ(2vbe@(vea T k\E`8%[S6 ԤjpO.z &8dU&RA 0Y{IaW,橄&dzupKQLbr L)۰Wk9uh/4Mffގa;ޗN[faiy[\G##mK3A` c(&-.'?|,];Ke)`fyKϣ\ѠOh" (2u,#5pN^RJrSKG"YV@ Uu"B)l7 mD& 4q]$EeY< 4ϲ q!fmVoF"t5}fvv:lg+Pq<5S $A!mUCZ{ɫpZT@90))V;|"N2]Cf3{j;\@/ Z25^|Ԕ ݩ{!jq)nPShK9T8rA/qMvM) |<20WnC?VgD##e =,GZq^z,O<}C\yq8rkFހаDZUe S^iŹIeՠ`_'c?U[}3eSnPJ+-!ѓggJ@Wmxr+ٹֳPUͬnaosXtS}Pkwq'onjy;[Dz8r?>grAog_y5BV[lȓ57֙]i <0IAsU85R"ͻZh6~MEY㺦sTXh! (ʺd*'rxg2|<ϑA Q4Nyn8*\$۶a@F #ySc(Y\iZ6:Ӕ#ECs*^-,1i>g@ ="CEGg)"\WvY^\din-^xs n X9a^e7& 0PiNB< O'=bB1&asS2CeDHOV_xWail_d wN[J BUb1qkY~8Obm̹ˮLv?;)- d#+̏?nL_3~^eafl"j ][X)΁TkFÑc 3@V $͑lj(ܫ#$3e|/?9#Dׯ]5#S,t"s-6,'hdg`d9z̭ 滋E!agQJ WZc$Ipl(+,JTN=zI\)<%Ms#%Y1 GK0, 0?;=i5W)z,/-t0ǎK總WE^G8RJ>v0l!ٱ.\o,97ki AG9M]ٹ.'lnnqݼɇOFnmr!!Yqx^sd =־[|1pK. %Q`fhh A S}K֡qtNAQg0,~ZaWM95zy8M߫ݿ)[AtWJffy 7ޞZ1RB??MַwkɄpִULshv'p'0 C0BI#U3ј@4& uPB@ _jCUZZJMtn)Եq웭)KS5y>E֟evON=xRZ͆ ᰔ!.,P?̓gƕ+YƑÇYZXk9 h4h5X> (&gHRLmAlP÷nrM.zGxM}vEHÇ9i6nrTX)>ݝBI|?r͋ yfC*vkf^t -iR֩Qc{*,PNjhBGua(2ςL0r .B(qֳ:Mn,EPA6-ӕjss5Τ5ӭ emRj ݫB՜VR(p}4yTr\jx1f[>(&Kr: K^?y[I;}qEt} }x-Ul$QX wmӠYn쥨3sxO+t:5 36l\)QZ&5Ʋе9YnepjUi4U+TN$Ilvn,GemZF )ܼ7mlnr纴M%vCwvHI&Z@FdJ>Q9Yɵ٩a? JS$&33<Zsۯ10Gbkk=3ÉGb4~R䲷GUߥ`f][PmQ N%s"/ٚz 0)/"G&bbE*eZ6vTD^cTݣ5M nňuQZBteqp2q ~o5 IWaaGp. kPpյ닍W߼YP)ދ{84Z7Ν-1]9am'7Ke,W vn VzQ[-4QI`akۖmkۼCcK%#t5gsjKGƉJ)rYk:GdQ1t۸[%IR 5vi~Eı Ri333 hQp4S(u IDAT^2mH 7<47IJo"ILlZLItJqҝBu̔( SZ LJ]']DngnwNB >Ox[1}MX|qo 1u\pFJV~ \HQBisYX Fʚ 3 HN!-Bt-S6MS[إ궐nͱl]n_q]N`0 #;7ǡ#G{|ŗKe(QHdaq$N6I>fY\ߣnưKap0A7* F))`GFn5q=ϨaQ+MEv!اLc: nWX)Mw sG8EP Uw.z=Z_F^i hݧb ƝV覎Bfcȧ4WO1Rb*=OE}=)b>wS{]\Z& hvnFt]^T3w!_>i~X|yqdK[)pbeKG7$ ZOgj,v]W^bFR1xv\iڳ8d&).Fl-B3@yn dv:@s(BiYJeuiiie($Sp൦pcF! R']#Htvw8e))vvf \I8r ^YzC|'IA8p/΅ZZ\O~ܸ%{RluN<| ׅ[=8g4ԼtYnv/'+rd8$#fYZdK4@o ͅzeh{L]ƕƚ9JU QdE`M4J)p]4I$? IbƫJGX1rNn04z4s/t{h0DeˋI&Kˋ4]<$&OSTC# 6I$!N(pzYh8B K vGWw紖ֳ`;kEQp@R-0U&{vN#5A"ЫqVZL[fBAnjVtZ ¢;ʫܯ*OydLYDX؅IEV" S2iP]& Sa2PV‰,wS" cqi XRXGW7U=7v|I5^lmr037ؿ?BSkWoO{!v1Ɍ9N$qx(  ?-<'yQ.^o_GƊN:ULVC<̕˗#,mdY4U,Z-Y5aqvv QqǪ.VT>-=9 G08)M`\( I,7yt ZMg-QDVJ2ϑD1*ˈ!YS#R>Z}4-8@h,;7ÜpH*4F(iQpZ8Kh\&i$)Ql=rӄ@` T ײ&ЖsK̵ cl[Ms)&q1PUWAjAo9К 2AZlq-[='?|g\_c{su.\%x\T *3q`/q->ʩ^ IʫU*NYc,U.N!P6AT)ek4[O !I rA,i|+_Kw=ӧO=f;; f-PAseT3n')ihv;8V$J.Di , >Gxj%F6PhVEXMVູċ-+=R `Zi^be_ŸXH+AZ>d5ΝU a _]Ԓz^݅j}~/_:dRŋ.hmׄ\{S MV"ak]EX|{ԺjlR)|o K&Rܙ4y+4|Zc<7_D8@Ƴ۹I)9}_/YZ^C.\~szZ]xa3(IОp$\1]jƳV=yn~qz8qK\~<կԞ`i{>i=qsˮɬfH#) [f`a,78.Yjpn1=3,M9y}#zC4mV u#m1aU`4dg{llҎ:t:]|ϣ#2A`@ԏ4A1=Cm16UߥZtv*X5fN5dJ*Y>>F]Uz'gT(VB[JT1LHiqOJyF!X:Xӎ ӌk{#fϡ1l,Eie>Ayi8$zxFRlji3K24\x%Br"k)Jd>o-6Wo>GN~ `1ަ#5cT!,q fEW;MReOt\њfB?V}Չ_ s/%+bfIJR}b7_ pDîJ2 {U]FU})t$uL[$ =U>,@2t)b4M9/LfO-_.Զ01'`UmQ*YU-04Km3C1;cևGq{.lN{$V|:7._fwGfjqă|䙧y#8 >(KR\KiWQdj;In v/Ȳ=0<ב |oEjљavqe:s,1=S }7Py24Wrב1F#*AqF?'9K$`~~,~*ǏG˗y}(M1l Z!LFH#ئ +-G9tK q /|o]5tѲef2ZkUlgm&Z FZ7G#ш; K_8L{n%|aZdi°# >2zqHq\(8I&>ƫol̳4%c {w*V m vtK+8r|޼_aԽj M $ V^] 6jbbU:F85ö_CZɪSwSt% 3@lUt5% &qsUJ[KYO{wL)8WR-n J= YY +. 1t͜T*`*MbZ+#M(7ؿ/;[RY*]J5 *T93;=rE*1Hn9󯲻no`9-aښg8(:Mю:rfm]KKkmDVd2^Y\H!a8l!]G oښ#ݥI0shn=d k26{z6Y1Rf,/ti,tuwwÐ$Zs  zFQdf@t$WLwig }z; \m+Vg[v_e'Y@D3Yh([֝J)tVpc82??o  Xn}hf'nCәCeeqGgמfq I\Ih^FvtĝK=}Y'ȧ;^U,sMyc4T(a ʅ`ffDx1LWGg($ɍ8͑#8u!$ZN=D$qBdIjL$W9-z!蜕XZ:Lt#jC-Hł%* >v/:rL*|빸GHF\[b<y ~$6s/]N~e$1 QBА4IĈNf㈭ (irGh jL߿ RVJgh+3x^x&ꢢ*Ai,<}\!h6L.Ufgf@+(fwg5l2B\G8IW7wCĖ4<|8f{s[yk9w?ÿ5b{BJ*L;XYAfVWl9]!o4[^fcsz fØ{+e&ҡCˬU^-SqJgzW^ye*SߏAi CZvôZ-fggY57Knj4[/lXecdP;8K#};w:}n8|LDZJT63FYaȕVW'*^01cX* hp{uuΡ ୬୭9HvYD<\_-l/ jI-ރJٳ\9wnaR-2PbejJ뾮xy*XO Y wVW25B$\Ya`t^YY:59ң+D=ma>jo[7+grܹ2VOS/b Us=eryGH3Wr򸍕Ue+ \|ren"e׋@`\s0*Fz6ݱ*c&e p0/ ]s\Kw=m6e$8_DX}~D y{T'?w.PвsxݪΩ}>İ>I/nl疀k߭84M[9u{M`=%`q0'A?`08_!VVVm8`?vxןϝ={ܿwps08# q0A?`q8`q08`q0Ɵpn8'O噧p;w:y 'O^>8ܧ8swB}CK`dp_+~繯ϟ.zxCٿ?oour2ޓΞ=˹sW=Zg_jn5'>_|`/|peϹϠKd8 rV/>'?/:y ƃم}V_:_N/;qN/vO|)ڭ&Qc=0GA?'_{O\[噳X^##67Zs=ϣe,y8y(gp_s\Ξco {>g| ,/E̙SoǁiO~)>K ~glm t?w+VKy1R+O|c|X7;s=ǟ?,_Y9nl:>a4 y31Ͽpٟ`yy|{!9{_~;ݿƯ'3O)3?<[?ɋ^ʵ[Os^y"_38y(O~_:s_zy~2ϿpGq;gag>,Ϝ} /'̧߸>5qƻ1v2gΜ_ ϿG'`g>잿߰ Qխ3h G}]__Ƈմ[M{}ѵίm3 h 3ʑC&vu2 ڔ}]CbQ`6M[6[anR]dtI S"֞#i [rT0c#'.CuB^Hvw0H$4|7߯#3s ז~$isQ/^EraU\*?_p}}~C$O x#OF051P踛2PEYF2<:r޿l{=F!A:5l qx$:p+C3L1Mkl3Ic6*"(-LND"H|Sa )lmqoE @D#(3Pps?BQ˜kL%Qg?bBJmy\[Xm9fS}m{{{q7J8>Or%LߋFӭ{PU~P8wQ7T=uv_p彷 f w],cBWNG._ʣR`m]wc;4f-/UgI uUڣ 7eWzjsvjU컵hx~'B8`sIW G_?`Y5F11>H$Ywq(jN7P~OUՎE#۩Nƺ[h P!}tjו/ۜ5xuzr:Q^Ϲ!Yס:$/ 깙ى]{zivhy80 %5K/x-{n``H[v,BXrђQ"b' 'k/e'&hvBHa'&|B!LB !&ӖBt䓢ԏQ’!&|B R,FGHIENDB`DarkRadiant-2.0.2/install/bitmaps/delete.png000066400000000000000000000006741245424655700210010ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME-UIIDAT8˥1Kagfe3C@Q[ [ I')`iW))R J!]f"wȰ(셁w{Ν$2T]$o( YPV h%L= hC{8 ꘌYO5; XFp<4` 7MipB /7oj_qoF1 >^`ј_#X ʘ;_8 ^ P<&B/J{c. ԱHfVN16$%ˡN"6IENDB`DarkRadiant-2.0.2/install/bitmaps/dontselectcurve.bmp000066400000000000000000000003561245424655700227370ustar00rootroot00000000000000BMv(" !""   !"!!"DarkRadiant-2.0.2/install/bitmaps/dontselectmodel.bmp000066400000000000000000000003561245424655700227130ustar00rootroot00000000000000BMv( ! "   "  ! DarkRadiant-2.0.2/install/bitmaps/dragresize_symm.png000066400000000000000000000003701245424655700227340ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIME.2IDAT(ϥSA0kssC6CHᆤT0ƑI앍3KYgԼ'j+x䱇d< H琗Xydr~boUM>:q;L/ĩEIENDB`DarkRadiant-2.0.2/install/bitmaps/edit.png000066400000000000000000000014431245424655700204570ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME!"+IDAT8}MhEDm 6M7MJBChk XЂm`"^{PGE A{*Z`sX#؏fM`1!͚dw޷Fa͌QUppo T{(" X,dOS)brKI5Ba_X3;Io_c0EnC]?Mi;H` ^.Γ~r)ȍ|#R@-(` ߿F1gc~9mcuul1с_;X2_gxk(#M,ZϛCmq'atzڅVW64#ngu;o)ZW8A!?ǏC=yW1=&@?P I9.D5CB훈\+ C-3APCs. 0މ>z \DJĈJIt.]%Nٹx i$F-$ԚpZ4!.֒PkWE3(j$*)㿁 Q?DLwp7 D_w'bRsQR邴kw&K<ʁUhNu]VZI ުW œpM$|#qm Eݾ5tajhs.8++ 7hJnPCyOM2MNIENDB`DarkRadiant-2.0.2/install/bitmaps/ellipsis.png000066400000000000000000000002311245424655700213500ustar00rootroot00000000000000PNG  IHDR &ފbKGD pHYs  tIMEZR,&IDATו 86)lX~QSn#=IENDB`DarkRadiant-2.0.2/install/bitmaps/empty.png000066400000000000000000000002171245424655700206660ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIMEZR,IDAT8c?%B0j c=AIENDB`DarkRadiant-2.0.2/install/bitmaps/farClipIn.png000066400000000000000000000005361245424655700214030ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME,<IDAT8˥!OQ5j(H))&$Gb@4%mM˼;yMDuQ}0c?7]^ە5-h \X^ߗw-vhC΁WVߕ h#2Ms_RS/;#.Zm"[hٻ _HvȀ,?AUT_%WjIENDB`DarkRadiant-2.0.2/install/bitmaps/farClipOut.png000066400000000000000000000005551245424655700216050ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME,<IDAT8˥MAD-!9H!X X6!ME8"0p6tg[Ǎk_Mb k h6iB"qT!MzUzkk@+ ̢AɥePgjIkΤW`W`3ƖO fN ` ,{k2?/b@|dfsIENDB`DarkRadiant-2.0.2/install/bitmaps/file_open.png000066400000000000000000000003721245424655700214720ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIME+X~IDAT(ϥ C{-LS8tY-Āf`=\ճm<.>8*GW"3l1[ FXK0*}b)H*%RRN,e1O*bEc0!{= ܕ4IENDB`DarkRadiant-2.0.2/install/bitmaps/file_save.png000066400000000000000000000003351245424655700214660ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIME13jIDAT(œ C2y3PIX—<6H fZۑtl{rP+FAO/Y RS4d@Qfld%U7IENDB`DarkRadiant-2.0.2/install/bitmaps/floorSelected.png000066400000000000000000000005021245424655700223170ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME13IDAT8œQwtIԄ+"ET_BPDdȊ\A9V ǝq7aU%ĄO\ץYqi mw V!V|JW/fD U cOhzH L^Ƀv0es,HkG23W Q~qT姕f"qvIENDB`DarkRadiant-2.0.2/install/bitmaps/folder16.png000066400000000000000000000003471245424655700211560ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME+X~tIDAT8c?%R+zaza^`dd!rƫh lŀ Ij`?)Q`,Iy R NgPg<<IENDB`DarkRadiant-2.0.2/install/bitmaps/free_model_rotation.png000066400000000000000000000005041245424655700235470ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME*_NIDAT8˝S <,d}=A)@>()!&M{l͝@;,((, _Ĺ 9%kZW`T0)`$@Zݼ_z 3dIEZ5188v--dw׸!5n=i<~MwIļ8Wu"\~+,og"-LզHz/IIENDB`DarkRadiant-2.0.2/install/bitmaps/grid_down.png000066400000000000000000000003151245424655700215030ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME*_NZIDAT8퓱 0 ֠`1)"Ӏ@p*$7ⱍm$EҋmF.OhOYGşr#I6z&|bQHIENDB`DarkRadiant-2.0.2/install/bitmaps/grid_snap.png000066400000000000000000000006111245424655700214740ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME*8bIDAT8˥SJ@]C x,o/ iV҃`ORbOB Đ>Xvyo$!"1ITW."=P"c{, L[q9% =coT#s̓ʵ]t@)$2 j HZ;n*ʙBv9PcE.ʎa@ȴph&¼eN :W5ǼT S |,{!xaр| 8IENDB`DarkRadiant-2.0.2/install/bitmaps/grid_toggle.png000066400000000000000000000005611245424655700220200ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME*8bIDAT8˥S1j@oc–qV)\R /!!MADQ&E: <0p.H2hxP߅]̲mQ!@$SK@*sUHBp!&f:MF3x|GFH`/^D0 X;Z@o.{G-M]綾tn<0]zQ- mkKnTCWW^H^P7IENDB`DarkRadiant-2.0.2/install/bitmaps/grid_up.png000066400000000000000000000003051245424655700211570ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME)fV9RIDAT8푱 PŞ!X9D/[8FCN \^f5ZAMLyrdQM|_p ߒdƞzIENDB`DarkRadiant-2.0.2/install/bitmaps/helpicon.png000066400000000000000000000016671245424655700213430ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME(Q/DIDAT8eKlTu<:mwiI &H+T4Ѣ1.MQb|FMX ՅM$&.4X4DЂ`(Fڙ-{3ss]4MY[XQQ̚#*.0;5;=?02,Vʺ;_۵龭RSbXia^ȑ5 ?>b׀9w8u>,2 @RSJC}f+3s \tc \_I]]{;1 n%?1#=Mo>pٮu`q1cXV_ŴtBWvN!ո˷ H,^׳OڄR9Nҽk//p!RPW{'y;Ci*^;V;:r($`1~A$ pC<'Z!R)JUmJ(\Yn.!R <]}l=7],PUquXDq_y)ɉüM7݃D Sl M,̧nS K FUSvyw?PDyKIL^>Iǣ"`n [k d<7~WCe*gp_/_ezX\gn~M21A.c]Lu tбm_4A2 em?F, NH.BY oYf7jTXKIj`@ K Sٽ@4.x7kbzP/9102SnIENDB`DarkRadiant-2.0.2/install/bitmaps/iconDrawBBox.png000066400000000000000000000004341245424655700220520ustar00rootroot00000000000000PNG  IHDRH-bKGD pHYs  tIME!h IDAT(Ͻ[0E`Ÿ~wpO@rHxNҤwzj*aca )mS`vEA0 (5?XBhmuۏ#듎9Y 0=1<$af;9keC|Pᒺ[G}/kC?5f6IENDB`DarkRadiant-2.0.2/install/bitmaps/iconFilter16.png000066400000000000000000000004711245424655700217770ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME!h IDAT8˥S0k[0n@WKp|CMACncpI]0q["aI$">mPO8qߚ ( c)zìHplɨ9r4]K'o"%/(HB ĵ{jsn?YE>Ho,'iب2& ZOIIENDB`DarkRadiant-2.0.2/install/bitmaps/icon_ai.png000066400000000000000000000006511245424655700211330ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME(Q/6IDAT8˥AJ\AoD(DE) *xZl$ t6Ǜ SJm_:q4|Wm=bf%>F~#{2-1YWmh~$<5j4EMp%Lq׉Cm|O$]\|=XyLNC9/뵄V+7Յ*t5\ׂm ps|(9S5b%Ww>oq_XLsZOjՐ*&m.(9xRXe8CwIENDB`DarkRadiant-2.0.2/install/bitmaps/icon_angle.png000066400000000000000000000004601245424655700216260ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME]?R5IDAT8˵ 1 EOHT`Jf5Ґ RpeF`*zDuMBcKc$ DM 9 -!De0;͡A'܁)D\PpKI@ 0rDYg̀&`*mZM\&)jجSV+LJ[h2Sew>IENDB`DarkRadiant-2.0.2/install/bitmaps/icon_bool.png000066400000000000000000000005251245424655700214750ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  d_tIME7_IDAT8ҿ.Aߊ(;:hD e[ƭ% "! DFb-T4so6{s3g'Pj 7wr|'E/-|g.q2az/)3_~Ӥ vp W(Cތ۸nM)&ZKna9Owت%<ĺ[[엡o])V+)>n%8y IENDB`DarkRadiant-2.0.2/install/bitmaps/icon_classname.png000066400000000000000000000004221245424655700225040ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME'2>IDAT8˭Q 0Dߤ) R/wL?jv YHvvfdZlaz7R\"W4I.%6vZŝ uюqSPrXw pqq 7JiޯW<3}Rܮ^Q9ZN3ӿ '_Itw>49&6W}IENDB`DarkRadiant-2.0.2/install/bitmaps/icon_color.png000066400000000000000000000003661245424655700216630ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME'2>IDAT8˭Q 0 D_do z=۟ RjkLL*-pP!7SG31gjz!HӮߏ^p%MG;P{04:݃.7Dcً?OfIENDB`DarkRadiant-2.0.2/install/bitmaps/icon_colour.png000066400000000000000000000003661245424655700220500ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME&IDAT8˭Q 0 D_do z=۟ RjkLL*-pP!7SG31gjz!HӮߏ^p%MG;P{04:݃.7Dcً?OfIENDB`DarkRadiant-2.0.2/install/bitmaps/icon_entity.png000066400000000000000000000004721245424655700220570ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME&IDAT8˕ 0 ?GLGG-@ #nAG(]hx4KrOgDnXo !*`5Z ̞ fnZϡ.sXo% x BxH\EuuH%(a8,Y5Ƿn"ijV{E19{vDyj]y`6csAB#IENDB`DarkRadiant-2.0.2/install/bitmaps/icon_float.png000066400000000000000000000004731245424655700216510ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  d_tIME%oSIDAT8ұJCQ ߵp')8r(TЩ];"}7R8NB>@G7p#{CfI KHV&>0Rŷꐆ裃ʜMf9n3|YQr*;wHM<~X"kpbK.~.Fn!}S!PG̲ 'bQ|%zGH(*qhNIENDB`DarkRadiant-2.0.2/install/bitmaps/icon_int.png000066400000000000000000000005011245424655700213260ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  d_tIME 4\eIDAT8?JA_S(m,=*)ǰSZhr/^~kfx{`9oR] gr|W4-TvpU{` )e!\3{ZqB5g,b/,m\Tzqc-%m+W]A]!t96o-Y(IENDB`DarkRadiant-2.0.2/install/bitmaps/icon_model.png000066400000000000000000000012671245424655700216460ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME%oSDIDAT8}NSQ>chbhL1 #&DcG$h|}'N8Ө( abb(*ҋ&p[_GL4qm&Wg X.Ħ\X}E pʼ~8ϻoͻ<dN TЄVPK nl&"\rTD#dG3OY)jRnךU.@C~{rujM|%Ujm PQ%an9O{1W]d6#nX" R(4m@l>K>1 iӐIJB]KץX^O>k! ߶a[&"8yTN0#bw @:KXlM צ~x9UPkIENDB`DarkRadiant-2.0.2/install/bitmaps/layer.png000066400000000000000000000005661245424655700206530ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME IDAT8˥@E,P`ebiCl aL l6c"Oq-63Ɍ*K`D_**n"e4M"m;Bڛ@CS<9Vy^{,&unG$}1f~k^"Bu4M Y@UN'Dk-^#n7( <8عEQp8hoar<q!o6[.:&Yzw4n^0IENDB`DarkRadiant-2.0.2/install/bitmaps/layers.png000066400000000000000000000006561245424655700210360ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME ;IDAT8˝n@ ?'!j˔}N}1RĂZMu=:fH5X:>۟~|(=LU iy6q~ S'^lsUFLDQdBU[;ﷀ*e1tک`ݶl12$a4QUX,(˲XI"Gv"b8r`#"c0,2Nt:l|* :?c5A <4M) Eaǻdް[ͨ|>Wmig/CxAq?% '~~`[3IENDB`DarkRadiant-2.0.2/install/bitmaps/lightingMode.png000066400000000000000000000011451245424655700221430ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME슠IDAT8ˍkq_WWE/'d|PCEнekCKPcAC)al+Nj,e˕|<<7痨*ÚT`zF\XZiޢRi*e-;h*M*Ɛ꽁 ާ{àUu%v+K|,;_m[mV`W I!AD.7*mT{뤛fýG&dh u'\n1F#(Yͱ3gNs5yޓk<__\P Dgĉ `]1K;-Z&* _ t,S qv6Y۟0{xJqح5#(%ݤ~fcއ"IH+IcЁƳߵ絩öloQL kYs]`׈&$u'] +&~q9IENDB`DarkRadiant-2.0.2/install/bitmaps/logo.png000066400000000000000000001002471245424655700204740ustar00rootroot00000000000000PNG  IHDR;LbKGD pHYsgRtIME슠 IDATx[eq>>s " SXER7=8lؖa H0H鞾ޫ*3+k9=='ΜϾUY_nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnv<ɫ  7lO{6?̟p VZwwɭOn=s?c/G""JnL ! f1CD`63B4Dt+*"r_/߼ry}`b飣/ϦbAD30CJD D[߫k_*_ݐ*Ao?qqa=~],gg^x"14L11ljHhj,ffffDz2TNIEJAUPMXj)2Y)Rk!BUC@$@d1ՔYDOnD䔾|7[SroB\ C&f~("!2"!bBE @0DD4fb_jO?='?w? ϗ!3'!I LEHU쳗W\Hfp||WŤV!qR PrpyR9gffNz9s"U:ֽb\,.VWWW)e"‰J5PE^ w^]/?ut''|t_\E'>|H""Q8sBtsDI-03#@G 7|lZO_2hU$bf;_=|juyq* 41"*-/FUEL@rXD)} #L4.|?3 Ժ.8T13SarʀCNfXsbf@1q1H̦vvq)ZTTRDIJR9131.oy5?S#p||쳉 ok7Dďȷ(fdFѰ 0! d"$on{zG>췿OGV9Z%$jr#" f\J8>TjULHŕT)RTTT-qCVSZ8,3>̦Ry朆a<;;+k߻wGrh?O<ӜX#T5FfFR+!!x~zH0LDFZ Cb""i1TKs\C@D*&"8䁉RN>g>g~k_ַƗ?}px|<0As4l>^5P-߸f23CQ o89YPi 9A9_:#D1@ikfYL7no?6;o;;L)q"U55bon> ̔L挎a l@D?0 80sHfRZ-snf3@sz3䁙C."2sRĜ)8DDfn<Ɖ}#ۃ3*""UN6L_b B@$7^/?Gs}yqqÉ88".nػqԋ6#"zy k>jsFӈ4 D{GG|uzq\/?Oyޛޮ03 03PX{xU$&)! mOIMDy18)q\RJLΐ33KOBSQ{q۷NtM|?{||(UԬV!$`CX!;fN]<!%N)1LI'*"D~ʙ ))8V1$"޻[wC}'򳯾v֭}tɃWd ρ}A8DDsȆ>-'px ߺ)E1ё]<񽽊8,sohBH  +` #ᱰMRًΨ%U31?>&K9x>K?'_/^^]~//W D@M4 TR% $2"ffRTMi>CRJ9e< E-̜+`* jDÐ -qIUbRݷUMUn|=/0>q;!1 CYUkSRUb0#Bf81[ץ"s`3H #qb00@)1z@Cloݹ{:_ x^ѻ9:=#''U ƯplXYs f{s2(vVK<2C7@σO;_[LSQfd"? ! TIaȋrǜ0<Ÿ@jZK-\2$0U3/SAa+!Wk0P;w0z^{!?ˡq\³{82 ǹU+x"3P#b"f&4PQ+0"3DL(-'23Brhy6#*L)1=|7KOӟ{7 f>{|Rɰf`; "lXj-n{|o;: J3!9x#J=һ~y-trK7fE,bDM0̦ZT戳mQ(@?ݏa9&1x- !TΞwYTя}坻oWSNLD'P3,8Ki̙b1.0sq:h6t@ = fbNfx 3Ąd3X 15Cd|~prq0/襜`)V: hDdcS2 ѺZC)e?oHc8"wF^O5^+Z,{< T__Dt歋K3U@D DaHCJyR8cÜ"ZJ5S@2Z*`*U44`i~FDLٽ ǰ)qJiaȜ91y)" 33"j~͛o)ɓ05Sju~q~ԱD2:@A @+He|4ժHNU[  hNp&圪 $L;c DjT3Rp̤VNW/Gh]">g@ "MՈ3ոE㠤1շ5D53}>:v4-".4'_NcTu_Q"Bm"&Iv@NnB8+l|*ժ:'HnlfUT''p꫷/ý @DLc53jjy0Zt j2?px~ T u3!J**3`)e>1%2} 1%FR2bRH4 Lkf9wM M2D EDKÐ9e2DxV9MČJ:<T& 94#UR@!"9%5uCtQ23"o5W2N@djGKN!fH(6sHڪr d0Iwa-^ 2lUu,IԤUdyLzoOc_RֵRT0*nW酪1suG1,T0:֫0dGJgN* &lnh 'sVG}/*(T% :֕d9$RT AT <Ґ1R QrB$K0AS⏂:x$54 ϹYDf1LSCBbHWwnWjEI˞}xgC.r{S M;mA3EGWHt"9]0U`q^{| #`. -%q7GD6'"<|h=MCJ)JU0̦DHZ 0s^UxC`[FECyP߫zNWkM<u*s:)D\R굲SZ4,M)'3S1fQa9df~0!qrn)1rJDTjN&hq0>%asN6x$ '4}Շt=LլU*[/ IU Hӭ9DU2ZO 5~Fx!LuS QT3/ fh @B4U;9Q7?_[/ua&AS+HX/q<&)dRՔHcQT.<kZZ1!Qb)!5+sGg LLUDUWWWe*ɼXȫr8 zJE@ @Di B&BR[ Bb┠fʉZV uĹ hP­:LYY3 k}۫?aqx# H)u((Jo<31 &v$ad%0 C2yp^R"wP84 )%RUъD`8;HLL?*JGkG {HmkHjwoHo֩sЉz}NX]jTюam|9GE C"EPM 7XC+Ď.a4M\jAZVSJV5ĄT#!FYo*=ݲ-3)2Νouz9ޜT=:4  C `g22ZLqbylkWSq1 9qëhE"dzTKU toLm\43;"3lL߬F͉#i0Ӡ37H@Tzlq/KEU1{"hT,U`DbVUO;_3|q<9NJHð`*ruU00aJ, 3323hِAZUEdF*3nfU44a&A)L@UTj-R%"2P A*DN~4MzooD@ g"$I՘TELz VmPegR j]JhZDԦRT8"'ULM7bo@:>q$z)c89:됼sƒhj NӚIU``QxȈS(k6;\Zd x| o>ӯ鋿Ezd}q 8"W/EeH>MMeDjS)SZuFUIJJ+\9] Rb…'WTKUTGF"A7(Ujy[SU< fce (sDNp޿&fS!'V `Ɉ Nv򽉞 xȻ,!lFzqڻ!l~4{շd#"^9YI\$+7 ) oUqbg :ب+80 `(9n{hVĻ̼{ppWη//ox4Mܐ&VQ'BČVU٭ S)Ĭjfb=À*)A#?}::((U۴^:լ;qOG3qx$[Og";\144+!NqDzit̙S ڜD-%g:[t'sc9Yc8gX 7D2Yאem>jeD45m2O;>vBe#iicvp5>'{6Ionl¬WuH 5,(S~Viy!񏚉jbv;[WO8Neč8Ss©2cnZ;~՞F{5FUc^bu&q t~lkfTv8z#>2W`|Fբ,0J@b^V׀(t4LJA+`ߋMU%!82!sFs@USs-uZ,X_-Y'Ib\pƱ,֭.}~>]c˙To]^tJ1W41זt!xSlmdiZV(-hSc`:0[hf"uOuo]q4z?L ʽ{uf_=o6]k{!(p;oU۳AkqiĴsU5c Һįj]R9a3Gw=sy6ץϒoD<=mHTm['X 6I9̹fg.ޝRͷ+Ӣ\`u]Mh~v| xVFж-\p9{?HwI"ת:h\N@R7w>AÑx3iڕbJK6}|fm939l{3vG-ҵ=Ia@:ZZM|-)(t!PZݮl:=Q(~h1ΰc91Odh?%#. ؅~;oЅ3mKvuE,mp-Lag5xψjC-":zX7C.)"vu ||T#FD mNnCV7^(T֨]o /^рn__%?uin?hǓ׸vvڍ.32tvLм4UdnuclS86JWXފZZ>dDlI=DfՖs[۝a:H@^a\}nU"o%rV+a@}C /qm"9ϧ^wZH⭳e>|fRC^?x=yB\0gD m:pmЭhz!> YH`Mmj蠋3~U+Wk\I0<"Grg]Z"ŬMb%tSIoIg4U6C3^d `jF*1h_WِM͡ya>FXخF8xM'hWjMpܿ9?T$h"LZ#]?msC6$tYuOpE F°NFq68:eXWxE 2AўIG-"F@2,bQ{DZ,xυޗ!;yV;@p ^ DO<:AجNcbw޷c1<ݳ~7غ<:PCifHDOQ$ѐp3rsk3f7/βqG\=C5 o7:=6b[+wDk]MS`Clyvתz4yU:z{$"CUf ®zg9mѶGZ;x x@:hgHf3["٬_!oUF A K1‘B.T1BhY ص[;yw\s f9bvk=5396أI:zF pV6iY2EmD#Em|xvT YmrѢ|%Z*HۏثlM=3#QjZ#HWvHh0#qq ,kڀH8`\l jV* g=od:ze3ΔAfnMp^kXחo3NhĶKp-ٓ} 2͖*!%N?_F׮<03dv&TbNroܺ}!soiRݙ誛j'y_Km4yDŽNY燶 :co.=m?Q' {hFXө<(]TՑ{{ %L_}CZk-NՉ 8֘B#Mƺ)"?G`#3.jVDVYe洴ƽV7rU' {M3l{ƒLshܾ1]\\\x6/HD~К?`hD]5Nלity?u;}wd K0foRSR[GZ|SEÍcsMNW}V2+޹HcfU^^__^{m*:h'$mtg6Zt=uzH@u ޵9~^+7&GFfkm.lsjm/@4F f%8;~](NG bBw4M Z:ƚjg]q [釄 P4 A|\LP!f5:[T Vں I Z{?T8Z$s Q+lV6Ft1$s~m}so;lSl=qyiAk%}E{B πiM2.&DH4YUW:m$dIf-GoޣK6kKE֟Ԉ<Ռ,ՂLu q@MBYe.VA]vO<ӷatR30n)QsJ.o"dvoPZD;@/Dѿa(f};`kvJ"mp@[<tM<J4~.Q8n&QE) v|'qrpAPrp4SZ{#-0bԥojUDx"~x!6z0ӻNx !m[]0@Y!_ڱ#S702jaۨn!6ÓT%]yق[h}ö́z@[8"uf }pVPmKԦ1K_lbz륚UKq1VJخp@ ê5Sne]6$ t ]^Y8y|q}orNކ[u,RnQnMӥ<"hp}-ysˡmAuɖtWVk1<\_q!w0:ߨ;(Pw6z?D(QPDgvJ av4^sߞED ,S~Mv^i|L:353v[us{Db,ӳZ,BZf `c352athҰ58ڱ#Z[NQ}PJ_.z6֧ȭ+;m{f%``]hVbx-v}N\ v@bo>L{NU`@I3[d Gv}K{(b0rz[6- ykݠyH錷1Tt{{z xhثqoh7`wD'h9RaA+wՆjw{B{7N؍gHQEl35&1ߣA&vHB1qVov/5.H.]`0tk܇N)4 >0BERdd_cߕ&w@X%Ly}9jvZΎ iB}fSSTlC)' 8[{[īۆNI``(Hn^Yuw?`/wހ&6+rz>6"4v歠1umIʰAtmԅnH뜙zVVuFFRh!@ IFko-QCvAvvΔZ1݃~L4 l:8Mse_mɯENOZz3xW'RSHUu615q#9Ewkg9?0@h}G5ԋӉ;ٴ*@] lv5"!5'A78`~{Su6vBp U[}QN o PǔNgMMUiNb̖kaB|~ߘ^йD!>ɴ[3t-)a_64D&Evw 6A gtMU[Eum;D G7S` uI$Oem3rfkՋRaN^r[jS 1xr?tV0V$gڐVN -0bo=FJĢop?y8_ϟT0#3ZfGZ!a)eZO`X.04 T@)!ׅJ!&f)1!R`X*L2) s"&fÇWٳ3z6 +ZS r!I1/Ip$LͤAT%@LPPoVSN4 ƔƧ|RRxU4=XGtqrtv~T> 1VkSTL1T],&T뵪Vi]TM"rH0MJB)R~uCW'?"LH/.VᣣÓ{Y)D`q|(塔 ƼTŋߤ!I lZyX,TLR&f" 8::d&SZz_(1boʫ8uyzZT_y%$-﷦55́oW0悎>Douc!J8^C >Rզ½ٮ>Pj;wN/pxK/ >SWպ:2#Rk3@RZ$Z񍧟Qd8DTfuj=bH)/Wy@ EkZ*1#jr cJY-${{r_SN,Uݼ^MSJ"*Uj K04ӿWTrӸʣi*92 DLY)'"e^,y˽+WjrRFg~֭>wuggr9WU`(q'1nG Jclc`FOm}CΰXU?߹{l*/3/<uzgg"b-DVRk> wRFH0MB7E^]EϧiZW-RU+sSy0˕C愈ZS0bLӪJ2M -4-{QIs[ STq Y=Ϧ/~b^K"rttp_o*#t41AEI>7p!0!#!wQQ IDATZPT8<՘ Sq(abDBB&_HLt{{ѵrJ8$Zz !Ӝ2Yi>[%Jh)Tz}.9e&4RQ՚H4dE0aJ33eC BǑG~D; ~J=}| `:xC܈(['cۻQrLom혻M믦 41zB t{Sy{Rk3<5 "11-FZV"Gf&0w㉈|1 *8DH8 ^fBDTJElh9"34%"L$FLt\9 [c:[.zr !TVQx>Y,"f 30LTQ13J"բD@DRlDa"1|y:? ypxg@t8 @+٘'zuS{ <6+k Jh3kt_N@|HL h42N(Rhji.{Kyg}`8M0 O=0$)yKNJ3L>DZ \JLdfLLHR DÐaƁ qvH* `Z_^\^V?6>'sCqG")!aJl{$Grd .,rH6GfGdWveG`(۽۽͙%]7P23"LUA,,2b1F D^"]MU=Ge%<㐤!(!8F2K) R,)^ʄ/k j*XW9. #A`T"%R_ooJ1~~׿UڑF+M6A9S`j V.K,Mu9zuWDf]\fPJO?})UE!FNľPD8& D->0313n6#QLs T#w}~Lye50P0숢y: ? D0rvyzbuYSLbbV , ) bCP:8(3b  P|)"LhjQb ay9&Ue y6]^)uɤ5ɵ5Xgz_*t؆ކKٛ&UbmlWl8;U^|5O=ů8C?f,²"%  T-Qc!vٌv)raPVT| օ<&65S P LΌ o-"㱔K}(r8ͳgO MpFĢL@B L 23i2J,K13fL)q`w$a[1!Z`1z7Kn8у{_DZyҧ~m3RH S 88!aHC1"cl8)ES)9*""I)BD!rH&".ckYg"fD! z0"w"ŋ-Kb]c A0!IQ<31&K)"È0#aC9/)b U)0r*CUJ?="!?/~tǵ=W8N,@fhM0{5t=YQ'8g)@J)!RQ3Eg{dSSEђZI!1º' Aë!k VU"fVk /%D63 h_*W_ID~3"W_~8oT^;mѶCm-iI#4!~ޞc48={* +6X}\_z9Mo?g}lBRa."P1 D*2ϳNjLK.cl͕TtUJVQ+Ґ a1shb.jXJ^bbf H@8 D")Ƶ{ 1HeY\\z3|h!002߁̤a[jZ.bMļ@4R]$A@bORL_|2,Ͽy7DX!V9ݳi5IFK L>6Bc]ic1'DQ:wˢ"]w8|٧ÐE U+y)v ga6H2"JЏRB RV1(ҩQ W)1 !oH!FS H` )e2!SC!@BO=m+&6pC^SU.EID*Z* (1ZyM`\cĈ`h`R"FU0]\c>$vJ)tnnb>R̮C`泖|םۥTe]#dvڡ&OW0t֟Zk/{Nk7@yY/nA4w~531J @b )Ey5pW|C9@S@)~=T˪]7D}p4D4DHK)FL}!EDTTE4ϟ!gϮW'OL a8\/m%|\DU̘ W%TX#""\ /9QC"~+Su F<̪'f@B@ؖԜV,n#B LsiV@(`@FH:D mZ-"*˼$j,3%- s8 @!F?ɗo- GsS ~ۿi24y| b〡ZϝBv3vcfk]aMHkBm@: Y*Ī%wׯoE*߆qQ ؊/KfqL+^!ĘRj*v)j%B%DbyN"Ðdq4QH`99!b- DqU!ȀLy)"Ts{9zv͈Ucf^!p̅BQ$ @V1TyQQ@ǖAT!G xE7?vAJwCJ)Ԫ֨L"> b4=4Ezv{Ijv+n^镶TWŬjQZ;|q{{[4t! 7^J1A)b`!o!y@<"U=/9e-φN.W_iZZ鄅_RBww8q:(""_|՟>}GOahMRJ+=%΅ni1Y^@J!pw1h1S h!q!X!(Si Bbf@K^ `yY%|ys8ݎWf}9"9xJ+O P!މ8P)j\OSS( p5VPSG8׷et:/x,rŘ\V¤Rۺ56 LXMN$R.4wd8ѡS[TY@s.Y7~}/R'8T#B#f0Bl7}d벞4U/hUQ !0t 9DTΧK)_4!1s6Rh3Df"$כQU5>/~Ͽ Rtṿ:2 ZWӴbh,ѱjh}mZt9\c^`Y4zK4|uww,nYO)?/_wϞ=3%)k6Dtl}PTV0FD}0Ky~aTfRP 'N|5T1(j<bB1"2˗ȉ1<}d^_Sd"U p;ŋ+~LAkmDL,ET Y9+؄*"R;f` 8NG"a])6LoKߜ.lqdi)_t r)ay ~@31/^~W'CD'7L6x1cED f3l69=AC̾E+c:EB^MHL1D)grD$)G9r!=}vﮮ^~ǜ~?y!2}]J]t}L`^oX碬BDrhʗVFǵW_oq=dȖyd.Χ)>u8Ps z8"]0ԟrT:,_|y{{~_wI DޯdD 1mLَ&$9ɝT5Gu68",nj6)8^xӿ*-jE~c&q0F&j Bu0E!0,QUQb߬e 9 f"HT$wO̦iq@c)?~mC(M[fC.X|ٜ#pT0sVf$?Ry1~ϟ?rH\ӎYBuT ѐ6WfTJjJd 5yz1@`.b`SUU.M4,s)?Q!c^NϞ=կ~1 i۪2^Vv2뤘n288Q43-1bYq:3Px-p8|sU˹NNf0~aQml- v`rѴv;0j5,16AN˯VNZVfT &6ƨj_jj:t,AYT֭xoBϲ]*m|ZFL*rի"neָ,rw9?gO^x_ƈai*gΌ#p߆g=90sy50D8M<͏2ff"ѯvF^KTځozOiOICG.r,ww&?o0nf_ŃuavDEv+%m6]2L#EEz!gϞ04͗Pez)=']$bj|%!t|}\y1-D<ͩ@וr`o f}ҫ8[oOYpg":>^tD1>BY~}ןny7@-^`{ioΩ?p"? Sӿ"%#n|olm4M669 ޏ6DLD۷5x* ;vMy9.m'}wyA`{ūW!p>>>>>>>>>>>>>>>>>>>ޫ_ J9gx}xϯJW/ZCr^V=T vb{z0LG3/x$#'`RG#~#6 ,|R0 SٹȈ b9gbU[ <#vE'>pg*3uWboR{m~gn_}2]=>o }hFx ͪ[ϡp-&Uc MD}Lmu%92-Ҫ 80DbP_R q1UbJ6hY`Z,⫝:}#Uo~/TE$8MR "yr3t:){"0!&U,Rţ6C n⪤fz6p;B@WZD(˲R\]]tiZE֤ZC $ W]u昢W"`q0;iTJ%w=iȵ2o>0,+Ŭt4"A qH%b)HCFlKQExYo$0 iH&pn700Sk/.W4")f1t:^QOӲ, 3Sw1?zG&q?Q8q d[Whw77w߫9mU=ƘRH)]_]tHɽnLIӔ37;`VUO\r.9/󼘙!QJ%npJ) )"Qf3!m7ab!N zRLrcFN<0qa)xH*Vuq*^Q,x9<+1B]5Z=s)^)L IDAT1~S)i8=Ps^Nt:I}U6]JC\.Of-jJQcݲޢGe?bΣ73)F}=ݽ~Zč|tn7C8,ˬb",y.XRȁ 9Dq׷i4M, !~Sqtar`q=k^_.舥i/qGn~n |8@c)> "D1b fR?1w?y9O9g AGDbL؈EdU B)FoJY_j)L90!"! U9 bDdy7 Lt^TPqf)Tf?Tkl0 -ʥѸ2]<r.n_rB1k?<~p80FC֪Mʫc+SsYy^2iy }X S!6cJ{O2Mo}cksvnǫ0$܋d6DR-HnNZvqgb9B c+ޫ5XO>7BƦYO +yRJRl 0PAetRYKĜ<-%貈:G`ƪv9@D]mGTh5mJ&(rMӲ=3쓏 CJ)H Gvn{ijft\&40U$W_5DQs3)e &\UՈ`%VӒ'LϿzDw[c48l6#?yrm2?I:GMmk@5ݒ;*F X?HDzjY߄N* bU.Ԭk( @ a aѥkyZ5''CA9KPT[BL3Kc8|Ze9.KƔ8̮Oi={RI8TIX+NѬpz;oUC)f3^]b?Gg?"FfVA5͹ۻòi;#w卋m6ҁĸNt`Tu$ w2+M@9e^JyOiYR\(ɍpgϮCfw{Sjdb){f :tF͆'TΞ%zD$hul$pUӊJ'zs«'bZ\R,wIr)3]NTg?tͭ!ƫ.䭺`"둲>%zR@vaۜ~}0gG1Á0O4]LJIM}$/ŵN)p^NBIlvۍZ?8WW\?"nnnt6M| ؈̃C55{"82m|;$H+z`-j=kgY7~Vջyr^[|Ec^;]_?{jXgGw*cer)]`utu,=:pY93i9/yBL)øَXJyc2%7]aԽV#V \qifs9)&bEt\m:?Vl:6}ۄ5 U?5䨷}vAxܹ*$q3v uRqLhDxXk5j`6n~MTrD1FN E4˒>^ՄT,R!zf>6ԳwS7իW4xYTU0m#!A&]器H㧁wۂgvҩBʚS]"f|w8Z^ۛۜLvԙczڟh5%>\ܪ#vvTF+hgv J޾rq=o̺~'oD|C;("wwDՕO, U!h:ʍ8@AU3'Tw!boDC8`c6\է^0MӫW}90{Xx4tFKu3ZwL|Vn7C.혋5B^$lDMd-эQk|y^yID ,E$B,R;uh)mb}$ Ü3\Ts)YiQKs)+E̶?l6^n0k-MK9 ?s:/bR(Ni99!U9F,qj7C&.bE-lqllj_rJ`eZ1!T%DK)&bl6JLj @k%va{i0ണl.cbZ58"Bb ˲T6yt{wJUӲܞNK)ə511zZip:_|U!aL1WwSvꈓRly^[>z$DRLU^mݟ~hf2yČDicйtӶ\iNGuS. q}ϴO}jB=n8n{11ˤuIqAʰ;b&cJ8YV;l#YJ)di^륰WX/;an1 3=CB\aXYk̥nI)ŔƔDx3 2ݸy'f |!\u9QX34,&f\ *Rr<׳|mW"1%wTTm4uxi:77?p|v3ƔgUhy3f3M[0稵c  BfuM7Je) ڒKe%RTt:NyYW"N<s IaF٥gi%jwUjGX4^u2ح\"m jI1|s:-U̙ٳ'e)u[bB8Rs1N7h]ig[V;ϬZ:n0/ Hx8yK~4w3 ilYwo1EiKk\=!qPo_Zę93pZ0q@BvRcO >aeQ:'KH"j"s$R_}Y?m:mkABݾ={ Nޭ 5r&{DYun># 3S>('t:uct/Ѻn@gf4ͪiX|գdv%e^D֩[g!eLe媊 hdB4òd+R5|C|n80W _F S5C)h1Q8*ȱGԬdqe̜gQMH" a1u`*^̜*Cn"8Y*jVuLmݗ͡=7a?= {nmz79U\/_^!nqAAsέ4/SrI*= kq@ՋU{Zw+}.St!K RV!JLf_ .ܯ|G9o7<xV`oD#.L!vei![q厮e:[\Naڵ̳zk 1&D>{wI0+nZ3A@ Qe#w>9, 5q{hvT: Ľqz n=x3w}RR(vus 1 _boSw3?.r~8'_^fn+c4SsԼ azC/ bQy' ۥa7NoEy۰˴u̮4Dt5~v/q{"绯a70xp*ZYBMnG G~d趡uFjU] Cl a}:?.u`<51}y2t/-E٥ێL(^..˳VX7iTﯽNwk5Z&{ }9? _~DžDPz?-=D?yʺ>ޘ*+m>Q*Vy^lt7ŷD2>:XwIGBFFћ>>?w搷Dk3{ujr/ٳ"a'mXM_IDAT}1 IENDB`DarkRadiant-2.0.2/install/bitmaps/logo_old.bmp000066400000000000000000001354761245424655700213400ustar00rootroot00000000000000BM>6(~~  ě̛כқ⛛샃[[llዋnn\\䋋샃[[llΑhhh___???aaaKKKEEEAAA WW//j]W##bBBwWWW[UUWW]WWWAAw++hW""aWWAAwWWW\TTWW33mW _BBxW!!`ttXWWWhhh!!!!!! KKKAAA WW//jddWWzzWWMMܯ''dWW,,hW[GG|WW""aWWWWNNܮ''dWW33mW _BBxW!!` `W""atthhh篯%%%???wwwUUUKKKCCCAAA WW//j]W""aWWWWXW__""aW""aWWWWWW33mW _BBxW!!`WWWWhhh  KKK鋋"""<<<~~~WW,,hGG|WW##bW `oo\\WWWW99rW""aWW""aW!!`oo\\WW33mW_BBxW!!`WW]]hhh;;;<<<$$$KKK WWX!!`YWZiiEEz]WWWWWWW77pW""aWWDDz]WWWWW33mW[??vW!!`WW]]hhhTTTrrrKKK 333WWX!!` `YY[[䋋WWYWQQ^W""aWW䉉WW33mWX//jW))fWW]]hhh<<< ///MMMKKK̫ZZZWW,,h蘘ZW[[||rrǙ44nW^::rWX]]22lWW""aWWzzssǘ44nW^33mWW""aggKK~WWOOUUWW++h````hhhRRR 222KKKXXX...AAAZZZWW//j!!`W%%ciiXWWWW]''dWWYYY22lW""aWWggXWWWW]33mW^uu[WW!!`WWWWWWsshhh氰'''AAA###KKK222AAACCCTTTWW--i[W$$c鰰ƒ闗==tW""a쮮Ů鯯ƒͮŲՉWWDDyŮhhh!!!###### KKK--- AAAFFFTTTWWY//j//k]WWPP==tW""a⃃WW]]hhhaaaqqqPPPKKKAAAKKKNNNWWWWWW!!aVV==tW""aWW??v??v{{ƞߟ㞞ооопiiII}TTII}II}MMM ,,,xx@CCCCCCCCCCCCCCCE,,, MMM444tt NYYYYYYYYYYYYYYYYYJ444444wwLYYYYYYYYYYYYYYYYYYXJ444444uu NYYYYYYYYYYYYYYYYYYYYXK444444vvLYYYYYYYYYYYYYYYYYYYYYYXJ444444ww NYYYYYYYYYYYYYYYYYYYYYYYYXK444444uuLYYYYYYYYYYYYYYYYYYYYYYYYYYXJ444444yy NYYYYYYYYYYYYYYYYYYYYYYYYYYYYXJ444444ssMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYXI444444zzNYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYXJ444444rrMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYI444444zzMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYXI444CCCssMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYJCCC;;;zzMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYXI;;;砠uu NYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYXJyyLYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYXJ΃ IYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYX//NllYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY""kMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&L""kYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYllllYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY""kMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&L""kYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYllllYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY""kMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&L""kYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYllllYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY""kMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&L""kYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYllllYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY""kMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&L""kYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYllllYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY""kMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&L""kYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYllMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&LMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&LMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&LEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEZZMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&LZZEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEllYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY""kMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&L""kYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYllllYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY""kMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&L""kYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYllllYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY""kMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&L""kYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYllllYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY""kMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&L""kYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYllllYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY""kMYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&L""kYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYllEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEZZ GYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYW;;VZZEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE HYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYW((NKYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYW//RkkkgggGYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYW%%Kgggkkkhhh```KYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYW//R```hhhhhhgggGYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYW&&Lggghhhhhh```KYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYW..R```hhhhhhggg HYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYW))Nggghhhhhhggg KYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYW--Qggghhhhhh IYYYYYYYYYYYYYYYYYYYYYYYYYYYYW++Phhhhhh JYYYYYYYYYYYYYYYYYYYYYYYYYYW,,Qhhhhhh JYYYYYYYYYYYYYYYYYYYYYYYYW,,Q hhhhhh IYYYYYYYYYYYYYYYYYYYYYYW**Ohhhhhh KYYYYYYYYYYYYYYYYYYYYW--Q hhhhhh HYYYYYYYYYYYYYYYYYYW((NhhhhhhKYYYYYYYYYYYYYYYYW..Qhhhhhh3555555555555555##DhhhDarkRadiant-2.0.2/install/bitmaps/loop.png000066400000000000000000000003721245424655700205030ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME/ sIDAT8œQ 0 CBlKC@f1BQ Jt Zk؞I$fEUQU,}䁫j<ϒ z @Q9+/Aچ^ FiE'7hݿiwEIENDB`DarkRadiant-2.0.2/install/bitmaps/make_visportal.png000066400000000000000000000014071245424655700225520ustar00rootroot00000000000000PNG  IHDRh6bKGD pHYs  tIME6IDAT(MoGwޙެ8 )PB[Jp墳K8H*ikwgvfgC^]՗?yqv2o]`Ώo6cNq}8`X7 T iy$ܮ$ф΅(M4Epw6u'|Mt^ [(>|Y#?>qL([Iw>RN$X7)-1r?.VGQoxr@u*{Gsu`xVhNHb?gNV\?tsq.'|u# [VQ6cZ/%0ryT"1uUtȎVd,FxQx/Lyri7(w~sO-E|m"k -T#~ް.ӝ{vMVVn>pqFj/ 8jYdaogNyPK+ǀaٚüv+Ҁ^  D cmc)>"Xh)"X\%F ݵH\KٙfV-,`k5 ;5cS>6}qp}^/O/9V֯!-i^22բ1tӈ-,N+ALzi pF%TPwW2KI@ "?I (/aJPA('!EktZ V7z梨VwMypsyg> }ܫI{qZFƚKIENDB`DarkRadiant-2.0.2/install/bitmaps/media-playback-start-ltr.png000066400000000000000000000010731245424655700243260ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME 3sϸIDAT8͒KTaƟ罯8]F-?(…HqJF_U.B0h.>W-Κ  3Nwf"83Eg>9Wb`ޱX Ow%~((/8/gd]N<7&b3mg׆nu>BBDBDI+k47e&Z^,SS ,zЭNE{zƣ??kt] 4yP\Ѿl5;peeh pxy_#1]RѫD$ uԨ}lozyydm9*8pCJCtX+d^[:7j7?9 RQp9D`nfVݣ͡غm9l!0S5?i{_n>L=Oٖ6:j(zOlU7ֻ;/D?sl)W_uo~IENDB`DarkRadiant-2.0.2/install/bitmaps/media-playback-stop.png000066400000000000000000000005661245424655700233650ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME  IDAT8͒AJAE#(r\Bporw^;nYgY&4=.L\hmT_oGu//?\zBnFˮm&y@HJ3ɽ~b@$mnINu`*$&KQ4nGy(K퐉9z=^1}3'hFPIENDB`DarkRadiant-2.0.2/install/bitmaps/model16green.png000066400000000000000000000012671245424655700220260ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME6DIDAT8}NSQ>chbhL1 #&DcG$h|}'N8Ө( abb(*ҋ&p[_GL4qm&Wg X.Ħ\X}E pʼ~8ϻoͻ<dN TЄVPK nl&"\rTD#dG3OY)jRnךU.@C~{rujM|%Ujm PQ%an9O{1W]d6#nX" R(4m@l>KR[y/q |XDmls]+ǫ+F K\Ҙqзmt A {4V[}:D{Yl\%7H*"TD+I8r&qKϻd9s7#*F|b٠$eЋ x؃%b߸œfT^IENDB`DarkRadiant-2.0.2/install/bitmaps/modify_faces.png000066400000000000000000000003701245424655700221600ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIMEGIDAT(S w/QN [h=$]D8"BI2;o^ĭd9Skir3TRc[g2ihm VapǤmA1~7xzGDIENDB`DarkRadiant-2.0.2/install/bitmaps/modify_vertices.png000066400000000000000000000003501245424655700227210ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIME0uIDAT(S :} !#=.z'e&p+$yzv+dwV-wnZKTrI6^2),bl?mp4ɠ6d7 f^%IENDB`DarkRadiant-2.0.2/install/bitmaps/monsterclip16.png000066400000000000000000000004011245424655700222310ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIME0IDAT8˭S &:08B?jZ#}!EVȈ5C=dĵ+TO1EW.P4y̬S)y9% Hw ,k F0swMFm{l-|h3wj#FHYIENDB`DarkRadiant-2.0.2/install/bitmaps/noFalloff.bmp000066400000000000000000000030701245424655700214300ustar00rootroot00000000000000BM86(@  DarkRadiant-2.0.2/install/bitmaps/notex.bmp000066400000000000000000000103301245424655700206540ustar00rootroot00000000000000BM(@@  (( 00@@PPXXaaqquuutttqqqaaaPPP@@@===000 #%#%#%   "!&&'  "%     ##&#   ###   ###      #'& "&###$#####$####% %   ## #  &&#    &##   ####%'###&&##&##%'###   # #&&&     !!##''     ##   !##& #    &####    "##&!!     &##'   ##&#'&###'###%###%DarkRadiant-2.0.2/install/bitmaps/objectives16.png000066400000000000000000000007121245424655700220340ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIMENWIDAT8˥?KBaϹ&5 BKߡ)ڄ ̴DMA-B j 47 h7= qE3T/s=<%^ _?&x\n7~,D5W>$ r]}5W~Uk 9|7 0eQ<5O?t3|֟bik' XX0jwMkx3-U횑!5'hϊt; ulny@rT n)M,'d[I-4lhY %3sP1kGU":7&mˤnV-%mR'yp{"IENDB`DarkRadiant-2.0.2/install/bitmaps/offset_clone.png000066400000000000000000000003761245424655700222040ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIMENIDAT8˝ CesxH !@)Rvn# bXrL;X5eQZՁNP0W{avb"4Rm'1R;~*.ܳ)& B@vJ I a'-ppF|c5a6΁7W6t\PQIENDB`DarkRadiant-2.0.2/install/bitmaps/patch_bend.bmp000066400000000000000000000003561245424655700216150ustar00rootroot00000000000000BMv("""""""""""""""""3"#"""3332""#"#""#""""#"" "32" "#""""" """ """"""" """""""DarkRadiant-2.0.2/install/bitmaps/patch_drilldown.bmp000066400000000000000000000003561245424655700227030ustar00rootroot00000000000000BMv(#"##"#21"!21DarkRadiant-2.0.2/install/bitmaps/patch_insdel.bmp000066400000000000000000000003561245424655700221630ustar00rootroot00000000000000BMv("" "#""""""33""" "##"""""""#""#3"""32"331"#3"#"32""""32"""""#33""""""#"""""""#""""3333"""""""""""""""""""""""""""DarkRadiant-2.0.2/install/bitmaps/patch_showboundingbox.bmp000066400000000000000000000003561245424655700241240ustar00rootroot00000000000000BMv(""""""""  111111  1  1  1  1  111111 """"""""DarkRadiant-2.0.2/install/bitmaps/patch_weld.bmp000066400000000000000000000003561245424655700216400ustar00rootroot00000000000000BMv(""""""""!""""""""""""!!""" """"""""!$""""""!"!2""""$#3$""!"#3""""!"2"""""$"B""""""""""!""""""!"""""""DarkRadiant-2.0.2/install/bitmaps/patch_wireframe.bmp000066400000000000000000000003561245424655700226660ustar00rootroot00000000000000BMv(""""""""" """"""""" """" """ """""""" """""""""""" """""""""""""""""""""""""""DarkRadiant-2.0.2/install/bitmaps/player_start16.png000066400000000000000000000005361245424655700224140ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIMEن~/IDAT8ˍ0 ?q! 5,D Хt.;P(9Hϲ*Sߋ^TQW"I-u%+L5`wyM7K=P4iMX y[sAX#-C`k*F R)&#*1$U]GĖiՌ5x LoIf#Ig;@14.<1ԌyRIENDB`DarkRadiant-2.0.2/install/bitmaps/pointLight32.png000066400000000000000000000013171245424655700220200ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  ~tIME@/\IDATXMhAYöqĘv#X(V{ APB MT/z̧"/1*͑(z+HC99ī,ӅuȼY +}Dْd0z‰>`cۚ5wg;Gmh NqQ[wHں^A5Q  5aw2ai`\:E©= _ɍcR۶5pvsodso/޼_mOsQ( ձ,ZX](*&ruIENDB`DarkRadiant-2.0.2/install/bitmaps/pointfile16.png000066400000000000000000000010341245424655700216660ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME@/IDAT8ˍJQ7Q.@.)tэ.J6]u'tս[Ap 7n Q=$\s3d?.r>zYhIYԕf!IT<]TW2E/y@5+4N{TuC| \] /h$hɥ cZv~㏅m YԜQ@n ll-岰m| &S) !L h/ t狏_4pUが@z"d^,M P7"^g\lC;A6Bg`&te(Q-T{3]t*nxW B k2zQ``d:4D9lw`(\| qpYY%,w="ix]UÔ@u! {\BH?z[/Ls[m@pv}fYnQ%˛t)T>;,o-RL"[+wPVއ_1IENDB`DarkRadiant-2.0.2/install/bitmaps/recprop.png000066400000000000000000000003561245424655700212060ustar00rootroot00000000000000PNG  IHDR Vu\bKGD pHYs  tIME7!iTXtCommentCreated with The GIMPmNIDAT(ϵA @)qzbʄ0T&:CDZ ~^%:t_K` "eLIENDB`DarkRadiant-2.0.2/install/bitmaps/refresh.png000066400000000000000000000014431245424655700211700ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME*RiTXtCommentCreated with GIMPd.eIDAT8˥YHTqwQ1" (h$!"Q02 %0C$)26rLELTpmv/cs8||gny@a?}$?aռΑ"鎗Mg8 ZIbW"kpwؕ#b D(@ٙ{1;? ~Çݑhk{ݾTXt>gO7 pIIГjMs#+2!=$IԖ360Q"ri^iK8JE)3#|N͵ZSœ^&Jf4g @=1mf}Xe@PbEpLJZ#-}%,Tūۻi{Ūu 0. 9kvvcU \s_P'F&,ՙʴ2:Pbr<9;IB!mב~z\\=4j`v]YlXFL?jܟ}]ݷfla>S(~IDAT(ϭRA fF_mˌ˚#FbUb@cPJOI~*p(>ضh$}~˘ž0|_,HjZ8.+!Tg`qTNw03N(+SI`4:/IENDB`DarkRadiant-2.0.2/install/bitmaps/selection_csgmerge.png000066400000000000000000000003731245424655700233740ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIMEZƋIDAT(ϥ 0 CYf̜@M?QN*q <,UVls,8[qks%iY>mbU >mtk\E% i$"]. [ypfckNTbIENDB`DarkRadiant-2.0.2/install/bitmaps/selection_csgsubtract.png000066400000000000000000000003711245424655700241220ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs+tIMEZƋIDAT(œ!CO7/f/ >؄it@T&u|7$ e; T"~D%Z^zM27jF) ݰu,PUB: } gq=e)JڌQ&2_;*ףIENDB`DarkRadiant-2.0.2/install/bitmaps/selection_makehollow.png000066400000000000000000000003171245424655700237400ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs+tIME]\IDAT( 0 TduJhK [6[o%U(`-xi24lG!rGg=)Q"5;`V@IENDB`DarkRadiant-2.0.2/install/bitmaps/selection_makeroom.png000066400000000000000000000003071245424655700234070ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs+tIME9S1TIDAT(퓱 0O O]( >y6M&H 4 ߀\ jfB]'~۽"tIENDB`DarkRadiant-2.0.2/install/bitmaps/selection_selectcompletetall.png000066400000000000000000000003371245424655700254650ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIME[lIDAT(ϵQ ! K:ڍf/ qBAm4)HPQ5 'f-@)廻{XsOˆu #KTD &n$[jlZ]!I:A1\@ ^NIENDB`DarkRadiant-2.0.2/install/bitmaps/selection_selectinside.png000066400000000000000000000003461245424655700242530ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIME[sIDAT(ϥ D85ί6r})VuDk@KH= 1޵B.}j""2Y](AʀcZVMzNzFU.i\ENIENDB`DarkRadiant-2.0.2/install/bitmaps/selection_selectpartialtall.png000066400000000000000000000004201245424655700253020ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIME\RIDAT(ύQ GӃq4ԄRxdS5H"J9fg1/ncf , (kI#+??bd͈;L~#5?k[nϯ_~6ajzlEycX:kCV7+n^ة[͉֘b 6*q1lcYzךaBw9Xdł L||'Ly>~ik=O?=~uނc9/022sp0U210g}ρO{_1t? %e>LLf``P_ndddtZJ38yIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_communication.png000066400000000000000000000004631245424655700241140ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME 6^IDAT8˥ 0EE4iP :̃<(+@2N"p-=Xk9S_@i3(K}+r$ΣߩUͭ \"$B`pdO }IPհ쬴k&]XiJGۺ7`^)`{ J]-DLIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_damage.png000066400000000000000000000006701245424655700224650ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME ]8?EIDAT8}1j@EA t .|cI&8)ܤt!m|)Ʃ\MH !ZɳaFg>_H⤏+#9WS& A5_306KdEi?CXH{L" +c\ƁfҦ+R ;-=~bwL Hm\p+Kw/mu crBPt$ܐv Ɔ,VXaPcM14^XaT0B6 |@H![%$Xk DZ0G/t JkZZϲ lVST 44FՖEL*N&z`)^Y3[[׊[ J ̅(-6|J@mN%o o+2SN7px%a!L 1ymx-GDhatMwœ$IENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_healing.png000066400000000000000000000005711245424655700226560ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME͇"`IDAT8˽N@=)P,  AޡH|۱ngvnt&.W[D2rELrcj@e'oE"0 (/Yݱ51_Acf#\faTnܚ+UDR L;ol.U_IvU?u[VRdssV ޛ#zu[gquVC?q b0c^dM,e Y8HC| ^RIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_holy.png000066400000000000000000000004541245424655700222220ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIMETsIDAT8= @F߬AV=,sCyj+ai!Kq: o]7IzCamB o‘d ]-|K` c9=IENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_invite.png000066400000000000000000000004041245424655700225400ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME#CLIDAT8 0 Dݠ+d`V`2B WqRs,?ىDgt.Iuiw Q!E{V.`6]YTG(5d~WjQKY\/~UIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_kill.png000066400000000000000000000016331245424655700222020ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME#CL(IDAT8}S=Hsg={o~nALoᶽ~PLqhK7vh(ꐩ|P tB-Z, X͐k4Cgz8TUkpΡ:Z\*l4:Fn'pJO`0!puuu;<(7?rD&y$ŏT"zz[%|{qppkZ~F4h0(w&pTD" ",y/ 1i1c |{{;;;H BBឮBr|{{{XYY(HZz83vd2|zzX 1Zbrr۶?B4l8h45{""۶$E[a|jZ$U{PR$I/ ͑,M˲ !tc8'K9op o]OcmUU;$ImIΒ' @$9?+8ӍPP(bwɲd T Db:W Ø DRt~~>onnar6/ @Gs)N/2hD"|}aaWVUuRUl~WӴ$~"޶r.u*c?v@Y7mu]8˲eavv[[[p]w4_Ɛf!8<x( "Rǿ}*LHIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_knockout.png000066400000000000000000000005131245424655700231000ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME;_0IDAT8˽ @ `@}d@G  pA}]B/Ӵѿ*sւk6` "`\7P४$< @n2U%-d@cz= g59e>;@렅{/'Gc<&t9A].V[#8R+,VG .ݛXLr~vkr NIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_light.png000066400000000000000000000013611245424655700223540ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME:o~IDAT8˥[HQ?.:ּ,fV- FEUEaD>cЫ/F 1؍FBDNk2˞>9=Bvu 6oaߧQϮ6PX,깏];O<0 Bê ` s isژ .Gҟ$b7B2cz7`R2o_'͙#Bvu 10{;~UwtMw=gXh#o)[X~j0 ޟDH%\٩'o+,CRtriKX6#d^,v/Krj4ր0ĕZTFR>ALϐ3#'T-(t U@s*Tӧ>dzxu4jmyukRY6!.4&~U=?(cnyMEA"ѴoΕ8~>fGJ`&G i.+u ]e/˒ly(_I,{vas/J (q@oU?!j}EJ)>`JIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_magic.png000066400000000000000000000017671245424655700223370ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME9b>IDAT8M=leﻳ>?qlvq4uBQ!A`@TT  3bbAR$*JHڤU%UHH:]}x?!zH.{e!A>)i|iɛH0o l o׋F,E-']#SWuaP C"fChc F =C>8*2/>y2 K, $`X)RŪKX𺆪(A6D][♑μe]vn_} :6R>4IBr]W4DIRh%SKUViwıyXO G/Xp$KhU^0.Ԇ)h(gۇKy>4 ƒeگ2S7x#A+BCtmxyZ Eʰe' ”e;Ƚx$RBty!e! [KǹW[{agwɟCފ%9@MipIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_random.png000066400000000000000000000017441245424655700225320ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME8qIDAT8UOw-UJ ԉ$K `𰐘prz1vi!Xb̃\fܐ& #b 0‡-ҷv{< #R$LuHfGG4f3 Ȳ(uɅ#{:h[M_iVn+Wz=g 5h|ggAi2ߪDGŘ%O!6!B~W}sׯ_woRQQdȚFA)noFuwS\^|֭/ mrp.?~RWg/nf ٌ9!H|K$j:;+^ܵoa-C!7oH4^%!D!TU:$''tX%%ixT*"j}=nTLI܉NJx,'gx׮{3Ҁ!I~xEd2;v) _SAB@S8Ǥ(D,+S%gKK=X X%P#Lr9RUtFbq@^_܌ S6K6҂ 耖ˑZq{a'Y7ntdY 9BK&ݻwC Fv}}W E}4>c?Xvg:ܹslMOSgRM{Ƨ;Ȳ7ijζ76mܔiR]=Eſ 0CAIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_readable.png000066400000000000000000000005701245424655700230050ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME8IDAT8˕1r0E3i\Ґj]JC8 JqrC vF3jK.!3TU+B u7MeMs%,Ndi>U+]%ȩHy)|n,{Q4$DHFހf\FF;] 7Q~xHzS&vɺ"xH7> :;F;DfypyG&ঐiu~a'UIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_restore.png000066400000000000000000000005561245424655700227350ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME7BIDAT8˥ӱQ1w C.*e /Tf t;u t7lFhkwT\+IֱfIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_shield.png000066400000000000000000000006571245424655700225240ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME6E#r8.AUGC ~ˆB9\\\`ii mmm( zE(f`P7럶߹-Vpyy ^$1?? q&&& ~gL& A P.aZR܌.(JJ# 9|v {!> uh >~?=FZ/Y90!:...◽=z}[;(`n H,:?ǠC0F$ƃmuw ǧ?:יzM]\a^ % ya) N=ryil٥s!$|u v+^_%7sUj4ﵖQ,w{h'SphqcehNKQ.|#v(%NFcoacY;İPTxp++iu>yaxWot].Yb4BG-K.&45\wtN>|hux;vE4MK!RJ Aa<8NZ6'ady֝(Ųc+P9'/?(Y+4a/NN(⌟t:rF\o4iLD H)!O3)j+=q>^@9_sz#̍M%C[X˨@W?l393֯rXkL nBt1ypjK+ (ub~}ˎV -`L85p̟S1}1<%L1\+84C@u0;=ݵ,`' A\gzH|FY[ 8Y?h&x"H/r"JS0MF)`1 2byGN{{OaH ە{Ǣ8鴭>kf[}uJLlІ!O)N^xkrv| cNμd:ˇbhBy.Z?ˉI[FT >5z/ -6Z'H)9|3)-?9r__oɦYX,3Xc?ڿyFױ VD@OW>/~fT36OHۜfFiiHbxxt\-'0jWH2'aB-^CC׊Zآ" $z8׳&LnjX^ǶL\6{ 鲽UlrlG9{Wݣn߽W>x|xa<}Q5--_c~ڼo3Eh-۷Q+*k\lVo54!8:4L*e137ß JPDsIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_trigger.png000066400000000000000000000003501245424655700227050ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME2(uIDAT8 D_S2[!I3^qmZm!DHO X 7!wpĪ\A"NntUqz Bv"cIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_visual.png000066400000000000000000000017621245424655700225550ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME1l!.IDAT8˥Mk"g3f2!D&Agc4Xaa =B/K!BB4"lquq^ P2mY1gggzH$+EQV)^b!<$2M E"^|cFEa= IRr|_Mff&y>>>~h4qnzuQWA6nxuuC*kFLfc|ajv_41 8n ?///^A"`}:.bl`0x||IQ4|>ea$Ma~F ('''˲ӓ4\. bEAA(zJRc,q;ߖJD,@QNPVC:aid2J^Ks\y8::V<(eEQ "P!$28.//p$@ 4Mض E p88XZZ.kaXd<7`IUչ$IdvR) @|>LBEKQ\TfX}noo`/5n{kXz8db2<;4M35MS~ DOTTCZuB!`04Ma>\.W4k4نa ~:˲Y4BEfGI>J%54M{h4{˝Nl6|ww kYքt::KY&L:ߒe$9j(d]TL&`۶aXdm۶`HcY1n$ @c?ot+IIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_icon_water.png000066400000000000000000000010761245424655700223720ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME IyD7IDAT8˕OA?o;;ݲK%\4LثFk=w/41 ^8phA Jڭv˲C B}73̼U墰 " gP"UZ]a3(7 pH*@ <@ʧX׼Ù!YmcRſ8XJCs{;\N+PDc`b SXbcHGQy ҆bZq T^oGC@6 c0 .cIK.e[~3e8!4x B[p2EnS,|ޜ9NER_v7 MqUآk<1! A̙K r R3>a?Q=^oe%CH";q~g9 ` Y 9aNtXC(boBHflshx+jWr;sUgIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_response.png000066400000000000000000000007601245424655700220750ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME0&}IDAT8˝KBQ?&`!)4C(6ʖj[Zt4p MBo@܂Ԩ9=s%m@HQ $r] ԁEx>p =גlOMt`d?QSY(ɢu*aˍJc`XАzk W:F<#)^ )`L*E9iQU#P G29Xc`pRsBqxawާ>ƓI&mpeoh]I8l":^ԖsmIس?SG*s"jweݲp ,+ {)*`o"*=6k(dCY VIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_response_inactive.png000066400000000000000000000014211245424655700237520ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME/.MIDAT8}[HTQ}̙:1C22* zD#)@P$ƼDVPDC`Q RST"C LK2 fDg:g^6-wx[b`-3@KSh b* %ZېKg,7"icvs]twɂ35ٻq==$L2ۦ-]5`aI^H,\GLy2X`;?j<$M*K&qnDeb8DgU MF&6a=m[d D%W) `_˅]\)m0rQ͑q.bHlX{gd[2;:o*hz5;Yֆ==?(N L5GMma`T2azC}3j%z>VWc B4j*6!Z=8 W/C:(i؎9K:4 {s>1$&X veT)1TBA^NQgvej9Ͼ8,yd5ABab!%%}p6Rΰ&"oR3U3'JI#`,h@ /^wIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_response_inherited.png000066400000000000000000000007361245424655700241330ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME/.MkIDAT8˕1HQpp.5DMuB.;kSKAm $-9 4ymK gB;9S}s|2 D4P&˞<nu)c1b1'@%(jDESUPEYwq݃?c8# 偺$ zs̔nbځ7?$$ @4S)(a^%X?-%/2_Wogr$!'V:(% ڼ~ ̍q5%!<`=`gm۫!P /\-K(C ,Q\5/t{s}v\ _ǏOIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_response_inherited_inactive.png000066400000000000000000000014501245424655700260070ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME-x aIDAT8}[HTAgκ=n遵r3IB/iAAUvÇ_)eBa%QTEEv3Ֆ5n֖)ճjf0fjyQytX d׽@Ph7c ՀpGqlw@jA U_L,J5 XFS~9bX w}af;5yDd`:݉QAWJN%Ù1f!"8+PA©z \mu[gƶd Yn7&[L!n-_o&B $t`1Tqη:Sx#+.$H0_ PW3%?[[<}Ə&5l6W*E2A*vdףh w>E( Yn7}fV4۶-N'o }1e%% f^/NG _ uC#7o XkP4pg'i@-X~K3d9L('ow.}Bfťoϳ~>ZFSkmti!V_ \gA3!hYJ?l$s֑պL5ߚ-`sQbSE_/IDhb}h-&ń@h$aCg:JzTƒw=J9>IDAT8˝/aw_sJJ䐐HHX_t70H,1u)itrz AУ|߹^DĻ|ɛ}yvL2WNC( B FU ts@FxXր>`TOtxL;k"5`ݐP^:FݷU*ra\;(>8vp&BhXC&L2Jgѐ&B4pySt'FH*n_䦺Mu῾c; +uzeH%'b:֠\eB%cȅj\!4Rk4KP,=*hY b~6X;BhvA=Q{ O id3IdVԽ"]А.Hqrv5l2#lDU(( ,^E۲&vǤKJ>OM( fIENDB`DarkRadiant-2.0.2/install/bitmaps/sr_stim_inherited_inactive.png000066400000000000000000000014301245424655700251230ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME >9>IDAT8ˍ]HSa9s4t"mY'}Ѕa(H" `aA]`QACe3pH+Jt73wօfxs{W }`ry;O`ƁvR$ :u3ԩ/u`[Lla!?g/"ndC\v|FKIXEE4r y0Lh~)fg6KV=Ӆ<FXF/M`¦u*֩jm%`xOJcÊR}ileVu<Ɛ>&󪴔QF5۝pXJSL4rnziG19h5 v'IN^<޳(/nfo%,c. vO*RS`[g'fx_7]$-X֬Gy:B$WEϒ]_bdIS=Ԁ$#2L [R$y+l)ٰ?2z>&Hd-)!m<5%A@0=r|쩽c(v3 "!9ݾ)*c1B=]فVz ^l5Ǒƿgn`'"gD.ZeileK,=Gl\_|Ʀ|tu ! aSMY@,#E,/S8IENDB`DarkRadiant-2.0.2/install/bitmaps/stimresponse.png000066400000000000000000000007231245424655700222650ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME\`IDAT8˥NAh3 Fyh4&&*Ac$`<-lF bC19!!M&?~~_V`O/&@ϷO9UjDAU'"NGtL{Ngz_IDAT8 0 C_o/ ba͛ڄH⭀՗sɊf<$P{|qjemg;f{,0'6r$ewIENDB`DarkRadiant-2.0.2/install/bitmaps/textool_facescale_pivot.png000066400000000000000000000004121245424655700244320ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME ZIDAT8˵R #a>KGw`H$@`3ǔP݉z`^.-af]"M^RRT;Nb̷\rsK21v:Aj`f IkFi&M"F43^2pIENDB`DarkRadiant-2.0.2/install/bitmaps/textool_merge.png000066400000000000000000000005461245424655700224120ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIMEA5IDAT8cŌH@"@7 `? ?,H5`5jo8Kb5w/_v2T'_JzT/ 3 48 /Tbg,`PM '`Y;L׈2?;r -|lT у"2G$Ks&o R)" >m[\ .ZZw+I*kPUv/!,*Lm\7߁sp3ɟx}ò=vIENDB`DarkRadiant-2.0.2/install/bitmaps/textureApplyToSelection16.png000066400000000000000000000005011245424655700245520ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIMEqIDAT8˥ 0BY%50E` zmꄖ2"Kv%N;CC8Uq  VJG).8sf96G'9ƒe\A1@B|caV뗑&%[N|f̸`gL}/l$EPM- FH Lñ( ~jDIENDB`DarkRadiant-2.0.2/install/bitmaps/textureLoadInTexWindow16.png000066400000000000000000000004601245424655700243370ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIMEqIDAT8˕10w#W_"ǢN TyY],R &{) FOR3ϵ\@._pnw%b,=xX`!V: xAWd]'pm{lbq?^i~/xg3 r\5B2#4\H }GIENDB`DarkRadiant-2.0.2/install/bitmaps/textureMode16.png000066400000000000000000000003051245424655700222020ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME 9TRIDAT8c?%Bc`c;\R ęEbFX}?![=~bnc+8ba4 C0xnu@qh*IENDB`DarkRadiant-2.0.2/install/bitmaps/texture_lock.png000066400000000000000000000003661245424655700222450ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIME ]OIDAT(ϥ[ gO~T`& nm߹U.*__kSm]ܳ>L Hė- k7ue|R46B)&OMwkd`Nw ;#~FީTIENDB`DarkRadiant-2.0.2/install/bitmaps/textures_popup.bmp000066400000000000000000000003561245424655700226340ustar00rootroot00000000000000BMv("""""" 3"""#" 3""310" #33""1AAA30""433"AAA330"4330"SAAA30"CA30"4U0"5C30"SSQ0"#C3""#R 2"""DarkRadiant-2.0.2/install/bitmaps/texwindow_findandreplace.png000066400000000000000000000003621245424655700246000ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME 9TIDAT8c?%BMYg$FF`biU$.  G )?G j`"Ov"IENDB`DarkRadiant-2.0.2/install/bitmaps/texwindow_flushandreload.png000066400000000000000000000006431245424655700246360ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME 0IDAT8˝AJ@)dSЅG, =GP,x v5Fc3M'$j޼FlNqV,U T_`*<ݷ$Ee |?/S,K<CeSU}X "(s*MH&~=8X1f''1a?nJul7l&:%R;ڑt^kzzpoA[oWn7d#Iֺc)/~esy7GIENDB`DarkRadiant-2.0.2/install/bitmaps/texwindow_hideunused.png000066400000000000000000000004211245424655700237720ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIMEIDAT8˥б 0ȡsR`5<SgCDg+>ED:}\~i,m1Rj5IENDB`DarkRadiant-2.0.2/install/bitmaps/view_clipper.png000066400000000000000000000003451245424655700222220ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIMEGHrIDAT(ϥRA K-<Fu[HIPNaݶ!GGJb`~# rx $TL#6 ʪ-)1dcgX L+"$n=0&N5IENDB`DarkRadiant-2.0.2/install/bitmaps/view_cubicclipping.png000066400000000000000000000004051245424655700233740ustar00rootroot00000000000000PNG  IHDRsO/bKGD pHYs  tIME$|IDAT(ϥS[ Yzܬfd?D]2D) ;fl@I8}\7ieyB:,"YDkƫ)T|ݔ/$Dgwicc`bítT7XC:Kj]'|wgF}]%^9sE(g):ZѶY V n 6XCp&D&ݷ>x~*'IobnG ߫U0A2*'ۻE0NJ9ΉZ#X*SX*û"gCu@8ׅ"Y;Er$kdwLك~;a}GIENDB`DarkRadiant-2.0.2/install/bitmaps/white.bmp000066400000000000000000000003701245424655700206420ustar00rootroot00000000000000BM6(  DarkRadiant-2.0.2/install/bitmaps/wireframe.png000066400000000000000000000010441245424655700215100ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  ~tIMEǵIDAT8˕NQLpRlHJ6 +$D°c)p.Pԅ @Mю|.Ӵ~sw$TݶV$H<DKQr;R>זx:|rOVQ.nn̩|ˀuz ,+&V8;0 Ō,(^:dB$^~B#C`&ݰq?0_w.#07g:_Z*\hoa8Voo!&ImY-0&:&Rsxq?pyů[q8K Q<{D7ɀa2dЏձ 2ޥTǘsށ3F +O0{X]@>N19;k;eS%XL8 $g4oR{AAR𼠈ap|v0?$yN@IENDB`DarkRadiant-2.0.2/install/bitmaps/wireframeMode16.png000066400000000000000000000007751245424655700224760ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME#3#IDAT8˥=kPWG+ЂII2Is4KCnj!Ch=4thId.ԡ]Сɧ(q }{y8Gf}sۡHRt] `?Yr ]v8>X,DQ4k3wIm;xjfZ7- MNg= *|>fWB"N /pzqYgfeF98N$+uJ$]I3 {38I뺕RqKjKjaxeYeYQy2j4K4υuuY2i|&5`'E[f6] qlla+9Qsq2aiIENDB`DarkRadiant-2.0.2/install/colours.xml000066400000000000000000000232151245424655700175760ustar00rootroot00000000000000 DarkRadiant-2.0.2/install/commandsystem.xml000066400000000000000000000054151245424655700207750ustar00rootroot00000000000000 DarkRadiant-2.0.2/install/darkradiant.desktop.in000066400000000000000000000007451245424655700216550ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Name=DarkRadiant GenericName=Level editor Comment=3D level editor for Doom 3 and the Dark Mod Comment[de]=3D Level Editor für Doom 3 und The Dark Mod Icon=@prefix@/share/darkradiant/bitmaps/darkradiant_icon_64x64.png # The %f means a single, local, absolute file. Remote files will be # first copied in a local temp location and then given to the program: Exec=@prefix@/bin/darkradiant %f Terminal=false Type=Application Categories=Game;3DGraphics; DarkRadiant-2.0.2/install/debug.xml000066400000000000000000000053331245424655700171770ustar00rootroot00000000000000 DarkRadiant-2.0.2/install/games/000077500000000000000000000000001245424655700164575ustar00rootroot00000000000000DarkRadiant-2.0.2/install/games/darkmod.game000066400000000000000000000327621245424655700207450ustar00rootroot00000000000000 tga jpg dds materials mtr fonts dat 2 The origin of this object in 3D space The classname of this entity. This must be a recognised class defined in one of the DEF files, and governs the overall behaviour of the entity The displayed name of this entity. This can be arbitrary, but must be unique across the entire map The direction this entity initially faces. Generally applied to AI or player_start entities. The displayed model or particle system for this entity. For a func_static or other entity type which can have brushes as children, this key must be set to the same value as "name" if brushes are used The model or particle system to be used when this entity is lit (i.e. for torches). The model or particle system to be used when this torch entity is extinguished. lights fogs DarkRadiant-2.0.2/install/games/doom3-demo.game000066400000000000000000000322541245424655700212630ustar00rootroot00000000000000 tga jpg dds materials mtr fonts dat 2 The origin of this object in 3D space The classname of this entity. This must be a recognised class defined in one of the DEF files, and governs the overall behaviour of the entity The displayed name of this entity. This can be arbitrary, but must be unique across the entire map The displayed model or particle system for this entity. For a func_static or other entity type which can have brushes as children, this key must be set to the same value as "name" if brushes are used The model or particle system to be used when this entity is lit (i.e. for torches). The model or particle system to be used when this torch entity is extinguished. lights fogs DarkRadiant-2.0.2/install/games/doom3.game000066400000000000000000000330271245424655700203400ustar00rootroot00000000000000 tga jpg dds materials mtr fonts dat 2 The origin of this object in 3D space The classname of this entity. This must be a recognised class defined in one of the DEF files, and governs the overall behaviour of the entity The displayed name of this entity. This can be arbitrary, but must be unique across the entire map The direction this entity initially faces. Generally applied to AI or player_start entities. The displayed model or particle system for this entity. For a func_static or other entity type which can have brushes as children, this key must be set to the same value as "name" if brushes are used The model or particle system to be used when this entity is lit (i.e. for torches). The model or particle system to be used when this torch entity is extinguished. lights fogs DarkRadiant-2.0.2/install/games/quake3.game000066400000000000000000000227771245424655700205220ustar00rootroot00000000000000 tga jpg dds materials mtr fonts dat 2 The origin of this object in 3D space The classname of this entity. This must be a recognised class defined in one of the DEF files, and governs the overall behaviour of the entity The displayed name of this entity. This can be arbitrary, but must be unique across the entire map The direction this entity initially faces. Generally applied to AI or player_start entities. The displayed model or particle system for this entity. For a func_static or other entity type which can have brushes as children, this key must be set to the same value as "name" if brushes are used The model or particle system to be used when this entity is lit (i.e. for torches). The model or particle system to be used when this torch entity is extinguished. lights fogs DarkRadiant-2.0.2/install/games/quake4.game000066400000000000000000000232051245424655700205060ustar00rootroot00000000000000 tga jpg dds materials mtr fonts dat 2 The origin of this object in 3D space The classname of this entity. This must be a recognised class defined in one of the DEF files, and governs the overall behaviour of the entity The displayed name of this entity. This can be arbitrary, but must be unique across the entire map The direction this entity initially faces. Generally applied to AI or player_start entities. The displayed model or particle system for this entity. For a func_static or other entity type which can have brushes as children, this key must be set to the same value as "name" if brushes are used The model or particle system to be used when this entity is lit (i.e. for torches). The model or particle system to be used when this torch entity is extinguished. lights fogs DarkRadiant-2.0.2/install/games/xreal.game000066400000000000000000000325671245424655700204420ustar00rootroot00000000000000 tga png jpg dds materials mtr 1 The origin of this object in 3D space The classname of this entity. This must be a recognised class defined in one of the DEF files, and governs the overall behaviour of the entity The displayed name of this entity. This can be arbitrary, but must be unique across the entire map The direction this entity initially faces. Generally applied to AI or player_start entities. The displayed model or particle system for this entity. For a func_static or other entity type which can have brushes as children, this key must be set to the same value as "name" if brushes are used The model or particle system to be used when this entity is lit (i.e. for torches). The model or particle system to be used when this torch entity is extinguished. lights fogs DarkRadiant-2.0.2/install/gl/000077500000000000000000000000001245424655700157655ustar00rootroot00000000000000DarkRadiant-2.0.2/install/gl/Makefile.shaders000066400000000000000000000004761245424655700210640ustar00rootroot00000000000000CGC = cgc CGCFLAGS_FP = -profile arbfp1 CGCFLAGS_VP = -profile arbvp1 all: interaction_fp.arb interaction_vp.arb interaction_fp.arb: interaction_fp.cg $(CGC) $(CGCFLAGS_FP) -o interaction_fp.arb interaction_fp.cg interaction_vp.arb: interaction_vp.cg $(CGC) $(CGCFLAGS_VP) -o interaction_vp.arb interaction_vp.cg DarkRadiant-2.0.2/install/gl/interaction_fp.arb000066400000000000000000000057441245424655700214710ustar00rootroot00000000000000!!ARBfp1.0 # cgc version 2.0.0015, build date May 15 2008 # command line args: -profile arbfp1 # source file: interaction_fp.cg #vendor NVIDIA Corporation #version 2.0.0.15 #profile arbfp1 #program main #semantic main.diffusemap : TEXUNIT0 #semantic main.bumpmap : TEXUNIT1 #semantic main.specularmap : TEXUNIT2 #semantic main.attenuationmap_xy : TEXUNIT3 #semantic main.attenuationmap_z : TEXUNIT4 #semantic main.view_origin : C4 #semantic main.light_origin : C2 #semantic main.light_color : C3 #semantic main.light_scale : C6 #semantic main.ambientFactor : C7 #var float4 IN.colour : $vin.COLOR : COL0 : 0 : 1 #var float4 IN.position : $vin.TEXCOORD0 : TEX0 : 0 : 1 #var float4 IN.tex_diffuse_bump : $vin.TEXCOORD1 : TEX1 : 0 : 1 #var float4 IN.tex_specular : $vin.TEXCOORD2 : TEX2 : 0 : 1 #var float4 IN.tex_atten_xy_z : $vin.TEXCOORD3 : TEX3 : 0 : 1 #var float3 IN.tangent : $vin.TEXCOORD4 : TEX4 : 0 : 1 #var float3 IN.binormal : $vin.TEXCOORD5 : TEX5 : 0 : 1 #var float3 IN.normal : $vin.TEXCOORD6 : TEX6 : 0 : 1 #var sampler2D diffusemap : TEXUNIT0 : texunit 0 : 1 : 1 #var sampler2D bumpmap : TEXUNIT1 : texunit 1 : 2 : 1 #var sampler2D specularmap : TEXUNIT2 : texunit 2 : 3 : 1 #var sampler2D attenuationmap_xy : TEXUNIT3 : texunit 3 : 4 : 1 #var sampler2D attenuationmap_z : TEXUNIT4 : texunit 4 : 5 : 1 #var float3 view_origin : C4 : c[4] : 6 : 1 #var float3 light_origin : C2 : c[2] : 7 : 1 #var float3 light_color : C3 : c[3] : 8 : 1 #var float3 light_scale : C6 : c[6] : 9 : 1 #var float ambientFactor : C7 : c[7] : 10 : 1 #var float4 main.color : $vout.COLOR : COL : -1 : 1 #const c[0] = 0.5 2 32 1 #const c[1] = 0 PARAM c[8] = { { 0.5, 2, 32, 1 }, { 0 }, program.local[2..7] }; TEMP R0; TEMP R1; TEMP R2; ADD R0.xyz, -fragment.texcoord[0], c[2]; DP3 R1.z, fragment.texcoord[6], R0; DP3 R1.x, fragment.texcoord[4], R0; DP3 R1.y, fragment.texcoord[5], R0; DP3 R0.x, R1, R1; RSQ R0.w, R0.x; MUL R2.xyz, R0.w, R1; ADD R0.xyz, -fragment.texcoord[0], c[4]; DP3 R1.z, fragment.texcoord[6], R0; DP3 R1.x, R0, fragment.texcoord[4]; DP3 R1.y, R0, fragment.texcoord[5]; DP3 R0.w, R1, R1; RSQ R0.w, R0.w; MAD R1.xyz, R0.w, R1, R2; DP3 R1.w, R1, R1; RSQ R1.w, R1.w; TEX R0.xyz, fragment.texcoord[1].zwzw, texture[1], 2D; ADD R0.xyz, R0, -c[0].x; MUL R0.xyz, R0, c[0].y; DP3 R0.w, R0, R0; RSQ R0.w, R0.w; MUL R0.xyz, R0.w, R0; MUL R1.xyz, R1.w, R1; DP3_SAT R0.w, R0, R1; DP3 R0.x, R0, R2; MOV R1.x, c[0].w; ADD R0.y, R1.x, -c[7].x; MAD_SAT R2.x, R0.y, R0, c[7]; MOV R0.xyz, c[6]; MUL R0.xyz, R0, c[3]; MUL R0.xyz, R0, R2.x; TEX R1, fragment.texcoord[1], texture[0], 2D; MUL R1.xyz, R1, R0; MUL R1, R1, fragment.color.primary; TEX R0.xyz, fragment.texcoord[2], texture[2], 2D; TXP R2.xyz, fragment.texcoord[3], texture[3], 2D; POW R0.w, R0.w, c[0].z; MUL R0.xyz, R0, c[3]; MAD R0.xyz, R0, R0.w, R1; CMP R2.xyz, -fragment.texcoord[3].w, R2, c[1].x; MOV R1.y, c[0].x; MOV R1.x, fragment.texcoord[3].z; TEX R1.xyz, R1, texture[4], 2D; MUL R0.xyz, R0, R2; MUL result.color.xyz, R0, R1; MOV result.color.w, R1; END # 46 instructions, 3 R-regs DarkRadiant-2.0.2/install/gl/interaction_fp.cg000066400000000000000000000065631245424655700213160ustar00rootroot00000000000000/// ============================================================================ /* Copyright (C) 2004 Robert Beckebans Please see the file "AUTHORS" for a list of contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /// ============================================================================ #include "utils.cg" struct cg_vertex2fragment { float4 colour : COLOR; float4 position : TEXCOORD0; float4 tex_diffuse_bump : TEXCOORD1; float4 tex_specular : TEXCOORD2; float4 tex_atten_xy_z : TEXCOORD3; float3 tangent : TEXCOORD4; float3 binormal : TEXCOORD5; float3 normal : TEXCOORD6; }; struct cg_fragment2final { float4 color : COLOR; }; cg_fragment2final main(cg_vertex2fragment IN, uniform sampler2D diffusemap : TEXUNIT0, uniform sampler2D bumpmap : TEXUNIT1, uniform sampler2D specularmap : TEXUNIT2, uniform sampler2D attenuationmap_xy : TEXUNIT3, uniform sampler2D attenuationmap_z : TEXUNIT4, uniform float3 view_origin : C4, uniform float3 light_origin : C2, uniform float3 light_color : C3, uniform float3 light_scale: C6, uniform float ambientFactor: C7) { cg_fragment2final OUT; // construct object-space-to-tangent-space 3x3 matrix float3x3 rotation = float3x3(IN.tangent, IN.binormal, IN.normal); // compute view direction in tangent space float3 V = normalize(mul(rotation, view_origin - IN.position.xyz)); // compute light direction in tangent space float3 L = normalize(mul(rotation, (light_origin - IN.position.xyz))); // compute half angle in tangent space float3 H = normalize(L + V); // compute normal in tangent space from bumpmap float3 T = CG_Expand(tex2D(bumpmap, IN.tex_diffuse_bump.zw).xyz); float3 N = normalize(T); // compute the diffuse term float4 diffuse = tex2D(diffusemap, IN.tex_diffuse_bump.xy); diffuse.rgb *= light_color * light_scale * saturate((1 - ambientFactor) * dot(N, L) + ambientFactor); // compute the specular term float3 specular = tex2D(specularmap, IN.tex_specular.xy).rgb * light_color * pow(saturate(dot(N, H)), 32); // Lookup values from attenuation textures float3 attenuation_xy = tex2Dproj( attenuationmap_xy, IN.tex_atten_xy_z.xyw ).rgb; float3 attenuation_z = tex2D( attenuationmap_z, float2(IN.tex_atten_xy_z.z, 0.5) ).rgb; // Set colour to black if the w value is negative, this means we are behind // the origin of a projected light if (IN.tex_atten_xy_z.w <= 0) attenuation_xy.rgb = 0; // multiply in vertex colour diffuse *= IN.colour; // compute final color OUT.color.rgba = diffuse; OUT.color.rgb += specular; OUT.color.rgb *= attenuation_xy; OUT.color.rgb *= attenuation_z; return OUT; } DarkRadiant-2.0.2/install/gl/interaction_fp.glsl000066400000000000000000000062721245424655700216630ustar00rootroot00000000000000/// ============================================================================ /* Copyright (C) 2004 Robert Beckebans Please see the file "CONTRIBUTORS" for a list of contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /// ============================================================================ uniform sampler2D u_diffusemap; uniform sampler2D u_bumpmap; uniform sampler2D u_specularmap; uniform sampler2D u_attenuationmap_xy; uniform sampler2D u_attenuationmap_z; uniform vec3 u_view_origin; uniform vec3 u_light_origin; uniform vec3 u_light_color; uniform float u_light_scale; // Vertex colour parameters. Vertex colour is calculated as // (colour * scale + offset), so for normal vertex colouring scale should be 1.0 // and offset 0.0, and for inverse colouring scale should be -1.0 and offset // 1.0. uniform float u_vcol_scale; uniform float u_vcol_offset; varying vec3 var_vertex; varying vec4 var_tex_diffuse_bump; varying vec2 var_tex_specular; varying vec4 var_tex_atten_xy_z; varying mat3 var_mat_os2ts; void main() { // compute view direction in tangent space vec3 V = normalize(var_mat_os2ts * (u_view_origin - var_vertex)); // compute light direction in tangent space vec3 L = normalize(var_mat_os2ts * (u_light_origin - var_vertex)); // compute half angle in tangent space vec3 H = normalize(L + V); // compute normal in tangent space from bumpmap vec3 N = 2.0 * (texture2D(u_bumpmap, var_tex_diffuse_bump.pq).xyz - 0.5); N = normalize(N); // compute the diffuse term vec4 diffuse = texture2D(u_diffusemap, var_tex_diffuse_bump.st); diffuse.rgb *= u_light_color * u_light_scale * clamp(dot(N, L), 0.0, 1.0); // compute the specular term float specIntensity = clamp(dot(N, H), 0.0, 1.0); specIntensity = pow(specIntensity, 32.0); vec3 specular = texture2D(u_specularmap, var_tex_specular.xy).rgb * u_light_color * specIntensity; // compute attenuation vec3 attenuation_xy = vec3(0.0, 0.0, 0.0); if (var_tex_atten_xy_z.w > 0.0) attenuation_xy = texture2DProj( u_attenuationmap_xy, var_tex_atten_xy_z.xyw ).rgb; vec3 attenuation_z = texture2D( u_attenuationmap_z, vec2(var_tex_atten_xy_z.z, 0.5) ).rgb; // compute final color gl_FragColor = diffuse * (gl_Color * u_vcol_scale + u_vcol_offset); gl_FragColor.rgb *= 2.0; // replacement for RENDER_SCREEN light scaling gl_FragColor.rgb += specular; gl_FragColor.rgb *= attenuation_xy; gl_FragColor.rgb *= attenuation_z; } DarkRadiant-2.0.2/install/gl/interaction_vp.arb000066400000000000000000001007251245424655700215040ustar00rootroot00000000000000!!ARBvp1.0 # cgc version 2.0.0015, build date May 15 2008 # command line args: -profile arbvp1 # source file: interaction_vp.cg #vendor NVIDIA Corporation #version 2.0.0.15 #profile arbvp1 #program main #semantic glstate : state #var float4 IN.colour : $vin.COLOR : COLOR0 : 0 : 1 #var float4 IN.position : $vin.POSITION : POSITION : 0 : 1 #var float4 IN.tex0 : $vin.ATTR8 : ATTR8 : 0 : 1 #var float3 IN.tangent : $vin.ATTR9 : ATTR9 : 0 : 1 #var float3 IN.binormal : $vin.ATTR10 : ATTR10 : 0 : 1 #var float3 IN.normal : $vin.ATTR11 : ATTR11 : 0 : 1 #var float4 glstate.material.ambient : state.material.ambient : : -1 : 0 #var float4 glstate.material.diffuse : state.material.diffuse : : -1 : 0 #var float4 glstate.material.specular : state.material.specular : : -1 : 0 #var float4 glstate.material.emission : state.material.emission : : -1 : 0 #var float4 glstate.material.shininess : state.material.shininess : : -1 : 0 #var float4 glstate.material.front.ambient : state.material.front.ambient : : -1 : 0 #var float4 glstate.material.front.diffuse : state.material.front.diffuse : : -1 : 0 #var float4 glstate.material.front.specular : state.material.front.specular : : -1 : 0 #var float4 glstate.material.front.emission : state.material.front.emission : : -1 : 0 #var float4 glstate.material.front.shininess : state.material.front.shininess : : -1 : 0 #var float4 glstate.material.back.ambient : state.material.back.ambient : : -1 : 0 #var float4 glstate.material.back.diffuse : state.material.back.diffuse : : -1 : 0 #var float4 glstate.material.back.specular : state.material.back.specular : : -1 : 0 #var float4 glstate.material.back.emission : state.material.back.emission : : -1 : 0 #var float4 glstate.material.back.shininess : state.material.back.shininess : : -1 : 0 #var float4 glstate.light[0].ambient : state.light[0].ambient : : -1 : 0 #var float4 glstate.light[0].diffuse : state.light[0].diffuse : : -1 : 0 #var float4 glstate.light[0].specular : state.light[0].specular : : -1 : 0 #var float4 glstate.light[0].position : state.light[0].position : : -1 : 0 #var float4 glstate.light[0].attenuation : state.light[0].attenuation : : -1 : 0 #var float4 glstate.light[0].spot.direction : state.light[0].spot.direction : : -1 : 0 #var float4 glstate.light[0].half : state.light[0].half : : -1 : 0 #var float4 glstate.light[1].ambient : state.light[1].ambient : : -1 : 0 #var float4 glstate.light[1].diffuse : state.light[1].diffuse : : -1 : 0 #var float4 glstate.light[1].specular : state.light[1].specular : : -1 : 0 #var float4 glstate.light[1].position : state.light[1].position : : -1 : 0 #var float4 glstate.light[1].attenuation : state.light[1].attenuation : : -1 : 0 #var float4 glstate.light[1].spot.direction : state.light[1].spot.direction : : -1 : 0 #var float4 glstate.light[1].half : state.light[1].half : : -1 : 0 #var float4 glstate.light[2].ambient : state.light[2].ambient : : -1 : 0 #var float4 glstate.light[2].diffuse : state.light[2].diffuse : : -1 : 0 #var float4 glstate.light[2].specular : state.light[2].specular : : -1 : 0 #var float4 glstate.light[2].position : state.light[2].position : : -1 : 0 #var float4 glstate.light[2].attenuation : state.light[2].attenuation : : -1 : 0 #var float4 glstate.light[2].spot.direction : state.light[2].spot.direction : : -1 : 0 #var float4 glstate.light[2].half : state.light[2].half : : -1 : 0 #var float4 glstate.light[3].ambient : state.light[3].ambient : : -1 : 0 #var float4 glstate.light[3].diffuse : state.light[3].diffuse : : -1 : 0 #var float4 glstate.light[3].specular : state.light[3].specular : : -1 : 0 #var float4 glstate.light[3].position : state.light[3].position : : -1 : 0 #var float4 glstate.light[3].attenuation : state.light[3].attenuation : : -1 : 0 #var float4 glstate.light[3].spot.direction : state.light[3].spot.direction : : -1 : 0 #var float4 glstate.light[3].half : state.light[3].half : : -1 : 0 #var float4 glstate.light[4].ambient : state.light[4].ambient : : -1 : 0 #var float4 glstate.light[4].diffuse : state.light[4].diffuse : : -1 : 0 #var float4 glstate.light[4].specular : state.light[4].specular : : -1 : 0 #var float4 glstate.light[4].position : state.light[4].position : : -1 : 0 #var float4 glstate.light[4].attenuation : state.light[4].attenuation : : -1 : 0 #var float4 glstate.light[4].spot.direction : state.light[4].spot.direction : : -1 : 0 #var float4 glstate.light[4].half : state.light[4].half : : -1 : 0 #var float4 glstate.light[5].ambient : state.light[5].ambient : : -1 : 0 #var float4 glstate.light[5].diffuse : state.light[5].diffuse : : -1 : 0 #var float4 glstate.light[5].specular : state.light[5].specular : : -1 : 0 #var float4 glstate.light[5].position : state.light[5].position : : -1 : 0 #var float4 glstate.light[5].attenuation : state.light[5].attenuation : : -1 : 0 #var float4 glstate.light[5].spot.direction : state.light[5].spot.direction : : -1 : 0 #var float4 glstate.light[5].half : state.light[5].half : : -1 : 0 #var float4 glstate.light[6].ambient : state.light[6].ambient : : -1 : 0 #var float4 glstate.light[6].diffuse : state.light[6].diffuse : : -1 : 0 #var float4 glstate.light[6].specular : state.light[6].specular : : -1 : 0 #var float4 glstate.light[6].position : state.light[6].position : : -1 : 0 #var float4 glstate.light[6].attenuation : state.light[6].attenuation : : -1 : 0 #var float4 glstate.light[6].spot.direction : state.light[6].spot.direction : : -1 : 0 #var float4 glstate.light[6].half : state.light[6].half : : -1 : 0 #var float4 glstate.light[7].ambient : state.light[7].ambient : : -1 : 0 #var float4 glstate.light[7].diffuse : state.light[7].diffuse : : -1 : 0 #var float4 glstate.light[7].specular : state.light[7].specular : : -1 : 0 #var float4 glstate.light[7].position : state.light[7].position : : -1 : 0 #var float4 glstate.light[7].attenuation : state.light[7].attenuation : : -1 : 0 #var float4 glstate.light[7].spot.direction : state.light[7].spot.direction : : -1 : 0 #var float4 glstate.light[7].half : state.light[7].half : : -1 : 0 #var float4 glstate.lightmodel.ambient : state.lightmodel.ambient : : -1 : 0 #var float4 glstate.lightmodel.scenecolor : state.lightmodel.scenecolor : : -1 : 0 #var float4 glstate.lightmodel.front.scenecolor : state.lightmodel.front.scenecolor : : -1 : 0 #var float4 glstate.lightmodel.back.scenecolor : state.lightmodel.back.scenecolor : : -1 : 0 #var float4 glstate.lightprod[0].ambient : state.lightprod[0].ambient : : -1 : 0 #var float4 glstate.lightprod[0].diffuse : state.lightprod[0].diffuse : : -1 : 0 #var float4 glstate.lightprod[0].specular : state.lightprod[0].specular : : -1 : 0 #var float4 glstate.lightprod[0].front.ambient : state.lightprod[0].front.ambient : : -1 : 0 #var float4 glstate.lightprod[0].front.diffuse : state.lightprod[0].front.diffuse : : -1 : 0 #var float4 glstate.lightprod[0].front.specular : state.lightprod[0].front.specular : : -1 : 0 #var float4 glstate.lightprod[0].back.ambient : state.lightprod[0].back.ambient : : -1 : 0 #var float4 glstate.lightprod[0].back.diffuse : state.lightprod[0].back.diffuse : : -1 : 0 #var float4 glstate.lightprod[0].back.specular : state.lightprod[0].back.specular : : -1 : 0 #var float4 glstate.lightprod[1].ambient : state.lightprod[1].ambient : : -1 : 0 #var float4 glstate.lightprod[1].diffuse : state.lightprod[1].diffuse : : -1 : 0 #var float4 glstate.lightprod[1].specular : state.lightprod[1].specular : : -1 : 0 #var float4 glstate.lightprod[1].front.ambient : state.lightprod[1].front.ambient : : -1 : 0 #var float4 glstate.lightprod[1].front.diffuse : state.lightprod[1].front.diffuse : : -1 : 0 #var float4 glstate.lightprod[1].front.specular : state.lightprod[1].front.specular : : -1 : 0 #var float4 glstate.lightprod[1].back.ambient : state.lightprod[1].back.ambient : : -1 : 0 #var float4 glstate.lightprod[1].back.diffuse : state.lightprod[1].back.diffuse : : -1 : 0 #var float4 glstate.lightprod[1].back.specular : state.lightprod[1].back.specular : : -1 : 0 #var float4 glstate.lightprod[2].ambient : state.lightprod[2].ambient : : -1 : 0 #var float4 glstate.lightprod[2].diffuse : state.lightprod[2].diffuse : : -1 : 0 #var float4 glstate.lightprod[2].specular : state.lightprod[2].specular : : -1 : 0 #var float4 glstate.lightprod[2].front.ambient : state.lightprod[2].front.ambient : : -1 : 0 #var float4 glstate.lightprod[2].front.diffuse : state.lightprod[2].front.diffuse : : -1 : 0 #var float4 glstate.lightprod[2].front.specular : state.lightprod[2].front.specular : : -1 : 0 #var float4 glstate.lightprod[2].back.ambient : state.lightprod[2].back.ambient : : -1 : 0 #var float4 glstate.lightprod[2].back.diffuse : state.lightprod[2].back.diffuse : : -1 : 0 #var float4 glstate.lightprod[2].back.specular : state.lightprod[2].back.specular : : -1 : 0 #var float4 glstate.lightprod[3].ambient : state.lightprod[3].ambient : : -1 : 0 #var float4 glstate.lightprod[3].diffuse : state.lightprod[3].diffuse : : -1 : 0 #var float4 glstate.lightprod[3].specular : state.lightprod[3].specular : : -1 : 0 #var float4 glstate.lightprod[3].front.ambient : state.lightprod[3].front.ambient : : -1 : 0 #var float4 glstate.lightprod[3].front.diffuse : state.lightprod[3].front.diffuse : : -1 : 0 #var float4 glstate.lightprod[3].front.specular : state.lightprod[3].front.specular : : -1 : 0 #var float4 glstate.lightprod[3].back.ambient : state.lightprod[3].back.ambient : : -1 : 0 #var float4 glstate.lightprod[3].back.diffuse : state.lightprod[3].back.diffuse : : -1 : 0 #var float4 glstate.lightprod[3].back.specular : state.lightprod[3].back.specular : : -1 : 0 #var float4 glstate.lightprod[4].ambient : state.lightprod[4].ambient : : -1 : 0 #var float4 glstate.lightprod[4].diffuse : state.lightprod[4].diffuse : : -1 : 0 #var float4 glstate.lightprod[4].specular : state.lightprod[4].specular : : -1 : 0 #var float4 glstate.lightprod[4].front.ambient : state.lightprod[4].front.ambient : : -1 : 0 #var float4 glstate.lightprod[4].front.diffuse : state.lightprod[4].front.diffuse : : -1 : 0 #var float4 glstate.lightprod[4].front.specular : state.lightprod[4].front.specular : : -1 : 0 #var float4 glstate.lightprod[4].back.ambient : state.lightprod[4].back.ambient : : -1 : 0 #var float4 glstate.lightprod[4].back.diffuse : state.lightprod[4].back.diffuse : : -1 : 0 #var float4 glstate.lightprod[4].back.specular : state.lightprod[4].back.specular : : -1 : 0 #var float4 glstate.lightprod[5].ambient : state.lightprod[5].ambient : : -1 : 0 #var float4 glstate.lightprod[5].diffuse : state.lightprod[5].diffuse : : -1 : 0 #var float4 glstate.lightprod[5].specular : state.lightprod[5].specular : : -1 : 0 #var float4 glstate.lightprod[5].front.ambient : state.lightprod[5].front.ambient : : -1 : 0 #var float4 glstate.lightprod[5].front.diffuse : state.lightprod[5].front.diffuse : : -1 : 0 #var float4 glstate.lightprod[5].front.specular : state.lightprod[5].front.specular : : -1 : 0 #var float4 glstate.lightprod[5].back.ambient : state.lightprod[5].back.ambient : : -1 : 0 #var float4 glstate.lightprod[5].back.diffuse : state.lightprod[5].back.diffuse : : -1 : 0 #var float4 glstate.lightprod[5].back.specular : state.lightprod[5].back.specular : : -1 : 0 #var float4 glstate.lightprod[6].ambient : state.lightprod[6].ambient : : -1 : 0 #var float4 glstate.lightprod[6].diffuse : state.lightprod[6].diffuse : : -1 : 0 #var float4 glstate.lightprod[6].specular : state.lightprod[6].specular : : -1 : 0 #var float4 glstate.lightprod[6].front.ambient : state.lightprod[6].front.ambient : : -1 : 0 #var float4 glstate.lightprod[6].front.diffuse : state.lightprod[6].front.diffuse : : -1 : 0 #var float4 glstate.lightprod[6].front.specular : state.lightprod[6].front.specular : : -1 : 0 #var float4 glstate.lightprod[6].back.ambient : state.lightprod[6].back.ambient : : -1 : 0 #var float4 glstate.lightprod[6].back.diffuse : state.lightprod[6].back.diffuse : : -1 : 0 #var float4 glstate.lightprod[6].back.specular : state.lightprod[6].back.specular : : -1 : 0 #var float4 glstate.lightprod[7].ambient : state.lightprod[7].ambient : : -1 : 0 #var float4 glstate.lightprod[7].diffuse : state.lightprod[7].diffuse : : -1 : 0 #var float4 glstate.lightprod[7].specular : state.lightprod[7].specular : : -1 : 0 #var float4 glstate.lightprod[7].front.ambient : state.lightprod[7].front.ambient : : -1 : 0 #var float4 glstate.lightprod[7].front.diffuse : state.lightprod[7].front.diffuse : : -1 : 0 #var float4 glstate.lightprod[7].front.specular : state.lightprod[7].front.specular : : -1 : 0 #var float4 glstate.lightprod[7].back.ambient : state.lightprod[7].back.ambient : : -1 : 0 #var float4 glstate.lightprod[7].back.diffuse : state.lightprod[7].back.diffuse : : -1 : 0 #var float4 glstate.lightprod[7].back.specular : state.lightprod[7].back.specular : : -1 : 0 #var float4 glstate.texgen[0].eye.s : state.texgen[0].eye.s : : -1 : 0 #var float4 glstate.texgen[0].eye.t : state.texgen[0].eye.t : : -1 : 0 #var float4 glstate.texgen[0].eye.r : state.texgen[0].eye.r : : -1 : 0 #var float4 glstate.texgen[0].eye.q : state.texgen[0].eye.q : : -1 : 0 #var float4 glstate.texgen[0].object.s : state.texgen[0].object.s : : -1 : 0 #var float4 glstate.texgen[0].object.t : state.texgen[0].object.t : : -1 : 0 #var float4 glstate.texgen[0].object.r : state.texgen[0].object.r : : -1 : 0 #var float4 glstate.texgen[0].object.q : state.texgen[0].object.q : : -1 : 0 #var float4 glstate.texgen[1].eye.s : state.texgen[1].eye.s : : -1 : 0 #var float4 glstate.texgen[1].eye.t : state.texgen[1].eye.t : : -1 : 0 #var float4 glstate.texgen[1].eye.r : state.texgen[1].eye.r : : -1 : 0 #var float4 glstate.texgen[1].eye.q : state.texgen[1].eye.q : : -1 : 0 #var float4 glstate.texgen[1].object.s : state.texgen[1].object.s : : -1 : 0 #var float4 glstate.texgen[1].object.t : state.texgen[1].object.t : : -1 : 0 #var float4 glstate.texgen[1].object.r : state.texgen[1].object.r : : -1 : 0 #var float4 glstate.texgen[1].object.q : state.texgen[1].object.q : : -1 : 0 #var float4 glstate.texgen[2].eye.s : state.texgen[2].eye.s : : -1 : 0 #var float4 glstate.texgen[2].eye.t : state.texgen[2].eye.t : : -1 : 0 #var float4 glstate.texgen[2].eye.r : state.texgen[2].eye.r : : -1 : 0 #var float4 glstate.texgen[2].eye.q : state.texgen[2].eye.q : : -1 : 0 #var float4 glstate.texgen[2].object.s : state.texgen[2].object.s : : -1 : 0 #var float4 glstate.texgen[2].object.t : state.texgen[2].object.t : : -1 : 0 #var float4 glstate.texgen[2].object.r : state.texgen[2].object.r : : -1 : 0 #var float4 glstate.texgen[2].object.q : state.texgen[2].object.q : : -1 : 0 #var float4 glstate.texgen[3].eye.s : state.texgen[3].eye.s : : -1 : 0 #var float4 glstate.texgen[3].eye.t : state.texgen[3].eye.t : : -1 : 0 #var float4 glstate.texgen[3].eye.r : state.texgen[3].eye.r : : -1 : 0 #var float4 glstate.texgen[3].eye.q : state.texgen[3].eye.q : : -1 : 0 #var float4 glstate.texgen[3].object.s : state.texgen[3].object.s : : -1 : 0 #var float4 glstate.texgen[3].object.t : state.texgen[3].object.t : : -1 : 0 #var float4 glstate.texgen[3].object.r : state.texgen[3].object.r : : -1 : 0 #var float4 glstate.texgen[3].object.q : state.texgen[3].object.q : : -1 : 0 #var float4 glstate.texgen[4].eye.s : state.texgen[4].eye.s : : -1 : 0 #var float4 glstate.texgen[4].eye.t : state.texgen[4].eye.t : : -1 : 0 #var float4 glstate.texgen[4].eye.r : state.texgen[4].eye.r : : -1 : 0 #var float4 glstate.texgen[4].eye.q : state.texgen[4].eye.q : : -1 : 0 #var float4 glstate.texgen[4].object.s : state.texgen[4].object.s : : -1 : 0 #var float4 glstate.texgen[4].object.t : state.texgen[4].object.t : : -1 : 0 #var float4 glstate.texgen[4].object.r : state.texgen[4].object.r : : -1 : 0 #var float4 glstate.texgen[4].object.q : state.texgen[4].object.q : : -1 : 0 #var float4 glstate.texgen[5].eye.s : state.texgen[5].eye.s : : -1 : 0 #var float4 glstate.texgen[5].eye.t : state.texgen[5].eye.t : : -1 : 0 #var float4 glstate.texgen[5].eye.r : state.texgen[5].eye.r : : -1 : 0 #var float4 glstate.texgen[5].eye.q : state.texgen[5].eye.q : : -1 : 0 #var float4 glstate.texgen[5].object.s : state.texgen[5].object.s : : -1 : 0 #var float4 glstate.texgen[5].object.t : state.texgen[5].object.t : : -1 : 0 #var float4 glstate.texgen[5].object.r : state.texgen[5].object.r : : -1 : 0 #var float4 glstate.texgen[5].object.q : state.texgen[5].object.q : : -1 : 0 #var float4 glstate.texgen[6].eye.s : state.texgen[6].eye.s : : -1 : 0 #var float4 glstate.texgen[6].eye.t : state.texgen[6].eye.t : : -1 : 0 #var float4 glstate.texgen[6].eye.r : state.texgen[6].eye.r : : -1 : 0 #var float4 glstate.texgen[6].eye.q : state.texgen[6].eye.q : : -1 : 0 #var float4 glstate.texgen[6].object.s : state.texgen[6].object.s : : -1 : 0 #var float4 glstate.texgen[6].object.t : state.texgen[6].object.t : : -1 : 0 #var float4 glstate.texgen[6].object.r : state.texgen[6].object.r : : -1 : 0 #var float4 glstate.texgen[6].object.q : state.texgen[6].object.q : : -1 : 0 #var float4 glstate.texgen[7].eye.s : state.texgen[7].eye.s : : -1 : 0 #var float4 glstate.texgen[7].eye.t : state.texgen[7].eye.t : : -1 : 0 #var float4 glstate.texgen[7].eye.r : state.texgen[7].eye.r : : -1 : 0 #var float4 glstate.texgen[7].eye.q : state.texgen[7].eye.q : : -1 : 0 #var float4 glstate.texgen[7].object.s : state.texgen[7].object.s : : -1 : 0 #var float4 glstate.texgen[7].object.t : state.texgen[7].object.t : : -1 : 0 #var float4 glstate.texgen[7].object.r : state.texgen[7].object.r : : -1 : 0 #var float4 glstate.texgen[7].object.q : state.texgen[7].object.q : : -1 : 0 #var float4 glstate.fog.color : state.fog.color : : -1 : 0 #var float4 glstate.fog.params : state.fog.params : : -1 : 0 #var float4 glstate.clip[0].plane : state.clip[0].plane : : -1 : 0 #var float4 glstate.clip[1].plane : state.clip[1].plane : : -1 : 0 #var float4 glstate.clip[2].plane : state.clip[2].plane : : -1 : 0 #var float4 glstate.clip[3].plane : state.clip[3].plane : : -1 : 0 #var float4 glstate.clip[4].plane : state.clip[4].plane : : -1 : 0 #var float4 glstate.clip[5].plane : state.clip[5].plane : : -1 : 0 #var float4 glstate.clip[6].plane : state.clip[6].plane : : -1 : 0 #var float4 glstate.clip[7].plane : state.clip[7].plane : : -1 : 0 #var float glstate.point.size : state.point.size : : -1 : 0 #var float glstate.point.attenuation : state.point.attenuation : : -1 : 0 #var float4x4 glstate.matrix.modelview[0] : state.matrix.modelview[0] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[1] : state.matrix.modelview[1] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[2] : state.matrix.modelview[2] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[3] : state.matrix.modelview[3] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[4] : state.matrix.modelview[4] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[5] : state.matrix.modelview[5] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[6] : state.matrix.modelview[6] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[7] : state.matrix.modelview[7] : , 4 : -1 : 0 #var float4x4 glstate.matrix.projection : state.matrix.projection : , 4 : -1 : 0 #var float4x4 glstate.matrix.mvp : state.matrix.mvp : c[1], 4 : -1 : 1 #var float4x4 glstate.matrix.texture[0] : state.matrix.texture[0] : c[5], 4 : -1 : 1 #var float4x4 glstate.matrix.texture[1] : state.matrix.texture[1] : c[9], 4 : -1 : 1 #var float4x4 glstate.matrix.texture[2] : state.matrix.texture[2] : c[13], 4 : -1 : 1 #var float4x4 glstate.matrix.texture[3] : state.matrix.texture[3] : c[17], 4 : -1 : 1 #var float4x4 glstate.matrix.texture[4] : state.matrix.texture[4] : , 4 : -1 : 0 #var float4x4 glstate.matrix.texture[5] : state.matrix.texture[5] : , 4 : -1 : 0 #var float4x4 glstate.matrix.texture[6] : state.matrix.texture[6] : , 4 : -1 : 0 #var float4x4 glstate.matrix.texture[7] : state.matrix.texture[7] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[0] : state.matrix.palette[0] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[1] : state.matrix.palette[1] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[2] : state.matrix.palette[2] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[3] : state.matrix.palette[3] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[4] : state.matrix.palette[4] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[5] : state.matrix.palette[5] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[6] : state.matrix.palette[6] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[7] : state.matrix.palette[7] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[0] : state.matrix.program[0] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[1] : state.matrix.program[1] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[2] : state.matrix.program[2] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[3] : state.matrix.program[3] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[4] : state.matrix.program[4] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[5] : state.matrix.program[5] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[6] : state.matrix.program[6] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[7] : state.matrix.program[7] : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[0] : state.matrix.modelview[0].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[1] : state.matrix.modelview[1].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[2] : state.matrix.modelview[2].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[3] : state.matrix.modelview[3].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[4] : state.matrix.modelview[4].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[5] : state.matrix.modelview[5].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[6] : state.matrix.modelview[6].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[7] : state.matrix.modelview[7].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.projection : state.matrix.projection.inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.mvp : state.matrix.mvp.inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[0] : state.matrix.texture[0].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[1] : state.matrix.texture[1].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[2] : state.matrix.texture[2].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[3] : state.matrix.texture[3].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[4] : state.matrix.texture[4].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[5] : state.matrix.texture[5].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[6] : state.matrix.texture[6].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[7] : state.matrix.texture[7].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[0] : state.matrix.palette[0].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[1] : state.matrix.palette[1].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[2] : state.matrix.palette[2].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[3] : state.matrix.palette[3].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[4] : state.matrix.palette[4].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[5] : state.matrix.palette[5].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[6] : state.matrix.palette[6].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[7] : state.matrix.palette[7].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[0] : state.matrix.program[0].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[1] : state.matrix.program[1].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[2] : state.matrix.program[2].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[3] : state.matrix.program[3].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[4] : state.matrix.program[4].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[5] : state.matrix.program[5].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[6] : state.matrix.program[6].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[7] : state.matrix.program[7].inverse : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[0] : state.matrix.modelview[0].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[1] : state.matrix.modelview[1].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[2] : state.matrix.modelview[2].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[3] : state.matrix.modelview[3].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[4] : state.matrix.modelview[4].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[5] : state.matrix.modelview[5].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[6] : state.matrix.modelview[6].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[7] : state.matrix.modelview[7].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.projection : state.matrix.projection.transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.mvp : state.matrix.mvp.transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[0] : state.matrix.texture[0].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[1] : state.matrix.texture[1].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[2] : state.matrix.texture[2].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[3] : state.matrix.texture[3].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[4] : state.matrix.texture[4].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[5] : state.matrix.texture[5].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[6] : state.matrix.texture[6].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[7] : state.matrix.texture[7].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[0] : state.matrix.palette[0].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[1] : state.matrix.palette[1].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[2] : state.matrix.palette[2].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[3] : state.matrix.palette[3].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[4] : state.matrix.palette[4].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[5] : state.matrix.palette[5].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[6] : state.matrix.palette[6].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[7] : state.matrix.palette[7].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[0] : state.matrix.program[0].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[1] : state.matrix.program[1].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[2] : state.matrix.program[2].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[3] : state.matrix.program[3].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[4] : state.matrix.program[4].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[5] : state.matrix.program[5].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[6] : state.matrix.program[6].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[7] : state.matrix.program[7].transpose : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[0] : state.matrix.modelview[0].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[1] : state.matrix.modelview[1].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[2] : state.matrix.modelview[2].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[3] : state.matrix.modelview[3].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[4] : state.matrix.modelview[4].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[5] : state.matrix.modelview[5].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[6] : state.matrix.modelview[6].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[7] : state.matrix.modelview[7].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.projection : state.matrix.projection.invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.mvp : state.matrix.mvp.invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[0] : state.matrix.texture[0].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[1] : state.matrix.texture[1].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[2] : state.matrix.texture[2].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[3] : state.matrix.texture[3].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[4] : state.matrix.texture[4].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[5] : state.matrix.texture[5].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[6] : state.matrix.texture[6].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[7] : state.matrix.texture[7].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[0] : state.matrix.palette[0].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[1] : state.matrix.palette[1].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[2] : state.matrix.palette[2].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[3] : state.matrix.palette[3].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[4] : state.matrix.palette[4].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[5] : state.matrix.palette[5].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[6] : state.matrix.palette[6].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[7] : state.matrix.palette[7].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[0] : state.matrix.program[0].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[1] : state.matrix.program[1].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[2] : state.matrix.program[2].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[3] : state.matrix.program[3].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[4] : state.matrix.program[4].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[5] : state.matrix.program[5].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[6] : state.matrix.program[6].invtrans : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[7] : state.matrix.program[7].invtrans : , 4 : -1 : 0 #var float4 main.colour : $vout.COLOR : COL0 : -1 : 1 #var float4 main.hposition : $vout.POSITION : HPOS : -1 : 1 #var float4 main.position : $vout.TEXCOORD0 : TEX0 : -1 : 1 #var float4 main.tex_diffuse_bump : $vout.TEXCOORD1 : TEX1 : -1 : 1 #var float4 main.tex_specular : $vout.TEXCOORD2 : TEX2 : -1 : 1 #var float4 main.tex_atten_xy_z : $vout.TEXCOORD3 : TEX3 : -1 : 1 #var float3 main.tangent : $vout.TEXCOORD4 : TEX4 : -1 : 1 #var float3 main.binormal : $vout.TEXCOORD5 : TEX5 : -1 : 1 #var float3 main.normal : $vout.TEXCOORD6 : TEX6 : -1 : 1 PARAM c[21] = { program.local[0], state.matrix.mvp, state.matrix.texture[0], state.matrix.texture[1], state.matrix.texture[2], state.matrix.texture[3] }; TEMP R0; DP4 R0.x, vertex.attrib[8], c[9]; DP4 R0.y, vertex.attrib[8], c[10]; MOV result.color, vertex.color; MOV result.texcoord[0], vertex.position; MOV result.texcoord[4].xyz, vertex.attrib[9]; MOV result.texcoord[5].xyz, vertex.attrib[10]; MOV result.texcoord[6].xyz, vertex.attrib[11]; MOV result.texcoord[1].zw, R0.xyxy; DP4 result.position.w, vertex.position, c[4]; DP4 result.position.z, vertex.position, c[3]; DP4 result.position.y, vertex.position, c[2]; DP4 result.position.x, vertex.position, c[1]; DP4 result.texcoord[1].y, vertex.attrib[8], c[6]; DP4 result.texcoord[1].x, vertex.attrib[8], c[5]; DP4 result.texcoord[2].w, vertex.attrib[8], c[16]; DP4 result.texcoord[2].z, vertex.attrib[8], c[15]; DP4 result.texcoord[2].y, vertex.attrib[8], c[14]; DP4 result.texcoord[2].x, vertex.attrib[8], c[13]; DP4 result.texcoord[3].w, vertex.position, c[20]; DP4 result.texcoord[3].z, vertex.position, c[19]; DP4 result.texcoord[3].y, vertex.position, c[18]; DP4 result.texcoord[3].x, vertex.position, c[17]; END # 22 instructions, 1 R-regs DarkRadiant-2.0.2/install/gl/interaction_vp.cg000066400000000000000000000044311245424655700213260ustar00rootroot00000000000000/// ============================================================================ /* Copyright (C) 2004 Robert Beckebans Please see the file "AUTHORS" for a list of contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /// ============================================================================ struct cg_app2vertex { float4 colour : COLOR; float4 position : POSITION; float4 tex0 : ATTR8; float3 tangent : ATTR9; float3 binormal : ATTR10; float3 normal : ATTR11; }; struct cg_vertex2fragment { float4 colour : COLOR; float4 hposition : POSITION; float4 position : TEXCOORD0; float4 tex_diffuse_bump : TEXCOORD1; float4 tex_specular : TEXCOORD2; float4 tex_atten_xy_z : TEXCOORD3; float3 tangent : TEXCOORD4; float3 binormal : TEXCOORD5; float3 normal : TEXCOORD6; }; cg_vertex2fragment main(cg_app2vertex IN) { cg_vertex2fragment OUT; // transform vertex position into homogenous clip-space OUT.hposition = mul(glstate.matrix.mvp, IN.position); // assign position in object space OUT.position = IN.position; // transform texcoords OUT.tex_diffuse_bump.xy = mul(glstate.matrix.texture[0], IN.tex0).xy; // transform texcoords OUT.tex_diffuse_bump.zw = mul(glstate.matrix.texture[1], IN.tex0).xy; // transform texcoords OUT.tex_specular = mul(glstate.matrix.texture[2], IN.tex0); // transform vertex position into light space OUT.tex_atten_xy_z = mul(glstate.matrix.texture[3], IN.position); // assign tangent space vectors OUT.tangent = IN.tangent; OUT.binormal = IN.binormal; OUT.normal = IN.normal; // Pass-thru vertex colour OUT.colour = IN.colour; return OUT; } DarkRadiant-2.0.2/install/gl/interaction_vp.glsl000066400000000000000000000043101245424655700216720ustar00rootroot00000000000000/// ============================================================================ /* Copyright (C) 2004 Robert Beckebans Please see the file "CONTRIBUTORS" for a list of contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /// ============================================================================ attribute vec4 attr_TexCoord0; attribute vec3 attr_Tangent; attribute vec3 attr_Bitangent; attribute vec3 attr_Normal; varying vec3 var_vertex; varying vec4 var_tex_diffuse_bump; varying vec2 var_tex_specular; varying vec4 var_tex_atten_xy_z; varying mat3 var_mat_os2ts; void main() { // transform vertex position into homogenous clip-space gl_Position = ftransform(); // assign position in object space var_vertex = gl_Vertex.xyz; // transform texcoords into diffusemap texture space var_tex_diffuse_bump.st = (gl_TextureMatrix[0] * attr_TexCoord0).st; // transform texcoords into bumpmap texture space var_tex_diffuse_bump.pq = (gl_TextureMatrix[1] * attr_TexCoord0).st; // transform texcoords into specularmap texture space var_tex_specular = (gl_TextureMatrix[2] * attr_TexCoord0).st; // calc light xy,z attenuation in light space var_tex_atten_xy_z = gl_TextureMatrix[3] * gl_Vertex; // construct object-space-to-tangent-space 3x3 matrix var_mat_os2ts = mat3( attr_Tangent.x, attr_Bitangent.x, attr_Normal.x, attr_Tangent.y, attr_Bitangent.y, attr_Normal.y, attr_Tangent.z, attr_Bitangent.z, attr_Normal.z ); // Pass through vertex colour gl_FrontColor = gl_Color; } DarkRadiant-2.0.2/install/gl/utils.cg000066400000000000000000000024341245424655700174430ustar00rootroot00000000000000/// ============================================================================ /* Copyright (C) 2004 Robert Beckebans Please see the file "AUTHORS" for a list of contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /// ============================================================================ // fresnel approximation float fast_fresnel(float3 I, float3 N, float3 fresnel_values) { float power = fresnel_values.x; float scale = fresnel_values.y; float bias = fresnel_values.z; return bias + pow(1.0 - dot(I, N), power) * scale; } float3 CG_Expand(float3 v) { return (v - 0.5) * 2; // expand a range-compressed vector } DarkRadiant-2.0.2/install/gl/zfill_arbfp1.cg000066400000000000000000000025331245424655700206560ustar00rootroot00000000000000/// ============================================================================ /* Copyright (C) 2003 Robert Beckebans Copyright (C) 2003, 2004 contributors of the XreaL project Please see the file "AUTHORS" for a list of contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /// ============================================================================ struct cg_vertex2fragment { float4 position : POSITION; float4 tex0 : TEXCOORD0; }; struct cg_fragment2final { float4 color : COLOR; }; cg_fragment2final main(in cg_vertex2fragment IN, uniform sampler2D colormap) { cg_fragment2final OUT; OUT.color.w = tex2D(colormap, IN.tex0.xy).a; OUT.color.xyz = 0; return OUT; } DarkRadiant-2.0.2/install/gl/zfill_arbvp1.cg000066400000000000000000000027451245424655700207030ustar00rootroot00000000000000/// ============================================================================ /* Copyright (C) 2003 Robert Beckebans Copyright (C) 2003, 2004 contributors of the XreaL project Please see the file "AUTHORS" for a list of contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /// ============================================================================ struct cg_app2vertex { float4 position : ATTR0; float4 texcoord0 : ATTR8; }; struct cg_vertex2fragment { float4 position : POSITION; float4 tex0 : TEXCOORD0; }; cg_vertex2fragment main(cg_app2vertex IN) { cg_vertex2fragment OUT; // transform vertex position into homogenous clip-space OUT.position = mul(glstate.matrix.mvp, IN.position); // transform texcoords into 1st texture space OUT.tex0 = mul(glstate.matrix.texture[0], IN.texcoord0); return OUT; } DarkRadiant-2.0.2/install/gl/zfill_fp.glp000066400000000000000000000011271245424655700202770ustar00rootroot00000000000000!!ARBfp1.0 # cgc version 1.3.0001, build date Aug 4 2004 10:01:10 # command line args: -profile arbfp1 # source file: ..\..\setup\data\tools\gl\zfill_arbfp1.cg #vendor NVIDIA Corporation #version 1.0.02 #profile arbfp1 #program main #semantic main.colormap #var float4 IN.position : : : 0 : 0 #var float4 IN.tex0 : $vin.TEX0 : TEX0 : 0 : 1 #var sampler2D colormap : : texunit 0 : 1 : 1 #var float4 main.color : $vout.COL : COL : -1 : 1 #const c[0] = 0 PARAM c[1] = { { 0 } }; MOV result.color.xyz, c[0].x; TEX result.color.w, fragment.texcoord[0], texture[0], 2D; END # 2 instructions, 0 R-regs DarkRadiant-2.0.2/install/gl/zfill_fp.glsl000066400000000000000000000020701245424655700204540ustar00rootroot00000000000000/// ============================================================================ /* Copyright (C) 2004 Robert Beckebans Please see the file "CONTRIBUTORS" for a list of contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /// ============================================================================ void main() { gl_FragColor.a = 1.0; gl_FragColor.rgb = vec3(1.0, 1.0, 0.0); } DarkRadiant-2.0.2/install/gl/zfill_vp.glp000066400000000000000000000761741245424655700203350ustar00rootroot00000000000000!!ARBvp1.0 # cgc version 1.3.0001, build date Aug 4 2004 10:01:10 # command line args: -profile arbvp1 # source file: ..\..\setup\data\tools\gl\zfill_arbvp1.cg #vendor NVIDIA Corporation #version 1.0.02 #profile arbvp1 #program main #semantic glstate : STATE #var float4 glstate.material.ambient : STATE.MATERIAL.AMBIENT : : -1 : 0 #var float4 glstate.material.diffuse : STATE.MATERIAL.DIFFUSE : : -1 : 0 #var float4 glstate.material.specular : STATE.MATERIAL.SPECULAR : : -1 : 0 #var float4 glstate.material.emission : STATE.MATERIAL.EMISSION : : -1 : 0 #var float4 glstate.material.shininess : STATE.MATERIAL.SHININESS : : -1 : 0 #var float4 glstate.material.front.ambient : STATE.MATERIAL.FRONT.AMBIENT : : -1 : 0 #var float4 glstate.material.front.diffuse : STATE.MATERIAL.FRONT.DIFFUSE : : -1 : 0 #var float4 glstate.material.front.specular : STATE.MATERIAL.FRONT.SPECULAR : : -1 : 0 #var float4 glstate.material.front.emission : STATE.MATERIAL.FRONT.EMISSION : : -1 : 0 #var float4 glstate.material.front.shininess : STATE.MATERIAL.FRONT.SHININESS : : -1 : 0 #var float4 glstate.material.back.ambient : STATE.MATERIAL.BACK.AMBIENT : : -1 : 0 #var float4 glstate.material.back.diffuse : STATE.MATERIAL.BACK.DIFFUSE : : -1 : 0 #var float4 glstate.material.back.specular : STATE.MATERIAL.BACK.SPECULAR : : -1 : 0 #var float4 glstate.material.back.emission : STATE.MATERIAL.BACK.EMISSION : : -1 : 0 #var float4 glstate.material.back.shininess : STATE.MATERIAL.BACK.SHININESS : : -1 : 0 #var float4 glstate.light[0].ambient : STATE.LIGHT[0].AMBIENT : : -1 : 0 #var float4 glstate.light[0].diffuse : STATE.LIGHT[0].DIFFUSE : : -1 : 0 #var float4 glstate.light[0].specular : STATE.LIGHT[0].SPECULAR : : -1 : 0 #var float4 glstate.light[0].position : STATE.LIGHT[0].POSITION : : -1 : 0 #var float4 glstate.light[0].attenuation : STATE.LIGHT[0].ATTENUATION : : -1 : 0 #var float4 glstate.light[0].spot.direction : STATE.LIGHT[0].SPOT.DIRECTION : : -1 : 0 #var float4 glstate.light[0].half : STATE.LIGHT[0].HALF : : -1 : 0 #var float4 glstate.light[1].ambient : STATE.LIGHT[1].AMBIENT : : -1 : 0 #var float4 glstate.light[1].diffuse : STATE.LIGHT[1].DIFFUSE : : -1 : 0 #var float4 glstate.light[1].specular : STATE.LIGHT[1].SPECULAR : : -1 : 0 #var float4 glstate.light[1].position : STATE.LIGHT[1].POSITION : : -1 : 0 #var float4 glstate.light[1].attenuation : STATE.LIGHT[1].ATTENUATION : : -1 : 0 #var float4 glstate.light[1].spot.direction : STATE.LIGHT[1].SPOT.DIRECTION : : -1 : 0 #var float4 glstate.light[1].half : STATE.LIGHT[1].HALF : : -1 : 0 #var float4 glstate.light[2].ambient : STATE.LIGHT[2].AMBIENT : : -1 : 0 #var float4 glstate.light[2].diffuse : STATE.LIGHT[2].DIFFUSE : : -1 : 0 #var float4 glstate.light[2].specular : STATE.LIGHT[2].SPECULAR : : -1 : 0 #var float4 glstate.light[2].position : STATE.LIGHT[2].POSITION : : -1 : 0 #var float4 glstate.light[2].attenuation : STATE.LIGHT[2].ATTENUATION : : -1 : 0 #var float4 glstate.light[2].spot.direction : STATE.LIGHT[2].SPOT.DIRECTION : : -1 : 0 #var float4 glstate.light[2].half : STATE.LIGHT[2].HALF : : -1 : 0 #var float4 glstate.light[3].ambient : STATE.LIGHT[3].AMBIENT : : -1 : 0 #var float4 glstate.light[3].diffuse : STATE.LIGHT[3].DIFFUSE : : -1 : 0 #var float4 glstate.light[3].specular : STATE.LIGHT[3].SPECULAR : : -1 : 0 #var float4 glstate.light[3].position : STATE.LIGHT[3].POSITION : : -1 : 0 #var float4 glstate.light[3].attenuation : STATE.LIGHT[3].ATTENUATION : : -1 : 0 #var float4 glstate.light[3].spot.direction : STATE.LIGHT[3].SPOT.DIRECTION : : -1 : 0 #var float4 glstate.light[3].half : STATE.LIGHT[3].HALF : : -1 : 0 #var float4 glstate.light[4].ambient : STATE.LIGHT[4].AMBIENT : : -1 : 0 #var float4 glstate.light[4].diffuse : STATE.LIGHT[4].DIFFUSE : : -1 : 0 #var float4 glstate.light[4].specular : STATE.LIGHT[4].SPECULAR : : -1 : 0 #var float4 glstate.light[4].position : STATE.LIGHT[4].POSITION : : -1 : 0 #var float4 glstate.light[4].attenuation : STATE.LIGHT[4].ATTENUATION : : -1 : 0 #var float4 glstate.light[4].spot.direction : STATE.LIGHT[4].SPOT.DIRECTION : : -1 : 0 #var float4 glstate.light[4].half : STATE.LIGHT[4].HALF : : -1 : 0 #var float4 glstate.light[5].ambient : STATE.LIGHT[5].AMBIENT : : -1 : 0 #var float4 glstate.light[5].diffuse : STATE.LIGHT[5].DIFFUSE : : -1 : 0 #var float4 glstate.light[5].specular : STATE.LIGHT[5].SPECULAR : : -1 : 0 #var float4 glstate.light[5].position : STATE.LIGHT[5].POSITION : : -1 : 0 #var float4 glstate.light[5].attenuation : STATE.LIGHT[5].ATTENUATION : : -1 : 0 #var float4 glstate.light[5].spot.direction : STATE.LIGHT[5].SPOT.DIRECTION : : -1 : 0 #var float4 glstate.light[5].half : STATE.LIGHT[5].HALF : : -1 : 0 #var float4 glstate.light[6].ambient : STATE.LIGHT[6].AMBIENT : : -1 : 0 #var float4 glstate.light[6].diffuse : STATE.LIGHT[6].DIFFUSE : : -1 : 0 #var float4 glstate.light[6].specular : STATE.LIGHT[6].SPECULAR : : -1 : 0 #var float4 glstate.light[6].position : STATE.LIGHT[6].POSITION : : -1 : 0 #var float4 glstate.light[6].attenuation : STATE.LIGHT[6].ATTENUATION : : -1 : 0 #var float4 glstate.light[6].spot.direction : STATE.LIGHT[6].SPOT.DIRECTION : : -1 : 0 #var float4 glstate.light[6].half : STATE.LIGHT[6].HALF : : -1 : 0 #var float4 glstate.light[7].ambient : STATE.LIGHT[7].AMBIENT : : -1 : 0 #var float4 glstate.light[7].diffuse : STATE.LIGHT[7].DIFFUSE : : -1 : 0 #var float4 glstate.light[7].specular : STATE.LIGHT[7].SPECULAR : : -1 : 0 #var float4 glstate.light[7].position : STATE.LIGHT[7].POSITION : : -1 : 0 #var float4 glstate.light[7].attenuation : STATE.LIGHT[7].ATTENUATION : : -1 : 0 #var float4 glstate.light[7].spot.direction : STATE.LIGHT[7].SPOT.DIRECTION : : -1 : 0 #var float4 glstate.light[7].half : STATE.LIGHT[7].HALF : : -1 : 0 #var float4 glstate.lightmodel.ambient : STATE.LIGHTMODEL.AMBIENT : : -1 : 0 #var float4 glstate.lightmodel.scenecolor : STATE.LIGHTMODEL.SCENECOLOR : : -1 : 0 #var float4 glstate.lightmodel.front.scenecolor : STATE.LIGHTMODEL.FRONT.SCENECOLOR : : -1 : 0 #var float4 glstate.lightmodel.back.scenecolor : STATE.LIGHTMODEL.BACK.SCENECOLOR : : -1 : 0 #var float4 glstate.lightprod[0].ambient : STATE.LIGHTPROD[0].AMBIENT : : -1 : 0 #var float4 glstate.lightprod[0].diffuse : STATE.LIGHTPROD[0].DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[0].specular : STATE.LIGHTPROD[0].SPECULAR : : -1 : 0 #var float4 glstate.lightprod[0].front.ambient : STATE.LIGHTPROD[0].FRONT.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[0].front.diffuse : STATE.LIGHTPROD[0].FRONT.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[0].front.specular : STATE.LIGHTPROD[0].FRONT.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[0].back.ambient : STATE.LIGHTPROD[0].BACK.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[0].back.diffuse : STATE.LIGHTPROD[0].BACK.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[0].back.specular : STATE.LIGHTPROD[0].BACK.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[1].ambient : STATE.LIGHTPROD[1].AMBIENT : : -1 : 0 #var float4 glstate.lightprod[1].diffuse : STATE.LIGHTPROD[1].DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[1].specular : STATE.LIGHTPROD[1].SPECULAR : : -1 : 0 #var float4 glstate.lightprod[1].front.ambient : STATE.LIGHTPROD[1].FRONT.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[1].front.diffuse : STATE.LIGHTPROD[1].FRONT.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[1].front.specular : STATE.LIGHTPROD[1].FRONT.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[1].back.ambient : STATE.LIGHTPROD[1].BACK.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[1].back.diffuse : STATE.LIGHTPROD[1].BACK.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[1].back.specular : STATE.LIGHTPROD[1].BACK.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[2].ambient : STATE.LIGHTPROD[2].AMBIENT : : -1 : 0 #var float4 glstate.lightprod[2].diffuse : STATE.LIGHTPROD[2].DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[2].specular : STATE.LIGHTPROD[2].SPECULAR : : -1 : 0 #var float4 glstate.lightprod[2].front.ambient : STATE.LIGHTPROD[2].FRONT.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[2].front.diffuse : STATE.LIGHTPROD[2].FRONT.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[2].front.specular : STATE.LIGHTPROD[2].FRONT.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[2].back.ambient : STATE.LIGHTPROD[2].BACK.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[2].back.diffuse : STATE.LIGHTPROD[2].BACK.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[2].back.specular : STATE.LIGHTPROD[2].BACK.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[3].ambient : STATE.LIGHTPROD[3].AMBIENT : : -1 : 0 #var float4 glstate.lightprod[3].diffuse : STATE.LIGHTPROD[3].DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[3].specular : STATE.LIGHTPROD[3].SPECULAR : : -1 : 0 #var float4 glstate.lightprod[3].front.ambient : STATE.LIGHTPROD[3].FRONT.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[3].front.diffuse : STATE.LIGHTPROD[3].FRONT.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[3].front.specular : STATE.LIGHTPROD[3].FRONT.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[3].back.ambient : STATE.LIGHTPROD[3].BACK.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[3].back.diffuse : STATE.LIGHTPROD[3].BACK.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[3].back.specular : STATE.LIGHTPROD[3].BACK.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[4].ambient : STATE.LIGHTPROD[4].AMBIENT : : -1 : 0 #var float4 glstate.lightprod[4].diffuse : STATE.LIGHTPROD[4].DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[4].specular : STATE.LIGHTPROD[4].SPECULAR : : -1 : 0 #var float4 glstate.lightprod[4].front.ambient : STATE.LIGHTPROD[4].FRONT.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[4].front.diffuse : STATE.LIGHTPROD[4].FRONT.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[4].front.specular : STATE.LIGHTPROD[4].FRONT.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[4].back.ambient : STATE.LIGHTPROD[4].BACK.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[4].back.diffuse : STATE.LIGHTPROD[4].BACK.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[4].back.specular : STATE.LIGHTPROD[4].BACK.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[5].ambient : STATE.LIGHTPROD[5].AMBIENT : : -1 : 0 #var float4 glstate.lightprod[5].diffuse : STATE.LIGHTPROD[5].DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[5].specular : STATE.LIGHTPROD[5].SPECULAR : : -1 : 0 #var float4 glstate.lightprod[5].front.ambient : STATE.LIGHTPROD[5].FRONT.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[5].front.diffuse : STATE.LIGHTPROD[5].FRONT.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[5].front.specular : STATE.LIGHTPROD[5].FRONT.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[5].back.ambient : STATE.LIGHTPROD[5].BACK.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[5].back.diffuse : STATE.LIGHTPROD[5].BACK.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[5].back.specular : STATE.LIGHTPROD[5].BACK.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[6].ambient : STATE.LIGHTPROD[6].AMBIENT : : -1 : 0 #var float4 glstate.lightprod[6].diffuse : STATE.LIGHTPROD[6].DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[6].specular : STATE.LIGHTPROD[6].SPECULAR : : -1 : 0 #var float4 glstate.lightprod[6].front.ambient : STATE.LIGHTPROD[6].FRONT.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[6].front.diffuse : STATE.LIGHTPROD[6].FRONT.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[6].front.specular : STATE.LIGHTPROD[6].FRONT.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[6].back.ambient : STATE.LIGHTPROD[6].BACK.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[6].back.diffuse : STATE.LIGHTPROD[6].BACK.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[6].back.specular : STATE.LIGHTPROD[6].BACK.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[7].ambient : STATE.LIGHTPROD[7].AMBIENT : : -1 : 0 #var float4 glstate.lightprod[7].diffuse : STATE.LIGHTPROD[7].DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[7].specular : STATE.LIGHTPROD[7].SPECULAR : : -1 : 0 #var float4 glstate.lightprod[7].front.ambient : STATE.LIGHTPROD[7].FRONT.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[7].front.diffuse : STATE.LIGHTPROD[7].FRONT.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[7].front.specular : STATE.LIGHTPROD[7].FRONT.SPECULAR : : -1 : 0 #var float4 glstate.lightprod[7].back.ambient : STATE.LIGHTPROD[7].BACK.AMBIENT : : -1 : 0 #var float4 glstate.lightprod[7].back.diffuse : STATE.LIGHTPROD[7].BACK.DIFFUSE : : -1 : 0 #var float4 glstate.lightprod[7].back.specular : STATE.LIGHTPROD[7].BACK.SPECULAR : : -1 : 0 #var float4 glstate.texgen[0].eye.s : STATE.TEXGEN[0].EYE.S : : -1 : 0 #var float4 glstate.texgen[0].eye.t : STATE.TEXGEN[0].EYE.T : : -1 : 0 #var float4 glstate.texgen[0].eye.r : STATE.TEXGEN[0].EYE.R : : -1 : 0 #var float4 glstate.texgen[0].eye.q : STATE.TEXGEN[0].EYE.Q : : -1 : 0 #var float4 glstate.texgen[0].object.s : STATE.TEXGEN[0].OBJECT.S : : -1 : 0 #var float4 glstate.texgen[0].object.t : STATE.TEXGEN[0].OBJECT.T : : -1 : 0 #var float4 glstate.texgen[0].object.r : STATE.TEXGEN[0].OBJECT.R : : -1 : 0 #var float4 glstate.texgen[0].object.q : STATE.TEXGEN[0].OBJECT.Q : : -1 : 0 #var float4 glstate.texgen[1].eye.s : STATE.TEXGEN[1].EYE.S : : -1 : 0 #var float4 glstate.texgen[1].eye.t : STATE.TEXGEN[1].EYE.T : : -1 : 0 #var float4 glstate.texgen[1].eye.r : STATE.TEXGEN[1].EYE.R : : -1 : 0 #var float4 glstate.texgen[1].eye.q : STATE.TEXGEN[1].EYE.Q : : -1 : 0 #var float4 glstate.texgen[1].object.s : STATE.TEXGEN[1].OBJECT.S : : -1 : 0 #var float4 glstate.texgen[1].object.t : STATE.TEXGEN[1].OBJECT.T : : -1 : 0 #var float4 glstate.texgen[1].object.r : STATE.TEXGEN[1].OBJECT.R : : -1 : 0 #var float4 glstate.texgen[1].object.q : STATE.TEXGEN[1].OBJECT.Q : : -1 : 0 #var float4 glstate.texgen[2].eye.s : STATE.TEXGEN[2].EYE.S : : -1 : 0 #var float4 glstate.texgen[2].eye.t : STATE.TEXGEN[2].EYE.T : : -1 : 0 #var float4 glstate.texgen[2].eye.r : STATE.TEXGEN[2].EYE.R : : -1 : 0 #var float4 glstate.texgen[2].eye.q : STATE.TEXGEN[2].EYE.Q : : -1 : 0 #var float4 glstate.texgen[2].object.s : STATE.TEXGEN[2].OBJECT.S : : -1 : 0 #var float4 glstate.texgen[2].object.t : STATE.TEXGEN[2].OBJECT.T : : -1 : 0 #var float4 glstate.texgen[2].object.r : STATE.TEXGEN[2].OBJECT.R : : -1 : 0 #var float4 glstate.texgen[2].object.q : STATE.TEXGEN[2].OBJECT.Q : : -1 : 0 #var float4 glstate.texgen[3].eye.s : STATE.TEXGEN[3].EYE.S : : -1 : 0 #var float4 glstate.texgen[3].eye.t : STATE.TEXGEN[3].EYE.T : : -1 : 0 #var float4 glstate.texgen[3].eye.r : STATE.TEXGEN[3].EYE.R : : -1 : 0 #var float4 glstate.texgen[3].eye.q : STATE.TEXGEN[3].EYE.Q : : -1 : 0 #var float4 glstate.texgen[3].object.s : STATE.TEXGEN[3].OBJECT.S : : -1 : 0 #var float4 glstate.texgen[3].object.t : STATE.TEXGEN[3].OBJECT.T : : -1 : 0 #var float4 glstate.texgen[3].object.r : STATE.TEXGEN[3].OBJECT.R : : -1 : 0 #var float4 glstate.texgen[3].object.q : STATE.TEXGEN[3].OBJECT.Q : : -1 : 0 #var float4 glstate.texgen[4].eye.s : STATE.TEXGEN[4].EYE.S : : -1 : 0 #var float4 glstate.texgen[4].eye.t : STATE.TEXGEN[4].EYE.T : : -1 : 0 #var float4 glstate.texgen[4].eye.r : STATE.TEXGEN[4].EYE.R : : -1 : 0 #var float4 glstate.texgen[4].eye.q : STATE.TEXGEN[4].EYE.Q : : -1 : 0 #var float4 glstate.texgen[4].object.s : STATE.TEXGEN[4].OBJECT.S : : -1 : 0 #var float4 glstate.texgen[4].object.t : STATE.TEXGEN[4].OBJECT.T : : -1 : 0 #var float4 glstate.texgen[4].object.r : STATE.TEXGEN[4].OBJECT.R : : -1 : 0 #var float4 glstate.texgen[4].object.q : STATE.TEXGEN[4].OBJECT.Q : : -1 : 0 #var float4 glstate.texgen[5].eye.s : STATE.TEXGEN[5].EYE.S : : -1 : 0 #var float4 glstate.texgen[5].eye.t : STATE.TEXGEN[5].EYE.T : : -1 : 0 #var float4 glstate.texgen[5].eye.r : STATE.TEXGEN[5].EYE.R : : -1 : 0 #var float4 glstate.texgen[5].eye.q : STATE.TEXGEN[5].EYE.Q : : -1 : 0 #var float4 glstate.texgen[5].object.s : STATE.TEXGEN[5].OBJECT.S : : -1 : 0 #var float4 glstate.texgen[5].object.t : STATE.TEXGEN[5].OBJECT.T : : -1 : 0 #var float4 glstate.texgen[5].object.r : STATE.TEXGEN[5].OBJECT.R : : -1 : 0 #var float4 glstate.texgen[5].object.q : STATE.TEXGEN[5].OBJECT.Q : : -1 : 0 #var float4 glstate.texgen[6].eye.s : STATE.TEXGEN[6].EYE.S : : -1 : 0 #var float4 glstate.texgen[6].eye.t : STATE.TEXGEN[6].EYE.T : : -1 : 0 #var float4 glstate.texgen[6].eye.r : STATE.TEXGEN[6].EYE.R : : -1 : 0 #var float4 glstate.texgen[6].eye.q : STATE.TEXGEN[6].EYE.Q : : -1 : 0 #var float4 glstate.texgen[6].object.s : STATE.TEXGEN[6].OBJECT.S : : -1 : 0 #var float4 glstate.texgen[6].object.t : STATE.TEXGEN[6].OBJECT.T : : -1 : 0 #var float4 glstate.texgen[6].object.r : STATE.TEXGEN[6].OBJECT.R : : -1 : 0 #var float4 glstate.texgen[6].object.q : STATE.TEXGEN[6].OBJECT.Q : : -1 : 0 #var float4 glstate.texgen[7].eye.s : STATE.TEXGEN[7].EYE.S : : -1 : 0 #var float4 glstate.texgen[7].eye.t : STATE.TEXGEN[7].EYE.T : : -1 : 0 #var float4 glstate.texgen[7].eye.r : STATE.TEXGEN[7].EYE.R : : -1 : 0 #var float4 glstate.texgen[7].eye.q : STATE.TEXGEN[7].EYE.Q : : -1 : 0 #var float4 glstate.texgen[7].object.s : STATE.TEXGEN[7].OBJECT.S : : -1 : 0 #var float4 glstate.texgen[7].object.t : STATE.TEXGEN[7].OBJECT.T : : -1 : 0 #var float4 glstate.texgen[7].object.r : STATE.TEXGEN[7].OBJECT.R : : -1 : 0 #var float4 glstate.texgen[7].object.q : STATE.TEXGEN[7].OBJECT.Q : : -1 : 0 #var float4 glstate.fog.color : STATE.FOG.COLOR : : -1 : 0 #var float4 glstate.fog.params : STATE.FOG.PARAMS : : -1 : 0 #var float4 glstate.clip[0].plane : STATE.CLIP[0].PLANE : : -1 : 0 #var float4 glstate.clip[1].plane : STATE.CLIP[1].PLANE : : -1 : 0 #var float4 glstate.clip[2].plane : STATE.CLIP[2].PLANE : : -1 : 0 #var float4 glstate.clip[3].plane : STATE.CLIP[3].PLANE : : -1 : 0 #var float4 glstate.clip[4].plane : STATE.CLIP[4].PLANE : : -1 : 0 #var float4 glstate.clip[5].plane : STATE.CLIP[5].PLANE : : -1 : 0 #var float4 glstate.clip[6].plane : STATE.CLIP[6].PLANE : : -1 : 0 #var float4 glstate.clip[7].plane : STATE.CLIP[7].PLANE : : -1 : 0 #var float glstate.point.size : STATE.POINT.SIZE : : -1 : 0 #var float glstate.point.attenuation : STATE.POINT.ATTENUATION : : -1 : 0 #var float4x4 glstate.matrix.modelview[0] : STATE.MATRIX.MODELVIEW[0] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[1] : STATE.MATRIX.MODELVIEW[1] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[2] : STATE.MATRIX.MODELVIEW[2] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[3] : STATE.MATRIX.MODELVIEW[3] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[4] : STATE.MATRIX.MODELVIEW[4] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[5] : STATE.MATRIX.MODELVIEW[5] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[6] : STATE.MATRIX.MODELVIEW[6] : , 4 : -1 : 0 #var float4x4 glstate.matrix.modelview[7] : STATE.MATRIX.MODELVIEW[7] : , 4 : -1 : 0 #var float4x4 glstate.matrix.projection : STATE.MATRIX.PROJECTION : , 4 : -1 : 0 #var float4x4 glstate.matrix.mvp : STATE.MATRIX.MVP : c[0], 4 : -1 : 1 #var float4x4 glstate.matrix.texture[0] : STATE.MATRIX.TEXTURE[0] : c[4], 4 : -1 : 1 #var float4x4 glstate.matrix.texture[1] : STATE.MATRIX.TEXTURE[1] : , 4 : -1 : 0 #var float4x4 glstate.matrix.texture[2] : STATE.MATRIX.TEXTURE[2] : , 4 : -1 : 0 #var float4x4 glstate.matrix.texture[3] : STATE.MATRIX.TEXTURE[3] : , 4 : -1 : 0 #var float4x4 glstate.matrix.texture[4] : STATE.MATRIX.TEXTURE[4] : , 4 : -1 : 0 #var float4x4 glstate.matrix.texture[5] : STATE.MATRIX.TEXTURE[5] : , 4 : -1 : 0 #var float4x4 glstate.matrix.texture[6] : STATE.MATRIX.TEXTURE[6] : , 4 : -1 : 0 #var float4x4 glstate.matrix.texture[7] : STATE.MATRIX.TEXTURE[7] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[0] : STATE.MATRIX.PALETTE[0] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[1] : STATE.MATRIX.PALETTE[1] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[2] : STATE.MATRIX.PALETTE[2] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[3] : STATE.MATRIX.PALETTE[3] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[4] : STATE.MATRIX.PALETTE[4] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[5] : STATE.MATRIX.PALETTE[5] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[6] : STATE.MATRIX.PALETTE[6] : , 4 : -1 : 0 #var float4x4 glstate.matrix.palette[7] : STATE.MATRIX.PALETTE[7] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[0] : STATE.MATRIX.PROGRAM[0] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[1] : STATE.MATRIX.PROGRAM[1] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[2] : STATE.MATRIX.PROGRAM[2] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[3] : STATE.MATRIX.PROGRAM[3] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[4] : STATE.MATRIX.PROGRAM[4] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[5] : STATE.MATRIX.PROGRAM[5] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[6] : STATE.MATRIX.PROGRAM[6] : , 4 : -1 : 0 #var float4x4 glstate.matrix.program[7] : STATE.MATRIX.PROGRAM[7] : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[0] : STATE.MATRIX.MODELVIEW[0].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[1] : STATE.MATRIX.MODELVIEW[1].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[2] : STATE.MATRIX.MODELVIEW[2].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[3] : STATE.MATRIX.MODELVIEW[3].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[4] : STATE.MATRIX.MODELVIEW[4].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[5] : STATE.MATRIX.MODELVIEW[5].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[6] : STATE.MATRIX.MODELVIEW[6].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.modelview[7] : STATE.MATRIX.MODELVIEW[7].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.projection : STATE.MATRIX.PROJECTION.INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.mvp : STATE.MATRIX.MVP.INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[0] : STATE.MATRIX.TEXTURE[0].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[1] : STATE.MATRIX.TEXTURE[1].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[2] : STATE.MATRIX.TEXTURE[2].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[3] : STATE.MATRIX.TEXTURE[3].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[4] : STATE.MATRIX.TEXTURE[4].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[5] : STATE.MATRIX.TEXTURE[5].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[6] : STATE.MATRIX.TEXTURE[6].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.texture[7] : STATE.MATRIX.TEXTURE[7].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[0] : STATE.MATRIX.PALETTE[0].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[1] : STATE.MATRIX.PALETTE[1].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[2] : STATE.MATRIX.PALETTE[2].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[3] : STATE.MATRIX.PALETTE[3].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[4] : STATE.MATRIX.PALETTE[4].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[5] : STATE.MATRIX.PALETTE[5].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[6] : STATE.MATRIX.PALETTE[6].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.palette[7] : STATE.MATRIX.PALETTE[7].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[0] : STATE.MATRIX.PROGRAM[0].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[1] : STATE.MATRIX.PROGRAM[1].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[2] : STATE.MATRIX.PROGRAM[2].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[3] : STATE.MATRIX.PROGRAM[3].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[4] : STATE.MATRIX.PROGRAM[4].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[5] : STATE.MATRIX.PROGRAM[5].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[6] : STATE.MATRIX.PROGRAM[6].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.inverse.program[7] : STATE.MATRIX.PROGRAM[7].INVERSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[0] : STATE.MATRIX.MODELVIEW[0].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[1] : STATE.MATRIX.MODELVIEW[1].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[2] : STATE.MATRIX.MODELVIEW[2].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[3] : STATE.MATRIX.MODELVIEW[3].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[4] : STATE.MATRIX.MODELVIEW[4].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[5] : STATE.MATRIX.MODELVIEW[5].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[6] : STATE.MATRIX.MODELVIEW[6].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.modelview[7] : STATE.MATRIX.MODELVIEW[7].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.projection : STATE.MATRIX.PROJECTION.TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.mvp : STATE.MATRIX.MVP.TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[0] : STATE.MATRIX.TEXTURE[0].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[1] : STATE.MATRIX.TEXTURE[1].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[2] : STATE.MATRIX.TEXTURE[2].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[3] : STATE.MATRIX.TEXTURE[3].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[4] : STATE.MATRIX.TEXTURE[4].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[5] : STATE.MATRIX.TEXTURE[5].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[6] : STATE.MATRIX.TEXTURE[6].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.texture[7] : STATE.MATRIX.TEXTURE[7].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[0] : STATE.MATRIX.PALETTE[0].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[1] : STATE.MATRIX.PALETTE[1].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[2] : STATE.MATRIX.PALETTE[2].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[3] : STATE.MATRIX.PALETTE[3].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[4] : STATE.MATRIX.PALETTE[4].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[5] : STATE.MATRIX.PALETTE[5].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[6] : STATE.MATRIX.PALETTE[6].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.palette[7] : STATE.MATRIX.PALETTE[7].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[0] : STATE.MATRIX.PROGRAM[0].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[1] : STATE.MATRIX.PROGRAM[1].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[2] : STATE.MATRIX.PROGRAM[2].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[3] : STATE.MATRIX.PROGRAM[3].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[4] : STATE.MATRIX.PROGRAM[4].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[5] : STATE.MATRIX.PROGRAM[5].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[6] : STATE.MATRIX.PROGRAM[6].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.transpose.program[7] : STATE.MATRIX.PROGRAM[7].TRANSPOSE : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[0] : STATE.MATRIX.MODELVIEW[0].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[1] : STATE.MATRIX.MODELVIEW[1].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[2] : STATE.MATRIX.MODELVIEW[2].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[3] : STATE.MATRIX.MODELVIEW[3].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[4] : STATE.MATRIX.MODELVIEW[4].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[5] : STATE.MATRIX.MODELVIEW[5].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[6] : STATE.MATRIX.MODELVIEW[6].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.modelview[7] : STATE.MATRIX.MODELVIEW[7].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.projection : STATE.MATRIX.PROJECTION.INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.mvp : STATE.MATRIX.MVP.INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[0] : STATE.MATRIX.TEXTURE[0].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[1] : STATE.MATRIX.TEXTURE[1].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[2] : STATE.MATRIX.TEXTURE[2].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[3] : STATE.MATRIX.TEXTURE[3].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[4] : STATE.MATRIX.TEXTURE[4].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[5] : STATE.MATRIX.TEXTURE[5].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[6] : STATE.MATRIX.TEXTURE[6].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.texture[7] : STATE.MATRIX.TEXTURE[7].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[0] : STATE.MATRIX.PALETTE[0].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[1] : STATE.MATRIX.PALETTE[1].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[2] : STATE.MATRIX.PALETTE[2].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[3] : STATE.MATRIX.PALETTE[3].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[4] : STATE.MATRIX.PALETTE[4].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[5] : STATE.MATRIX.PALETTE[5].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[6] : STATE.MATRIX.PALETTE[6].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.palette[7] : STATE.MATRIX.PALETTE[7].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[0] : STATE.MATRIX.PROGRAM[0].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[1] : STATE.MATRIX.PROGRAM[1].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[2] : STATE.MATRIX.PROGRAM[2].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[3] : STATE.MATRIX.PROGRAM[3].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[4] : STATE.MATRIX.PROGRAM[4].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[5] : STATE.MATRIX.PROGRAM[5].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[6] : STATE.MATRIX.PROGRAM[6].INVTRANS : , 4 : -1 : 0 #var float4x4 glstate.matrix.invtrans.program[7] : STATE.MATRIX.PROGRAM[7].INVTRANS : , 4 : -1 : 0 #var float4 IN.position : $vin.ATTR0 : ATTR0 : 0 : 1 #var float4 IN.texcoord0 : $vin.ATTR8 : ATTR8 : 0 : 1 #var float4 main.position : $vout.HPOS : HPOS : -1 : 1 #var float4 main.tex0 : $vout.TEX0 : TEX0 : -1 : 1 PARAM c[8] = { state.matrix.mvp, state.matrix.texture[0] }; DP4 result.position.w, vertex.attrib[0], c[3]; DP4 result.position.z, vertex.attrib[0], c[2]; DP4 result.position.y, vertex.attrib[0], c[1]; DP4 result.position.x, vertex.attrib[0], c[0]; DP4 result.texcoord[0].w, vertex.attrib[8], c[7]; DP4 result.texcoord[0].z, vertex.attrib[8], c[6]; DP4 result.texcoord[0].y, vertex.attrib[8], c[5]; DP4 result.texcoord[0].x, vertex.attrib[8], c[4]; END # 8 instructions, 0 R-regs DarkRadiant-2.0.2/install/gl/zfill_vp.glsl000066400000000000000000000023601245424655700204760ustar00rootroot00000000000000/// ============================================================================ /* Copyright (C) 2004 Robert Beckebans Please see the file "CONTRIBUTORS" for a list of contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /// ============================================================================ attribute vec4 attr_TexCoord0; void main() { // transform vertex position into homogenous clip-space gl_Position = ftransform(); // transform texcoords gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; // assign color gl_FrontColor = gl_Color; } DarkRadiant-2.0.2/install/i18n/000077500000000000000000000000001245424655700161425ustar00rootroot00000000000000DarkRadiant-2.0.2/install/i18n/LINGUAS000066400000000000000000000000031245424655700171600ustar00rootroot00000000000000de DarkRadiant-2.0.2/install/i18n/Makefile.in.in000066400000000000000000000400051245424655700206130ustar00rootroot00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.18 GETTEXT_MACRO_VERSION = 0.18 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: check-macro-version all-@USE_NLS@ all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. check-macro-version: @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ cat < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ cat < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot gather-po-files @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) \ && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \ esac; \ }; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done # Custom target added to gather the .po files in the top-level directory and # with the correct names. The Win32 gettext implementation keeps them next to # the .mo files. gather-po-files: for dir in *; do \ if test -d $${dir}; then \ cp $${dir}/LC_MESSAGES/darkradiant.po $${dir}.po; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ esac; \ }; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile gather-po-files $(GMOFILES) @: # Recreate Makefile by invoking config.status. Explicitly invoke the shell, # because execution permission bits may not work on the current file system. # Use @SHELL@, which is the shell determined by autoconf for the use by its # scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient. Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && @SHELL@ ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/install/i18n/Makevars000066400000000000000000000034721245424655700176440ustar00rootroot00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = install/i18n top_builddir = ../.. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --qt # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = The Dark Mod Team and contributors # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = http://thedarkmod.com # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = DarkRadiant-2.0.2/install/i18n/POTFILES.in000066400000000000000000000171021245424655700177200ustar00rootroot00000000000000radiant/textool/TexTool.cpp radiant/settings/GameManager.cpp radiant/settings/LanguageManager.cpp radiant/modulesystem/ModuleRegistry.cpp radiant/brushmanip.cpp radiant/patchmanip.cpp radiant/selection/shaderclipboard/ShaderClipboard.cpp radiant/selection/algorithm/Shader.cpp radiant/selection/algorithm/Curves.cpp radiant/selection/algorithm/Entity.cpp radiant/selection/algorithm/Group.cpp radiant/selection/algorithm/Primitives.cpp radiant/selection/algorithm/Transformation.cpp radiant/selection/selectionset/SelectionSetToolmenu.cpp radiant/clipper/Clipper.cpp radiant/entity.cpp radiant/mainframe_old.cpp radiant/layers/LayerSystem.cpp radiant/map/FindMapElements.cpp radiant/map/MapResource.cpp radiant/map/CounterManager.cpp radiant/map/RegionManager.cpp radiant/map/PointFile.cpp radiant/map/AutoSaver.cpp radiant/map/MapFileChooserPreview.cpp radiant/map/Map.cpp radiant/camera/CameraSettings.cpp radiant/camera/FloatingCamWnd.cpp radiant/xyview/GlobalXYWnd.cpp radiant/xyview/XYWnd.cpp radiant/referencecache/ModelCache.cpp radiant/ui/about/AboutDialog.cpp radiant/ui/overlay/OverlayDialog.cpp radiant/ui/mru/MRU.cpp radiant/ui/ortho/OrthoContextMenu.cpp radiant/ui/common/ShaderChooser.cpp radiant/ui/common/EntityChooser.cpp radiant/ui/common/SoundShaderPreview.cpp radiant/ui/common/TexturePreviewCombo.cpp radiant/ui/common/SoundChooser.cpp radiant/ui/common/CommandEntry.cpp radiant/ui/common/ShaderSelector.cpp radiant/ui/common/ShaderDefinitionView.cpp radiant/ui/commandlist/ShortcutChooser.cpp radiant/ui/commandlist/CommandList.cpp radiant/ui/einspector/SoundPropertyEditor.cpp radiant/ui/einspector/ClassnamePropertyEditor.cpp radiant/ui/einspector/AddPropertyDialog.cpp radiant/ui/einspector/ModelPropertyEditor.cpp radiant/ui/einspector/SkinChooser.cpp radiant/ui/einspector/TexturePropertyEditor.cpp radiant/ui/einspector/EntityPropertyEditor.cpp radiant/ui/einspector/Vector3PropertyEditor.cpp radiant/ui/einspector/EntityInspector.cpp radiant/ui/einspector/SkinPropertyEditor.cpp radiant/ui/einspector/LightTextureChooser.cpp radiant/ui/mapinfo/ShaderInfoTab.cpp radiant/ui/mapinfo/MapInfoDialog.cpp radiant/ui/mapinfo/EntityInfoTab.cpp radiant/ui/mapinfo/ModelInfoTab.cpp radiant/ui/mainframe/EmbeddedLayout.cpp radiant/ui/mainframe/SplitPaneLayout.cpp radiant/ui/mainframe/LayoutCommand.h radiant/ui/mainframe/FloatingLayout.cpp radiant/ui/mainframe/MainFrame.cpp radiant/ui/entitychooser/EntityClassChooser.cpp radiant/ui/menu/FiltersMenu.cpp radiant/ui/prefdialog/PrefDialog.cpp radiant/ui/lightinspector/LightInspector.cpp radiant/ui/findshader/FindShader.cpp radiant/ui/particles/ParticlesChooser.cpp radiant/ui/layers/LayerControl.cpp radiant/ui/layers/LayerControlDialog.cpp radiant/ui/mediabrowser/MediaBrowser.cpp radiant/ui/mediabrowser/TextureDirectoryLoader.h radiant/ui/texturebrowser/TextureBrowser.cpp radiant/ui/surfaceinspector/SurfaceInspector.cpp radiant/ui/modelselector/ModelSelector.cpp radiant/ui/modelselector/ModelFileFunctor.h radiant/ui/brush/QuerySidesDialog.cpp radiant/ui/transform/TransformDialog.cpp radiant/ui/patch/PatchThickenDialog.cpp radiant/ui/patch/BulgePatchDialog.cpp radiant/ui/patch/PatchInspector.cpp radiant/ui/patch/PatchCreateDialog.cpp radiant/ui/patch/CapDialog.cpp radiant/ui/filterdialog/FilterEditor.cpp radiant/ui/filterdialog/FilterDialog.cpp radiant/main.cpp radiant/brush/BrushModule.cpp radiant/brush/csg/CSG.cpp radiant/patch/PatchCreators.h radiant/patch/Patch.cpp include/i18n.h libs/gtkutil/ModalProgressDialog.cpp libs/gtkutil/IConv.h libs/gtkutil/FileChooser.cpp libs/gtkutil/dialog/MessageBox.cpp libs/gtkutil/ConsoleView.cpp libs/gtkutil/PathEntry.cpp libs/pivot.h libs/radiant_jpeglib.h libs/picomodel/pm_lwo.c libs/picomodel/lwo/lwo2.h libs/picomodel/lwo/lwob.c plugins/eclasstree/plugin.cpp plugins/eclasstree/EClassTree.cpp plugins/entity/EntityCreator.cpp plugins/dm.conversation/plugin.cpp plugins/dm.conversation/ConversationEntityFinder.h plugins/dm.conversation/CommandEditor.cpp plugins/dm.conversation/ConversationDialog.cpp plugins/dm.conversation/ConversationEntity.cpp plugins/dm.conversation/ConversationKeyExtractor.cpp plugins/dm.conversation/ConversationEditor.cpp plugins/fonts/FontLoader.cpp plugins/eventmanager/MouseEvents.cpp plugins/eventmanager/Modifiers.cpp plugins/mapdoom3/NodeImporter.cpp plugins/mapdoom3/Doom3PrefabFormat.cpp plugins/mapdoom3/primitiveparsers/BrushDef.cpp plugins/mapdoom3/primitiveparsers/BrushDef3.cpp plugins/mapdoom3/InfoFile.cpp plugins/mapdoom3/Doom3MapFormat.cpp plugins/dm.gui/plugin.cpp plugins/dm.gui/XDataSelector.cpp plugins/dm.gui/ReadableReloader.h plugins/dm.gui/GuiSelector.cpp plugins/dm.gui/XData.h plugins/dm.gui/ReadablePopulator.h plugins/dm.gui/ReadableEditorDialog.cpp plugins/dm.gui/XData.cpp plugins/dm.gui/XdFileChooserDialog.cpp plugins/dm.stimresponse/ResponseEffect.cpp plugins/dm.stimresponse/EffectEditor.cpp plugins/dm.stimresponse/plugin.cpp plugins/dm.stimresponse/StimEditor.cpp plugins/dm.stimresponse/SRPropertyRemover.cpp plugins/dm.stimresponse/CustomStimEditor.cpp plugins/dm.stimresponse/StimResponseEditor.cpp plugins/dm.stimresponse/StimTypes.cpp plugins/dm.stimresponse/ResponseEditor.cpp plugins/dm.stimresponse/SRPropertyLoader.cpp plugins/dm.stimresponse/ClassEditor.cpp plugins/dm.difficulty/plugin.cpp plugins/dm.difficulty/DifficultyDialog.cpp plugins/dm.difficulty/Setting.cpp plugins/dm.difficulty/DifficultyEditor.cpp plugins/filetypes/FileTypeRegistry.cpp plugins/entitylist/EntityList.cpp plugins/dm.objectives/ObjectivesEditor.cpp plugins/dm.objectives/Specifier.cpp plugins/dm.objectives/ObjectiveEntityFinder.h plugins/dm.objectives/LogicEditor.cpp plugins/dm.objectives/ComponentType.cpp plugins/dm.objectives/ObjectiveKeyExtractor.cpp plugins/dm.objectives/objectives.cpp plugins/dm.objectives/MissionLogicDialog.cpp plugins/dm.objectives/SpecifierType.cpp plugins/dm.objectives/ce/LocationComponentEditor.cpp plugins/dm.objectives/ce/DistanceComponentEditor.cpp plugins/dm.objectives/ce/ItemComponentEditor.cpp plugins/dm.objectives/ce/InfoLocationComponentEditor.cpp plugins/dm.objectives/ce/AIFindItemComponentEditor.cpp plugins/dm.objectives/ce/ReadableOpenedComponentEditor.cpp plugins/dm.objectives/ce/CustomComponentEditor.cpp plugins/dm.objectives/ce/DestroyComponentEditor.cpp plugins/dm.objectives/ce/ReadableClosedComponentEditor.cpp plugins/dm.objectives/ce/ReadablePageReachedComponentEditor.cpp plugins/dm.objectives/ce/AlertComponentEditor.cpp plugins/dm.objectives/ce/PickpocketComponentEditor.cpp plugins/dm.objectives/ce/CustomClockedComponentEditor.cpp plugins/dm.objectives/ce/KillComponentEditor.cpp plugins/dm.objectives/ce/KnockoutComponentEditor.cpp plugins/dm.objectives/ce/AIFindBodyComponentEditor.cpp plugins/dm.objectives/ComponentsDialog.cpp plugins/dm.objectives/ObjectiveEntity.cpp plugins/dm.objectives/DifficultyPanel.cpp plugins/dm.editing/plugin.cpp plugins/dm.editing/AIVocalSetPropertyEditor.cpp plugins/dm.editing/AIHeadPropertyEditor.cpp plugins/dm.editing/AIHeadChooserDialog.cpp plugins/dm.editing/FixupMapDialog.cpp plugins/dm.editing/AIVocalSetPreview.cpp plugins/dm.editing/AIVocalSetChooserDialog.cpp plugins/dm.editing/FixupMap.cpp plugins/image/jpeg.cpp plugins/script/ScriptWindow.cpp plugins/script/ScriptMenu.cpp plugins/script/ScriptingSystem.cpp plugins/uimanager/colourscheme/ColourSchemeEditor.cpp plugins/uimanager/FilterMenu.cpp plugins/uimanager/ParticlePreview.cpp plugins/uimanager/ToolbarManager.cpp plugins/uimanager/GroupDialog.cpp plugins/uimanager/MenuItem.cpp plugins/undo/UndoSystem.cpp plugins/grid/Grid.cpp plugins/wavefront/WaveFrontModule.cpp install/ui/ObjectivesEditor.glade install/ui/EntityClassChooser.glade install/ui/CamWnd.glade install/ui/AddPropertyDialog.glade DarkRadiant-2.0.2/install/i18n/darkradiant.pot000066400000000000000000004102001245424655700211470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: greebo@angua.at\n" "POT-Creation-Date: 2014-12-31 06:19+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ..\..\radiant\brush\BrushModule.cpp:27 msgid "Settings/Primitives" msgstr "" #: ..\..\radiant\brush\BrushModule.cpp:31 msgid "Default texture scale" msgstr "" #: ..\..\radiant\brush\BrushModule.cpp:34 msgid "Enable Texture Lock (for Brushes)" msgstr "" #: ..\..\radiant\brush\csg\CSG.cpp:304 msgid "This Is Not Dromed Warning" msgstr "" #: ..\..\radiant\brush\csg\CSG.cpp:305 msgid "" "Note: be careful when using the CSG tool, as you might end up\n" "with an unnecessary number of tiny brushes and/or leaks.\n" "This popup will not be shown again." msgstr "" #: ..\..\radiant\brush\csg\CSG.cpp:317 ..\..\radiant\brush\csg\CSG.cpp:318 msgid "CSG Subtract: No brushes selected." msgstr "" #: ..\..\radiant\brush\csg\CSG.cpp:428 ..\..\radiant\brush\csg\CSG.cpp:429 msgid "CSG Merge: No brushes selected." msgstr "" #: ..\..\radiant\camera\CameraSettings.cpp:56 msgid "Settings/Camera" msgstr "" #: ..\..\radiant\camera\CameraSettings.cpp:59 msgid "Movement Speed (game units)" msgstr "" #: ..\..\radiant\camera\CameraSettings.cpp:60 msgid "Rotation Speed" msgstr "" #: ..\..\radiant\camera\CameraSettings.cpp:63 msgid "Freelook mode can be toggled" msgstr "" #: ..\..\radiant\camera\CameraSettings.cpp:64 msgid "Discrete movement (non-freelook mode)" msgstr "" #: ..\..\radiant\camera\CameraSettings.cpp:65 msgid "Enable far-clip plane (hides distant objects)" msgstr "" #: ..\..\radiant\camera\CameraSettings.cpp:68 msgid "Invert mouse vertical axis (freelook mode)" msgstr "" #: ..\..\radiant\camera\CameraSettings.cpp:71 msgid "Solid selection boxes" msgstr "" #: ..\..\radiant\camera\CameraSettings.cpp:75 msgid "Show camera toolbar" msgstr "" #: ..\..\radiant\camera\FloatingCamWnd.cpp:18 xml_file_content.cpp:60 msgid "Camera" msgstr "" #: ..\..\radiant\camera\tools\FreeMoveTool.h:23 msgid "Freemove Mode" msgstr "" #: ..\..\radiant\camera\tools\JumpToObjectTool.h:22 msgid "Jump to Object" msgstr "" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:96 msgid "Pick Shader" msgstr "" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:114 msgid "Paste Shader Projected" msgstr "" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:132 msgid "Paste Shader Natural" msgstr "" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:150 msgid "Paste Texture Coordinates" msgstr "" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:168 msgid "Paste Shader to all Brush Faces" msgstr "" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:186 msgid "Paste Shader Name" msgstr "" #: ..\..\radiant\clipper\Clipper.cpp:41 msgid "Settings/Clipper" msgstr "" #: ..\..\radiant\clipper\Clipper.cpp:43 msgid "Clipper tool uses caulk texture" msgstr "" #: ..\..\radiant\clipper\Clipper.cpp:44 msgid "Caulk shader name" msgstr "" #: ..\..\radiant\layers\LayerSystem.cpp:34 msgid "Default" msgstr "" #: ..\..\radiant\layers\LayerSystem.cpp:37 msgid "Create Layer..." msgstr "" #: ..\..\radiant\layers\LayerSystem.cpp:39 msgid "Add to Layer..." msgstr "" #: ..\..\radiant\layers\LayerSystem.cpp:40 msgid "Move to Layer..." msgstr "" #: ..\..\radiant\layers\LayerSystem.cpp:41 msgid "Remove from Layer..." msgstr "" #: ..\..\radiant\layers\LayerSystem.cpp:528 #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1537 msgid "Enter Name" msgstr "" #: ..\..\radiant\layers\LayerSystem.cpp:529 msgid "Enter Layer Name" msgstr "" #: ..\..\radiant\layers\LayerSystem.cpp:541 msgid "Cannot create layer with empty name." msgstr "" #: ..\..\radiant\layers\LayerSystem.cpp:555 msgid "This name already exists." msgstr "" #: ..\..\radiant\main.cpp:135 msgid "Disable sound for this session." msgstr "" #: ..\..\radiant\main.cpp:136 msgid "Verbose logging." msgstr "" #: ..\..\radiant\main.cpp:153 msgid "Searching for Modules" msgstr "" #: ..\..\radiant\map\algorithm\MapExporter.cpp:114 msgid "Writing map" msgstr "" #: ..\..\radiant\map\algorithm\MapExporter.cpp:222 #, c-format msgid "Writing node %d" msgstr "" #: ..\..\radiant\map\algorithm\MapImporter.cpp:41 msgid "Loading map" msgstr "" #: ..\..\radiant\map\algorithm\MapImporter.cpp:44 #: ..\..\radiant\map\algorithm\MapImporter.cpp:59 #, c-format msgid "Loading entity %d\n" msgstr "" #: ..\..\radiant\map\AutoSaver.cpp:299 msgid "Settings/Autosave" msgstr "" #: ..\..\radiant\map\AutoSaver.cpp:302 msgid "Enable Autosave" msgstr "" #: ..\..\radiant\map\AutoSaver.cpp:303 msgid "Autosave Interval (in minutes)" msgstr "" #: ..\..\radiant\map\AutoSaver.cpp:305 msgid "Save Snapshots" msgstr "" #: ..\..\radiant\map\AutoSaver.cpp:306 msgid "Snapshot folder (relative to map folder)" msgstr "" #: ..\..\radiant\map\AutoSaver.cpp:307 msgid "Max Snapshot Folder size (MB)" msgstr "" #: ..\..\radiant\map\CounterManager.cpp:67 #, c-format msgid "Brushes: %lu Patches: %lu Entities: %lu" msgstr "" #: ..\..\radiant\map\FindMapElements.cpp:95 msgid "Find Brush" msgstr "" #: ..\..\radiant\map\FindMapElements.cpp:97 msgid "Entity Number:" msgstr "" #: ..\..\radiant\map\FindMapElements.cpp:98 msgid "Brush Number:" msgstr "" #: ..\..\radiant\map\InfoFile.cpp:73 msgid "Map Info File Version invalid" msgstr "" #: ..\..\radiant\map\Map.cpp:59 msgid "unnamed.map" msgstr "" #: ..\..\radiant\map\Map.cpp:184 ..\..\radiant\map\Map.cpp:517 #: ..\..\radiant\map\Map.cpp:609 ..\..\radiant\map\Map.cpp:637 #: ..\..\radiant\RadiantModule.cpp:132 #: ..\..\radiant\referencecache\ModelCache.cpp:245 #: ..\..\radiant\referencecache\ModelCache.cpp:261 #: ..\..\plugins\shaders\Doom3ShaderSystem.cpp:301 msgid "Processing..." msgstr "" #: ..\..\radiant\map\Map.cpp:184 msgid "Loading textures..." msgstr "" #: ..\..\radiant\map\Map.cpp:517 msgid "Saving Map" msgstr "" #: ..\..\radiant\map\Map.cpp:568 msgid "Importing..." msgstr "" #: ..\..\radiant\map\Map.cpp:663 #, c-format msgid "" "Save changes to map \"%s\"\n" "before closing?" msgstr "" #: ..\..\radiant\map\Map.cpp:671 #, c-format msgid "%d minutes" msgstr "" #: ..\..\radiant\map\Map.cpp:675 #, c-format msgid "%d seconds" msgstr "" #: ..\..\radiant\map\Map.cpp:679 #, c-format msgid "" "If you don't save, changes from the last %s\n" "will be lost." msgstr "" #: ..\..\radiant\map\Map.cpp:737 msgid "Save Map" msgstr "" #: ..\..\radiant\map\Map.cpp:777 msgid "Save Copy As..." msgstr "" #: ..\..\radiant\map\Map.cpp:853 msgid "New Map" msgstr "" #: ..\..\radiant\map\Map.cpp:864 ..\..\radiant\ui\mru\MRU.cpp:93 msgid "Open Map" msgstr "" #: ..\..\radiant\map\Map.cpp:868 msgid "Open map" msgstr "" #: ..\..\radiant\map\Map.cpp:882 msgid "Import map" msgstr "" #: ..\..\radiant\map\Map.cpp:911 msgid "Export selection" msgstr "" #: ..\..\radiant\map\Map.cpp:926 msgid "Save selected as Prefab" msgstr "" #: ..\..\radiant\map\Map.cpp:1007 #, c-format msgid "" "Failure reading map from clipboard:\n" "%s" msgstr "" #: ..\..\radiant\map\MapFileManager.cpp:35 msgid "Map" msgstr "" #: ..\..\radiant\map\MapFileManager.cpp:36 xml_file_content.cpp:89 msgid "Region" msgstr "" #: ..\..\radiant\map\MapFileManager.cpp:37 #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:252 msgid "Prefab" msgstr "" #: ..\..\radiant\map\MapResource.cpp:274 ..\..\radiant\map\MapResource.cpp:637 #, c-format msgid "File is write-protected: %s" msgstr "" #: ..\..\radiant\map\MapResource.cpp:430 #, c-format msgid "" "Failure opening map file:\n" "%s" msgstr "" #: ..\..\radiant\map\MapResource.cpp:472 #, c-format msgid "" "Could not determine map format of file:\n" "%s" msgstr "" #: ..\..\radiant\map\MapResource.cpp:598 msgid "Map loading cancelled" msgstr "" #: ..\..\radiant\map\MapResource.cpp:610 #, c-format msgid "" "Failure reading map file:\n" "%s\n" "\n" "%s" msgstr "" #: ..\..\radiant\map\MapResource.cpp:702 msgid "Map writing cancelled" msgstr "" #: ..\..\radiant\map\MapResource.cpp:717 msgid "Could not open output streams for writing" msgstr "" #: ..\..\radiant\map\PointFile.cpp:116 #, c-format msgid "Could not open pointfile: %s" msgstr "" #: ..\..\radiant\map\RegionManager.cpp:203 msgid "Warning: Camera not within region, can't set info_player_start." msgstr "" #: ..\..\radiant\map\RegionManager.cpp:293 msgid "Could not set Region: XY Top View not found." msgstr "" #: ..\..\radiant\map\RegionManager.cpp:320 msgid "Could not set Region: please select a single Brush." msgstr "" #: ..\..\radiant\map\RegionManager.cpp:345 msgid "This command is not available in component mode." msgstr "" #: ..\..\radiant\map\RegionManager.cpp:351 msgid "Could not set Region: nothing selected." msgstr "" #: ..\..\radiant\map\RegionManager.cpp:368 msgid "Export region" msgstr "" #: ..\..\radiant\modulesystem\ModuleRegistry.cpp:117 #, c-format msgid "Initialising Module: %s" msgstr "" #: ..\..\radiant\modulesystem\ModuleRegistry.cpp:133 msgid "Initialising Modules" msgstr "" #: ..\..\radiant\patch\algorithm\General.cpp:110 msgid "" "Cannot stitch textures. \n" "Could not cast nodes to patches." msgstr "" #: ..\..\radiant\patch\algorithm\General.cpp:119 msgid "" "Cannot stitch patch textures. \n" "Exactly 2 patches must be selected." msgstr "" #: ..\..\radiant\patch\algorithm\General.cpp:157 msgid "Cannot bulge patch. No patches selected." msgstr "" #: ..\..\radiant\patch\algorithm\Prefab.cpp:244 msgid "Cannot create end-cap, patch must have a width of 5." msgstr "" #: ..\..\radiant\patch\algorithm\Prefab.cpp:251 msgid "Cannot create bevel-cap, patch must have a width of 3." msgstr "" #: ..\..\radiant\patch\algorithm\Prefab.cpp:260 msgid "Cannot create cylinder-cap, patch must have a width of 9." msgstr "" #: ..\..\radiant\patch\Patch.cpp:1706 msgid "Sorry. Patch is not suitable for this kind of operation." msgstr "" #: ..\..\radiant\patch\PatchCreators.cpp:62 msgid "Settings/Patch" msgstr "" #: ..\..\radiant\patch\PatchCreators.cpp:63 msgid "Patch Subdivide Threshold" msgstr "" #: ..\..\radiant\RadiantModule.cpp:233 #: ..\..\radiant\settings\GameManager.cpp:97 #: ..\..\radiant\settings\GameManager.cpp:323 #: ..\..\radiant\settings\GameManager.cpp:344 #: ..\..\radiant\ui\prefdialog\PrefDialog.cpp:198 msgid "Game" msgstr "" #: ..\..\radiant\RadiantModule.cpp:234 msgid "Settings" msgstr "" #: ..\..\radiant\referencecache\ModelCache.cpp:245 #: ..\..\radiant\referencecache\ModelCache.cpp:261 msgid "Reloading Models" msgstr "" #: ..\..\radiant\selection\algorithm\Curves.cpp:188 msgid "Can't append curve point - no entities with curve selected." msgstr "" #: ..\..\radiant\selection\algorithm\Curves.cpp:198 msgid "Can't remove curve points - must be in vertex editing mode." msgstr "" #: ..\..\radiant\selection\algorithm\Curves.cpp:218 msgid "Can't remove curve points - no entities with curves selected." msgstr "" #: ..\..\radiant\selection\algorithm\Curves.cpp:228 msgid "Can't insert curve points - must be in vertex editing mode." msgstr "" #: ..\..\radiant\selection\algorithm\Curves.cpp:248 msgid "Can't insert curve points - no entities with curves selected." msgstr "" #: ..\..\radiant\selection\algorithm\Curves.cpp:269 msgid "Can't convert curves - no entities with curves selected." msgstr "" #: ..\..\radiant\selection\algorithm\Entity.cpp:62 msgid "Cannot change classname of worldspawn entity." msgstr "" #: ..\..\radiant\selection\algorithm\Entity.cpp:104 msgid "Critical: Cannot find selected entities." msgstr "" #: ..\..\radiant\selection\algorithm\Entity.cpp:109 #: ..\..\radiant\selection\algorithm\Entity.cpp:125 msgid "Exactly two entities must be selected for this operation." msgstr "" #: ..\..\radiant\selection\algorithm\Entity.cpp:171 #, c-format msgid "Unable to create entity %s, no brushes selected." msgstr "" #: ..\..\radiant\selection\algorithm\Group.cpp:236 msgid "" "Cannot reparent primitives to entity. Please select at least one brush/patch " "and exactly one entity.(The entity has to be selected last.)" msgstr "" #: ..\..\radiant\selection\algorithm\Group.cpp:386 msgid "" "Cannot merge entities, the selection must consist of func_* entities only.\n" "(The first selected entity will be preserved.)" msgstr "" #: ..\..\radiant\selection\algorithm\Patch.cpp:60 msgid "Cannot create caps, no patches selected." msgstr "" #: ..\..\radiant\selection\algorithm\Patch.cpp:208 msgid "Cannot thicken patch. Nothing selected." msgstr "" #: ..\..\radiant\selection\algorithm\Primitives.cpp:83 #: ..\..\radiant\selection\algorithm\Primitives.cpp:87 msgid "No patches selected." msgstr "" #: ..\..\radiant\selection\algorithm\Primitives.cpp:249 msgid "Could not create patch." msgstr "" #: ..\..\radiant\selection\algorithm\Primitives.cpp:367 msgid "No faces selected." msgstr "" #: ..\..\radiant\selection\algorithm\Primitives.cpp:388 #, c-format msgid "%d faces were not suitable (had more than 4 vertices)." msgstr "" #: ..\..\radiant\selection\algorithm\Primitives.cpp:399 #: ..\..\radiant\selection\algorithm\Primitives.cpp:498 msgid "No brushes selected." msgstr "" #: ..\..\radiant\selection\algorithm\Primitives.cpp:598 msgid "At least one brush must be selected for this operation." msgstr "" #: ..\..\radiant\selection\algorithm\Shader.cpp:286 msgid "" "Can't paste shader to entire brush.\n" "Target is not a brush." msgstr "" #: ..\..\radiant\selection\algorithm\Shader.cpp:321 msgid "" "Can't paste Texture Coordinates.\n" "Target patch dimensions must match." msgstr "" #: ..\..\radiant\selection\algorithm\Shader.cpp:328 msgid "Can't paste Texture Coordinates from patches to faces." msgstr "" #: ..\..\radiant\selection\algorithm\Shader.cpp:333 msgid "Can't paste Texture Coordinates from faces." msgstr "" #: ..\..\radiant\selection\algorithm\Shader.cpp:389 msgid "Can't copy Shader. Couldn't retrieve patch." msgstr "" #: ..\..\radiant\selection\algorithm\Shader.cpp:399 msgid "Can't copy Shader. Couldn't retrieve face." msgstr "" #: ..\..\radiant\selection\algorithm\Shader.cpp:405 msgid "Can't copy Shader. Please select a single face or patch." msgstr "" #: ..\..\radiant\selection\algorithm\Transformation.cpp:55 msgid "Cannot scale by zero value." msgstr "" #: ..\..\radiant\selection\ManipulateMouseTool.cpp:28 msgid "Manipulate" msgstr "" #: ..\..\radiant\selection\SelectionMouseTools.cpp:53 msgid "Select" msgstr "" #: ..\..\radiant\selection\SelectionMouseTools.cpp:168 xml_file_content.cpp:4 msgid "Select Faces" msgstr "" #: ..\..\radiant\selection\SelectionMouseTools.cpp:187 msgid "Cycle Selection" msgstr "" #: ..\..\radiant\selection\SelectionMouseTools.cpp:233 msgid "Cycle Face Selection" msgstr "" #: ..\..\radiant\selection\selectionset\SelectionSetManager.cpp:84 msgid "Selection Set: " msgstr "" #: ..\..\radiant\selection\selectionset\SelectionSetManager.cpp:92 msgid "Clear Selection Sets" msgstr "" #: ..\..\radiant\selection\selectionset\SelectionSetManager.cpp:194 msgid "Delete all selection sets?" msgstr "" #: ..\..\radiant\selection\selectionset\SelectionSetManager.cpp:195 msgid "" "This will delete all set definitions. The actual map objects will not be " "affected by this step.\n" "\n" "Continue with that operation?" msgstr "" #: ..\..\radiant\selection\selectionset\SelectionSetToolmenu.cpp:18 msgid "" "Enter a name and hit ENTER to save a set.\n" "\n" "Select an item from the dropdown list to restore the selection.\n" "\n" "Hold SHIFT when opening the dropdown list and selecting the item to de-" "select the set." msgstr "" #: ..\..\radiant\selection\selectionset\SelectionSetToolmenu.cpp:62 msgid "Cannot create selection set" msgstr "" #: ..\..\radiant\selection\selectionset\SelectionSetToolmenu.cpp:63 msgid "" "Cannot create a selection set, there is nothing selected in the current " "scene." msgstr "" #: ..\..\radiant\selection\shaderclipboard\ShaderClipboard.cpp:87 #, c-format msgid "ShaderClipboard: %s" msgstr "" #: ..\..\radiant\selection\shaderclipboard\ShaderClipboard.cpp:90 msgid "Face" msgstr "" #: ..\..\radiant\selection\shaderclipboard\ShaderClipboard.cpp:93 msgid "Patch" msgstr "" #: ..\..\radiant\selection\shaderclipboard\ShaderClipboard.cpp:96 #: ..\..\radiant\ui\common\ShaderSelector.cpp:359 #: ..\..\radiant\ui\common\TexturePreviewCombo.cpp:73 #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:60 #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:359 xml_file_content.cpp:14 msgid "Shader" msgstr "" #: ..\..\radiant\selection\shaderclipboard\ShaderClipboard.cpp:100 msgid "ShaderClipboard is empty." msgstr "" #: ..\..\radiant\settings\GameManager.cpp:89 msgid "GameManager: No game type selected, can't continue." msgstr "" #: ..\..\radiant\settings\GameManager.cpp:104 msgid "Select a Game:" msgstr "" #: ..\..\radiant\settings\GameManager.cpp:105 msgid "Engine Path" msgstr "" #: ..\..\radiant\settings\GameManager.cpp:106 msgid "Mod (fs_game)" msgstr "" #: ..\..\radiant\settings\GameManager.cpp:107 msgid "Mod Base (fs_game_base, optional)" msgstr "" #: ..\..\radiant\settings\GameManager.cpp:119 msgid "GameManager: No valid game files found, can't continue." msgstr "" #: ..\..\radiant\settings\GameManager.cpp:149 msgid "No game type selected." msgstr "" #: ..\..\radiant\settings\GameManager.cpp:244 #, c-format msgid "Engine path \"%1%\" does not exist.\n" msgstr "" #: ..\..\radiant\settings\GameManager.cpp:249 #, c-format msgid "The fs_game folder \"%1%\" does not exist.\n" msgstr "" #: ..\..\radiant\settings\GameManager.cpp:255 #, c-format msgid "The fs_game_base folder \"%1%\" does not exist.\n" msgstr "" #: ..\..\radiant\settings\GameManager.cpp:259 msgid "Do you want to correct these settings?" msgstr "" #: ..\..\radiant\settings\GameManager.cpp:261 msgid "Invalid Settings" msgstr "" #: ..\..\radiant\settings\GameManager.cpp:345 msgid "" "Note: You will have to restart DarkRadiant\n" "for the changes to take effect." msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:103 msgid "Settings/Language" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:104 msgid "Language" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:106 msgid "" "Note: You'll need to restart DarkRadiant\n" "after changing the language setting." msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:217 #: ..\..\radiant\settings\LanguageManager.cpp:254 msgid "English" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:218 msgid "Abkhazian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:219 msgid "Avestan" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:220 msgid "Afrikaans" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:221 msgid "Akan" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:222 msgid "Amharic" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:223 msgid "Aragonese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:224 msgid "Arabic" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:225 msgid "Assamese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:226 msgid "Avaric" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:227 msgid "Aymara" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:228 msgid "Azerbaijani" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:229 msgid "Bashkir" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:230 msgid "Belarusian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:231 msgid "Bulgarian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:232 msgid "Bihari languages" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:233 msgid "Bislama" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:234 msgid "Bambara" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:235 msgid "Bengali" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:236 msgid "Tibetan" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:237 msgid "Breton" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:238 msgid "Bosnian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:239 msgid "Catalan" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:240 msgid "Chechen" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:241 msgid "Chamorro" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:242 msgid "Corsican" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:243 msgid "Cree" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:244 msgid "Czech" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:245 msgid "Chuvash" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:246 #: ..\..\radiant\settings\LanguageManager.cpp:247 msgid "Welsh" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:248 msgid "Danish" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:249 msgid "German" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:250 msgid "Divehi" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:251 msgid "Dzongkha" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:252 msgid "Ewe" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:253 msgid "Greek" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:255 msgid "Esperanto" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:256 msgid "Spanish" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:257 msgid "Estonian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:258 msgid "Basque" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:259 msgid "Persian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:260 msgid "Fulah" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:261 msgid "Finnish" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:262 msgid "Fijian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:263 msgid "Faroese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:264 msgid "French" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:265 msgid "Western Frisian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:266 msgid "Irish" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:267 msgid "Gaelic; Scottish Gaelic" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:268 msgid "Galician" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:269 msgid "Guarani" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:270 msgid "Gujarati" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:271 msgid "Manx" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:272 msgid "Hausa" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:273 msgid "Hebrew" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:274 msgid "Hindi" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:275 msgid "Hiri Motu" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:276 msgid "Croatian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:277 msgid "Haitian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:278 msgid "Hungarian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:279 msgid "Armenian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:280 msgid "Herero" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:281 msgid "Interlingua" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:282 msgid "Indonesian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:283 msgid "Interlingue; Occidental" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:284 msgid "Igbo" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:285 msgid "Sichuan Yi; Nuosu" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:286 msgid "Inupiaq" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:287 msgid "Ido" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:288 msgid "Icelandic" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:289 msgid "Italian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:290 msgid "Inuktitut" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:291 msgid "Japanese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:292 msgid "Javanese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:293 msgid "Georgian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:294 msgid "Kongo" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:295 msgid "Kikuyu" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:296 msgid "Kuanyama" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:297 msgid "Kazakh" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:298 msgid "Kalaallisut; Greenlandic" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:299 msgid "Central Khmer" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:300 msgid "Kannada" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:301 msgid "Korean" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:302 msgid "Kanuri" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:303 msgid "Kashmiri" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:304 msgid "Kurdish" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:305 msgid "Komi" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:306 msgid "Cornish" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:307 msgid "Kirghiz" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:308 msgid "Latin" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:309 msgid "Luxembourgish" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:310 msgid "Ganda" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:311 msgid "Limburgan" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:312 msgid "Lingala" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:313 msgid "Lao" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:314 msgid "Lithuanian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:315 msgid "Luba-Katanga" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:316 msgid "Latvian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:317 msgid "Malagasy" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:318 msgid "Marshallese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:319 msgid "Maori" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:320 msgid "Macedonian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:321 msgid "Malayalam" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:322 msgid "Mongolian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:323 msgid "Marathi" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:324 msgid "Malay" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:325 msgid "Maltese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:326 msgid "Burmese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:327 msgid "Nauru" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:328 msgid "Ndebele, North" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:329 msgid "Nepali" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:330 msgid "Ndonga" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:331 msgid "Dutch" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:332 msgid "Norwegian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:333 msgid "Ndebele, South" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:334 msgid "Navajo" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:335 msgid "Chichewa" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:336 msgid "Occitan" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:337 msgid "Ojibwa" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:338 msgid "Oromo" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:339 msgid "Oriya" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:340 msgid "Ossetian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:341 msgid "Panjabi" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:342 msgid "Pali" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:343 msgid "Polish" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:344 msgid "Pushto" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:345 msgid "Portuguese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:346 msgid "Quechua" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:347 msgid "Romansh" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:348 msgid "Rundi" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:349 msgid "Romanian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:350 msgid "Russian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:351 msgid "Kinyarwanda" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:352 msgid "Sanskrit" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:353 msgid "Sardinian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:354 msgid "Sindhi" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:355 msgid "Northern Sami" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:356 msgid "Sango" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:357 msgid "Sinhala" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:358 msgid "Slovak" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:359 msgid "Slovenian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:360 msgid "Samoan" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:361 msgid "Shona" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:362 msgid "Somali" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:363 msgid "Albanian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:364 msgid "Serbian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:365 msgid "Swati" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:366 msgid "Sotho, Southern" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:367 msgid "Sundanese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:368 msgid "Swedish" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:369 msgid "Swahili" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:370 msgid "Tamil" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:371 msgid "Telugu" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:372 msgid "Tajik" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:373 msgid "Thai" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:374 msgid "Tigrinya" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:375 msgid "Turkmen" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:376 msgid "Tagalog" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:377 msgid "Tswana" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:378 msgid "Tonga" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:379 msgid "Turkish" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:380 msgid "Tsonga" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:381 msgid "Tatar" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:382 msgid "Twi" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:383 msgid "Tahitian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:384 msgid "Uighur" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:385 msgid "Ukrainian" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:386 msgid "Urdu" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:387 msgid "Uzbek" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:388 msgid "Venda" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:389 msgid "Vietnamese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:390 msgid "Volapuek" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:391 msgid "Walloon" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:392 msgid "Wolof" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:393 msgid "Xhosa" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:394 msgid "Yiddish" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:395 msgid "Yoruba" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:396 msgid "Zhuang" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:397 msgid "Chinese" msgstr "" #: ..\..\radiant\settings\LanguageManager.cpp:398 msgid "Zulu" msgstr "" #: ..\..\radiant\textool\TexTool.cpp:38 msgid "Texture Tool" msgstr "" #: ..\..\radiant\ui\about\AboutDialog.cpp:24 msgid "About DarkRadiant" msgstr "" #: ..\..\radiant\ui\about\AboutDialog.cpp:57 #, c-format msgid "Build date: %s" msgstr "" #: ..\..\radiant\ui\about\AboutDialog.cpp:61 #, c-format msgid "Version: %d.%d.%d" msgstr "" #: ..\..\radiant\ui\about\AboutDialog.cpp:73 #, c-format msgid "Vendor: %s" msgstr "" #: ..\..\radiant\ui\about\AboutDialog.cpp:74 #, c-format msgid "Version: %s" msgstr "" #: ..\..\radiant\ui\about\AboutDialog.cpp:75 #, c-format msgid "Renderer: %s" msgstr "" #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:16 #: xml_file_content.cpp:138 msgid "MD5 Animation Viewer" msgstr "" #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:58 #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:78 msgid "Model Definition" msgstr "" #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:61 msgid "Available Animations" msgstr "" #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:100 msgid "Animation" msgstr "" #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:102 #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:104 msgid "File" msgstr "" #: ..\..\radiant\ui\brush\QuerySidesDialog.cpp:15 msgid "Enter Number of Sides" msgstr "" #: ..\..\radiant\ui\brush\QuerySidesDialog.cpp:50 msgid "Number of sides: " msgstr "" #: ..\..\radiant\ui\commandlist\CommandList.cpp:18 msgid "Shortcut List" msgstr "" #: ..\..\radiant\ui\commandlist\CommandList.cpp:53 #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:94 #: xml_file_content.cpp:2 msgid "Command" msgstr "" #: ..\..\radiant\ui\commandlist\CommandList.cpp:55 #: ..\..\libs\wxutil\KeyValueTable.cpp:41 msgid "Key" msgstr "" #: ..\..\radiant\ui\commandlist\CommandList.cpp:126 msgid "Enter new Shortcut" msgstr "" #: ..\..\radiant\ui\commandlist\ShortcutChooser.cpp:39 msgid "Note: This shortcut is already assigned to:" msgstr "" #: ..\..\radiant\ui\commandlist\ShortcutChooser.cpp:49 #: ..\..\plugins\script\ScriptWindow.cpp:85 xml_file_content.cpp:12 #: xml_file_content.cpp:3 xml_file_content.cpp:7 xml_file_content.cpp:10 #: xml_file_content.cpp:17 xml_file_content.cpp:8 xml_file_content.cpp:4 #: xml_file_content.cpp:14 xml_file_content.cpp:15 msgid "OK" msgstr "" #: ..\..\radiant\ui\commandlist\ShortcutChooser.cpp:52 xml_file_content.cpp:2 #: xml_file_content.cpp:6 xml_file_content.cpp:9 xml_file_content.cpp:16 #: xml_file_content.cpp:1 xml_file_content.cpp:3 xml_file_content.cpp:13 #: xml_file_content.cpp:14 xml_file_content.cpp:20 msgid "Cancel" msgstr "" #: ..\..\radiant\ui\commandlist\ShortcutChooser.cpp:136 #, c-format msgid "" "The specified shortcut is already assigned to %s\n" "Overwrite the current setting and assign this shortcut to %s instead?" msgstr "" #: ..\..\radiant\ui\commandlist\ShortcutChooser.cpp:142 msgid "Overwrite existing shortcut?" msgstr "" #: ..\..\radiant\ui\common\CommandEntry.cpp:26 msgid "Go" msgstr "" #: ..\..\radiant\ui\common\EntityChooser.cpp:16 msgid "Select Entity" msgstr "" #: ..\..\radiant\ui\common\ShaderChooser.cpp:15 msgid "Choose Shader" msgstr "" #: ..\..\radiant\ui\common\ShaderDefinitionView.cpp:23 msgid "Material:" msgstr "" #: ..\..\radiant\ui\common\ShaderDefinitionView.cpp:24 msgid "Defined in:" msgstr "" #: ..\..\radiant\ui\common\ShaderDefinitionView.cpp:41 msgid "Definition:" msgstr "" #: ..\..\radiant\ui\common\ShaderDefinitionView.cpp:88 msgid "View Shader Definition" msgstr "" #: ..\..\radiant\ui\common\ShaderSelector.cpp:195 #: ..\..\radiant\ui\common\ShaderSelector.cpp:225 #: ..\..\radiant\ui\einspector\EntityInspector.cpp:433 #: ..\..\plugins\eclasstree\EClassTree.cpp:143 #: ..\..\libs\wxutil\KeyValueTable.cpp:44 msgid "Value" msgstr "" #: ..\..\radiant\ui\common\ShaderSelector.cpp:223 msgid "Attribute" msgstr "" #: ..\..\radiant\ui\common\ShaderSelector.cpp:360 #: ..\..\radiant\ui\common\ShaderSelector.cpp:378 #: ..\..\radiant\ui\common\TexturePreviewCombo.cpp:74 msgid "Defined in" msgstr "" #: ..\..\radiant\ui\common\ShaderSelector.cpp:361 #: ..\..\radiant\ui\common\ShaderSelector.cpp:394 #: ..\..\radiant\ui\common\TexturePreviewCombo.cpp:75 #: ..\..\plugins\dm.editing\AIVocalSetChooserDialog.cpp:53 #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:136 xml_file_content.cpp:1 msgid "Description" msgstr "" #: ..\..\radiant\ui\common\ShaderSelector.cpp:369 #: ..\..\plugins\dm.conversation\CommandEditor.cpp:212 msgid "None" msgstr "" #: ..\..\radiant\ui\common\ShaderSelector.cpp:377 msgid "Image map" msgstr "" #: ..\..\radiant\ui\common\ShaderSelector.cpp:391 msgid "Light flags" msgstr "" #: ..\..\radiant\ui\common\SoundChooser.cpp:156 msgid "Choose sound" msgstr "" #: ..\..\radiant\ui\common\SoundChooser.cpp:186 msgid "Soundshader" msgstr "" #: ..\..\radiant\ui\common\SoundChooser.cpp:205 #: ..\..\radiant\ui\entitychooser\EntityClassChooser.cpp:288 #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:301 msgid "Loading..." msgstr "" #: ..\..\radiant\ui\common\SoundShaderPreview.cpp:26 msgid "Sound Files" msgstr "" #: ..\..\radiant\ui\common\SoundShaderPreview.cpp:45 msgid "Play" msgstr "" #: ..\..\radiant\ui\common\SoundShaderPreview.cpp:48 msgid "Stop" msgstr "" #: ..\..\radiant\ui\common\SoundShaderPreview.cpp:150 msgid "Error: File not found." msgstr "" #: ..\..\radiant\ui\common\TexturePreviewCombo.cpp:44 msgid "Copy shader name" msgstr "" #: ..\..\radiant\ui\einspector\AddPropertyDialog.cpp:27 msgid "Add property" msgstr "" #: ..\..\radiant\ui\einspector\AddPropertyDialog.cpp:31 msgid "Custom properties defined for this entity class, if any" msgstr "" #: ..\..\radiant\ui\einspector\AddPropertyDialog.cpp:76 #: ..\..\radiant\ui\einspector\EntityInspector.cpp:428 #: ..\..\plugins\eclasstree\EClassTree.cpp:140 msgid "Property" msgstr "" #: ..\..\radiant\ui\einspector\ClassnamePropertyEditor.cpp:25 msgid "Choose entity class..." msgstr "" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:104 msgid "Show inherited properties" msgstr "" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:108 msgid "Show help" msgstr "" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:291 msgid "Add property..." msgstr "" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:295 msgid "Delete property" msgstr "" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:303 msgid "Copy Spawnarg" msgstr "" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:308 msgid "Cut Spawnarg" msgstr "" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:313 msgid "Paste Spawnarg" msgstr "" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:438 msgid "?" msgstr "" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:650 #, c-format msgid "The name %s already exists in this map!" msgstr "" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:1060 #, c-format msgid "Entity %d" msgstr "" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:1072 #, c-format msgid "Entity %d, Primitive %d" msgstr "" #: ..\..\radiant\ui\einspector\EntityPropertyEditor.cpp:31 msgid "Choose target entity..." msgstr "" #: ..\..\radiant\ui\einspector\FloatPropertyEditor.cpp:78 #: ..\..\radiant\ui\einspector\Vector3PropertyEditor.cpp:62 msgid "Apply..." msgstr "" #: ..\..\radiant\ui\einspector\LightTextureChooser.cpp:48 msgid "Choose texture" msgstr "" #: ..\..\radiant\ui\einspector\ModelPropertyEditor.cpp:37 msgid "Choose model..." msgstr "" #: ..\..\radiant\ui\einspector\ModelPropertyEditor.cpp:42 msgid "Choose particle..." msgstr "" #: ..\..\radiant\ui\einspector\SkinChooser.cpp:26 msgid "Choose Skin" msgstr "" #: ..\..\radiant\ui\einspector\SkinChooser.cpp:84 msgid "Skin" msgstr "" #: ..\..\radiant\ui\einspector\SkinChooser.cpp:196 msgid "Matching skins" msgstr "" #: ..\..\radiant\ui\einspector\SkinChooser.cpp:219 msgid "All skins" msgstr "" #: ..\..\radiant\ui\einspector\SkinPropertyEditor.cpp:23 #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:108 msgid "Choose skin..." msgstr "" #: ..\..\radiant\ui\einspector\SoundPropertyEditor.cpp:22 msgid "Choose sound..." msgstr "" #: ..\..\radiant\ui\einspector\TexturePropertyEditor.cpp:27 msgid "Choose texture..." msgstr "" #: ..\..\radiant\ui\einspector\Vector3PropertyEditor.cpp:54 msgid "X: " msgstr "" #: ..\..\radiant\ui\einspector\Vector3PropertyEditor.cpp:56 msgid " Y: " msgstr "" #: ..\..\radiant\ui\einspector\Vector3PropertyEditor.cpp:58 msgid " Z: " msgstr "" #: ..\..\radiant\ui\entitychooser\EntityClassChooser.cpp:25 msgid "Create entity" msgstr "" #: ..\..\radiant\ui\entitychooser\EntityClassChooser.cpp:299 #: ..\..\plugins\eclasstree\EClassTree.cpp:127 msgid "Classname" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:21 msgid "Filter Settings" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:138 msgid "enabled" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:138 msgid "disabled" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:182 #: ..\..\plugins\dm.conversation\ConversationDialog.cpp:78 #: ..\..\plugins\entitylist\EntityList.cpp:54 xml_file_content.cpp:1 msgid "Name" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:185 msgid "State" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:265 msgid "NewFilter" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:283 #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:353 msgid "Empty Filter" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:284 msgid "No rules defined for this filter, cannot insert." msgstr "" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:297 msgid "Name Conflict" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:298 msgid "Cannot add, filter with same name already exists." msgstr "" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:354 msgid "No rules defined for this filter. Delete it?" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:16 msgid "Edit Filter" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:17 msgid "View Filter" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:111 #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:161 #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:306 msgid "show" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:111 #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:162 msgid "hide" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:132 msgid "Index" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:145 #: ..\..\plugins\dm.objectives\ComponentsDialog.cpp:121 #: ..\..\plugins\dm.stimresponse\ClassEditor.cpp:66 #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:91 #: xml_file_content.cpp:19 msgid "Type" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:152 msgid "Entity Key" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:156 msgid "Match" msgstr "" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:167 msgid "Action" msgstr "" #: ..\..\radiant\ui\findshader\FindShader.cpp:19 msgid "Find & Replace Shader" msgstr "" #: ..\..\radiant\ui\findshader\FindShader.cpp:20 #, c-format msgid "%d shader(s) replaced." msgstr "" #: ..\..\radiant\ui\layers\LayerControl.cpp:57 msgid "" "Click to select all in layer, hold SHIFT to deselect, hold CTRL to set as " "active layer." msgstr "" #: ..\..\radiant\ui\layers\LayerControl.cpp:58 msgid "Rename this layer" msgstr "" #: ..\..\radiant\ui\layers\LayerControl.cpp:59 msgid "Delete this layer" msgstr "" #: ..\..\radiant\ui\layers\LayerControl.cpp:60 msgid "Toggle layer visibility" msgstr "" #: ..\..\radiant\ui\layers\LayerControl.cpp:127 msgid "Do you really want to delete this layer?" msgstr "" #: ..\..\radiant\ui\layers\LayerControl.cpp:131 msgid "Confirm Layer Deletion" msgstr "" #: ..\..\radiant\ui\layers\LayerControl.cpp:153 msgid "Rename Layer" msgstr "" #: ..\..\radiant\ui\layers\LayerControl.cpp:154 msgid "Enter new Layer Name" msgstr "" #: ..\..\radiant\ui\layers\LayerControl.cpp:176 msgid "Could not rename layer, please try again." msgstr "" #: ..\..\radiant\ui\layers\LayerControlDialog.cpp:31 xml_file_content.cpp:50 msgid "Layers" msgstr "" #: ..\..\radiant\ui\layers\LayerControlDialog.cpp:68 msgid "Show all" msgstr "" #: ..\..\radiant\ui\layers\LayerControlDialog.cpp:69 msgid "Hide all" msgstr "" #: ..\..\radiant\ui\layers\LayerControlDialog.cpp:75 xml_file_content.cpp:2 msgid "New" msgstr "" #: ..\..\radiant\ui\lightinspector\LightInspector.cpp:29 msgid "Light properties" msgstr "" #: ..\..\radiant\ui\mainframe\EmbeddedLayout.cpp:76 #: ..\..\radiant\ui\mainframe\FloatingLayout.cpp:59 #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:111 xml_file_content.cpp:52 msgid "Texture Browser" msgstr "" #: ..\..\radiant\ui\mainframe\EmbeddedLayout.cpp:79 #: ..\..\radiant\ui\mainframe\FloatingLayout.cpp:62 #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:114 msgid "Textures" msgstr "" #: ..\..\radiant\ui\mainframe\LayoutCommand.h:54 msgid "Window Layout" msgstr "" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:93 msgid "Settings/Multi Monitor" msgstr "" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:112 msgid "Start DarkRadiant on monitor" msgstr "" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:131 msgid "Settings/Compatibility" msgstr "" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:133 msgid "Disable Windows Desktop Composition" msgstr "" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:270 msgid "Exit DarkRadiant" msgstr "" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:383 #: ..\..\radiant\ui\mainframe\MainFrame.cpp:386 #: ..\..\plugins\uimanager\GroupDialog.cpp:28 msgid "Entity" msgstr "" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:394 #: ..\..\radiant\ui\mainframe\MainFrame.cpp:397 msgid "Media" msgstr "" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:405 #: ..\..\radiant\ui\mainframe\MainFrame.cpp:408 msgid "Console" msgstr "" #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:144 msgid "Camera Position" msgstr "" #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:147 msgid "Top Left" msgstr "" #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:149 msgid "Top Right" msgstr "" #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:151 msgid "Bottom Left" msgstr "" #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:153 msgid "Bottom Right" msgstr "" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:17 msgid "Entities" msgstr "" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:48 msgid "Entity Class" msgstr "" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:51 #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:51 msgid "Count" msgstr "" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:70 msgid "Brushes:" msgstr "" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:71 msgid "Patches:" msgstr "" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:72 msgid "Entities:" msgstr "" #: ..\..\radiant\ui\mapinfo\MapInfoDialog.cpp:22 msgid "Map Info" msgstr "" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:14 msgid "Models" msgstr "" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:45 msgid "Model" msgstr "" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:48 msgid "Polys" msgstr "" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:54 msgid "Skins" msgstr "" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:75 msgid "Models used:" msgstr "" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:76 msgid "Named Skins used:" msgstr "" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:18 msgid "Shaders" msgstr "" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:20 msgid "Select elements using this shader" msgstr "" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:21 msgid "Deselect elements using this shader" msgstr "" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:63 msgid "Faces" msgstr "" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:66 msgid "Patches" msgstr "" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:86 msgid "Shaders used:" msgstr "" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:52 msgid "Load in Textures view" msgstr "" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:55 msgid "Apply to selection" msgstr "" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:58 msgid "Show Shader Definition" msgstr "" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:62 msgid "Other Materials" msgstr "" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:555 #: ..\..\plugins\eclasstree\EClassTree.cpp:43 msgid "Loading, please wait..." msgstr "" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:671 msgid "Settings/Media Browser" msgstr "" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:672 msgid "Load media tree at startup" msgstr "" #: ..\..\radiant\ui\mediabrowser\TextureDirectoryLoader.h:35 msgid "Loading textures" msgstr "" #: ..\..\radiant\ui\menu\FiltersMenu.cpp:64 msgid "Activate &all Filters" msgstr "" #: ..\..\radiant\ui\menu\FiltersMenu.cpp:65 msgid "&Deactivate all Filters" msgstr "" #: ..\..\radiant\ui\menu\FiltersMenu.cpp:68 msgid "Edit Filters..." msgstr "" #: ..\..\radiant\ui\modelselector\MaterialsList.cpp:45 msgid "Material" msgstr "" #: ..\..\radiant\ui\modelselector\MaterialsList.cpp:47 xml_file_content.cpp:8 msgid "Visible" msgstr "" #: ..\..\radiant\ui\modelselector\ModelFileFunctor.h:48 msgid "Loading models" msgstr "" #: ..\..\radiant\ui\modelselector\ModelFileFunctor.h:52 msgid "Searching" msgstr "" #: ..\..\radiant\ui\modelselector\ModelFileFunctor.h:77 #, c-format msgid "%d models loaded" msgstr "" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:36 msgid "Choose Model" msgstr "" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:251 msgid "Model Path" msgstr "" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:357 msgid "Model name" msgstr "" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:358 msgid "Skin name" msgstr "" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:359 msgid "Total vertices" msgstr "" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:360 msgid "Total polys" msgstr "" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:361 msgid "Material surfaces" msgstr "" #: ..\..\radiant\ui\mousetool\BindToolDialog.cpp:18 #, c-format msgid "Select new Binding: %s" msgstr "" #: ..\..\radiant\ui\mousetool\BindToolDialog.cpp:46 msgid "" "Please select a new button/modifier combination\n" "by clicking on the area below." msgstr "" #: ..\..\radiant\ui\mousetool\BindToolDialog.cpp:53 msgid "Click here to assign" msgstr "" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:23 msgid "Edit Mouse Bindings" msgstr "" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:50 msgid "Reset all mappings to default" msgstr "" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:72 msgid "Double click row to edit a binding" msgstr "" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:122 msgid "Tool" msgstr "" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:125 msgid "Modifier" msgstr "" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:128 msgid "Button" msgstr "" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:185 msgid "Reset to default?" msgstr "" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:186 msgid "" "Really clear all bindings and reload\n" "them from the default settings?" msgstr "" #: ..\..\radiant\ui\mru\MRU.cpp:26 msgid "Recently used Maps" msgstr "" #: ..\..\radiant\ui\mru\MRU.cpp:109 #, c-format msgid "Could not read map file: %s" msgstr "" #: ..\..\radiant\ui\mru\MRU.cpp:125 msgid "Settings/Map Files" msgstr "" #: ..\..\radiant\ui\mru\MRU.cpp:127 msgid "Number of most recently used files" msgstr "" #: ..\..\radiant\ui\mru\MRU.cpp:128 msgid "Open last map on startup" msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:50 msgid "Create entity..." msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:52 msgid "Create player start here" msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:54 msgid "Move player start here" msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:56 msgid "Create model..." msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:58 msgid "Surround with monsterclip" msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:60 msgid "Create light..." msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:62 msgid "Insert prefab..." msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:64 msgid "Create speaker..." msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:66 msgid "Convert to func_static" msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:68 msgid "Reparent primitives" msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:69 msgid "Revert to worldspawn" msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:70 msgid "Revert part to worldspawn" msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:73 msgid "Merge Entities" msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:74 xml_file_content.cpp:154 msgid "Make Visportal" msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:323 msgid "Unable to create light, classname not found." msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:352 msgid "Unable to create speaker, classname not found." msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:422 msgid "Unable to create model, classname not found." msgstr "" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:430 msgid "Nothing must be selected for model creation" msgstr "" #: ..\..\radiant\ui\overlay\OverlayDialog.cpp:25 msgid "Background image" msgstr "" #: ..\..\radiant\ui\particles\ParticlesChooser.cpp:37 msgid "Choose particles" msgstr "" #: ..\..\radiant\ui\particles\ParticlesChooser.cpp:66 #: ..\..\plugins\particles\editor\ParticleEditor.cpp:158 msgid "Particle" msgstr "" #: ..\..\radiant\ui\patch\BulgePatchDialog.cpp:9 msgid "Bulge Patch" msgstr "" #: ..\..\radiant\ui\patch\BulgePatchDialog.cpp:10 msgid "Noise:" msgstr "" #: ..\..\radiant\ui\patch\CapDialog.cpp:16 msgid "Create Cap Patch" msgstr "" #: ..\..\radiant\ui\patch\CapDialog.cpp:20 msgid "Bevel" msgstr "" #: ..\..\radiant\ui\patch\CapDialog.cpp:21 msgid "End Cap" msgstr "" #: ..\..\radiant\ui\patch\CapDialog.cpp:22 msgid "Inverted Bevel" msgstr "" #: ..\..\radiant\ui\patch\CapDialog.cpp:23 msgid "Inverted Endcap" msgstr "" #: ..\..\radiant\ui\patch\CapDialog.cpp:24 msgid "Cylinder" msgstr "" #: ..\..\radiant\ui\patch\PatchCreateDialog.cpp:13 msgid "Create Flat Patch Mesh" msgstr "" #: ..\..\radiant\ui\patch\PatchInspector.cpp:28 msgid "Patch Inspector" msgstr "" #: ..\..\radiant\ui\patch\PatchInspector.cpp:29 #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:55 #: ..\..\radiant\ui\transform\TransformDialog.cpp:38 msgid "Step:" msgstr "" #: ..\..\radiant\ui\patch\PatchThickenDialog.cpp:14 msgid "Patch Thicken" msgstr "" #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:39 msgid "Choose Prefab" msgstr "" #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:90 msgid "Rescan Prefab Folders" msgstr "" #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:121 msgid "Browse mod resources" msgstr "" #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:123 msgid "Browse custom path:" msgstr "" #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:453 msgid "" msgstr "" #: ..\..\radiant\ui\prefdialog\PrefDialog.cpp:37 msgid "DarkRadiant Preferences" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:38 msgid "Surface Inspector" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:39 msgid "Texture Properties" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:40 msgid "Texture Operations" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:48 msgid "Horiz. Shift:" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:49 msgid "Vert. Shift:" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:50 msgid "Horiz. Scale:" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:51 msgid "Vert. Scale:" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:52 msgid "Rotation:" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:53 #: xml_file_content.cpp:15 msgid "Shader:" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:57 msgid "Fit Texture:" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:58 msgid "Fit" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:60 msgid "Align Texture:" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:61 msgid "Top" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:62 msgid "Bottom" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:63 #: xml_file_content.cpp:16 msgid "Right" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:64 #: xml_file_content.cpp:15 msgid "Left" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:66 msgid "Flip Texture:" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:67 msgid "Flip Horizontal" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:68 msgid "Flip Vertical" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:70 msgid "Modify Texture:" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:71 msgid "Natural" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:72 msgid "Normalise" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:74 msgid "Default Scale:" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:75 #: xml_file_content.cpp:9 msgid "Texture Lock" msgstr "" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:634 msgid "Both fit values must be > 0." msgstr "" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:48 msgid "Seek in Media Browser" msgstr "" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:97 #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:851 msgid "No shader" msgstr "" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1041 msgid "Settings/Texture Browser" msgstr "" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1052 msgid "Texture Thumbnail Scale" msgstr "" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1054 msgid "Uniform texture thumbnail size (pixels)" msgstr "" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1055 msgid "Texture scrollbar" msgstr "" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1056 msgid "Mousewheel Increment" msgstr "" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1057 msgid "Max shadername length" msgstr "" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1059 msgid "Show Texture Filter" msgstr "" #: ..\..\radiant\ui\transform\TransformDialog.cpp:26 msgid "Arbitrary Transformation" msgstr "" #: ..\..\radiant\ui\transform\TransformDialog.cpp:27 msgid "Rotation" msgstr "" #: ..\..\radiant\ui\transform\TransformDialog.cpp:28 msgid "Scale" msgstr "" #: ..\..\radiant\ui\transform\TransformDialog.cpp:30 msgid "X-Axis Rotate:" msgstr "" #: ..\..\radiant\ui\transform\TransformDialog.cpp:31 msgid "Y-Axis Rotate:" msgstr "" #: ..\..\radiant\ui\transform\TransformDialog.cpp:32 msgid "Z-Axis Rotate:" msgstr "" #: ..\..\radiant\ui\transform\TransformDialog.cpp:34 msgid "X-Axis Scale:" msgstr "" #: ..\..\radiant\ui\transform\TransformDialog.cpp:35 msgid "Y-Axis Scale:" msgstr "" #: ..\..\radiant\ui\transform\TransformDialog.cpp:36 msgid "Z-Axis Scale:" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:195 msgid "Settings/Orthoview" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:197 msgid "View chases Mouse Cursor during Drags" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:198 msgid "Maximum Chase Mouse Speed" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:199 msgid "Update Views on Camera Movement" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:200 msgid "Show Crosshairs" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:201 msgid "Show Grid" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:202 msgid "Show Size Info" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:203 msgid "Show Entity Angle Arrow" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:204 msgid "Show Entity Names" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:205 xml_file_content.cpp:79 msgid "Show Blocks" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:206 msgid "Show Coordinates" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:207 xml_file_content.cpp:82 msgid "Show Axes" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:208 xml_file_content.cpp:81 msgid "Show Window Outline" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:209 xml_file_content.cpp:83 msgid "Show Workzone" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:210 msgid "Translate Manipulator always constrained to Axis" msgstr "" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:211 msgid "Higher Selection Priority for Entities" msgstr "" #: ..\..\radiant\xyview\tools\BrushCreatorTool.cpp:25 msgid "Drag-create Brush" msgstr "" #: ..\..\radiant\xyview\tools\CameraAngleTool.h:28 msgid "Point Camera" msgstr "" #: ..\..\radiant\xyview\tools\CameraMoveTool.h:27 msgid "Drag Camera" msgstr "" #: ..\..\radiant\xyview\tools\ClipperTool.cpp:21 xml_file_content.cpp:148 #: xml_file_content.cpp:12 xml_file_content.cpp:17 msgid "Clipper" msgstr "" #: ..\..\radiant\xyview\tools\MoveViewTool.h:27 msgid "Drag View" msgstr "" #: ..\..\radiant\xyview\tools\ZoomTool.h:30 msgid "Zoom View" msgstr "" #: ..\..\radiant\xyview\XYWnd.cpp:231 msgid "XY Top" msgstr "" #: ..\..\radiant\xyview\XYWnd.cpp:234 msgid "XZ Front" msgstr "" #: ..\..\radiant\xyview\XYWnd.cpp:237 msgid "YZ Side" msgstr "" #: ..\..\radiant\xyview\XYWnd.cpp:637 #, c-format msgid "x: %6.1lf y: %6.1lf z: %6.1lf" msgstr "" #: ..\..\plugins\dm.conversation\CommandArgumentItem.cpp:100 #: ..\..\plugins\dm.conversation\CommandEditor.cpp:40 #, c-format msgid "Actor %d (%s)" msgstr "" #: ..\..\plugins\dm.conversation\CommandEditor.cpp:24 msgid "Edit Command" msgstr "" #: ..\..\plugins\dm.conversation\ConversationDialog.cpp:30 msgid "Conversation Editor" msgstr "" #: ..\..\plugins\dm.conversation\ConversationDialog.cpp:278 #, c-format msgid "Unable to create conversation Entity: class '%s' not found." msgstr "" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:24 msgid "Edit Conversation" msgstr "" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:67 msgid "Actor (click to edit)" msgstr "" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:92 #: xml_file_content.cpp:1 msgid "Actor" msgstr "" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:96 msgid "Wait" msgstr "" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:201 #, c-format msgid "Actor %d" msgstr "" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:203 #: ..\..\plugins\dm.stimresponse\ResponseEffect.cpp:206 msgid "yes" msgstr "" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:203 #: ..\..\plugins\dm.stimresponse\ResponseEffect.cpp:206 msgid "no" msgstr "" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:369 msgid "New Actor" msgstr "" #: ..\..\plugins\dm.conversation\ConversationEntity.cpp:48 msgid "New Conversation" msgstr "" #: ..\..\plugins\dm.conversation\ConversationEntityFinder.h:79 #: ..\..\plugins\dm.objectives\ObjectiveEntityFinder.cpp:36 #, c-format msgid "%s at [ %s ]" msgstr "" #: ..\..\plugins\dm.conversation\plugin.cpp:50 msgid "Conversations..." msgstr "" #: ..\..\plugins\dm.difficulty\DifficultyDialog.cpp:26 msgid "Difficulty Editor" msgstr "" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:76 xml_file_content.cpp:4 msgid "Setting" msgstr "" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:91 msgid "Assign" msgstr "" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:92 #: ..\..\plugins\dm.stimresponse\ClassEditor.cpp:81 #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:51 #: xml_file_content.cpp:2 xml_file_content.cpp:5 xml_file_content.cpp:8 #: xml_file_content.cpp:11 xml_file_content.cpp:1 xml_file_content.cpp:3 #: xml_file_content.cpp:17 xml_file_content.cpp:6 msgid "Add" msgstr "" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:93 msgid "Multiply" msgstr "" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:94 msgid "Ignore" msgstr "" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:152 msgid "This default setting is overridden, cannot edit." msgstr "" #: ..\..\plugins\dm.difficulty\DifficultySettings.cpp:168 msgid " (overridden)" msgstr "" #: ..\..\plugins\dm.difficulty\plugin.cpp:58 msgid "Difficulty..." msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:59 msgid "Can operate Doors" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:60 msgid "Can light Torches" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:61 msgid "Can operate Switch Lights" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:62 msgid "Can operate Elevators" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:63 msgid "Can greet others" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:64 msgid "Can search" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:65 msgid "AI is civilian" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:66 msgid "Start sleeping" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:67 msgid "Lay down to the left" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:68 msgid "Start sitting" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:69 msgid "Patrol" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:70 msgid "Animal Patrol Mode" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:71 msgid "Start in Alert Idle State" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:72 msgid "Disable Alert Idle State" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:73 msgid "Drunk" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:74 msgid "Body is shoulderable" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:75 msgid "AI doesn't think outside the player PVS" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:77 msgid "AI can drown" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:80 msgid "AI can be flatfooted" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:81 msgid "AI is immune to KOs at high alert levels" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:82 msgid "AI is immune to KOs" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:83 msgid "AI is immune to Gas" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:85 msgid "Team" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:86 msgid "Sitting Angle" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:87 msgid "Drunk Acuity Factor" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:88 msgid "Visual Acuity" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:89 msgid "Audio Acuity" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:91 msgid "Horizontal FOV" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:92 msgid "Vertical FOV" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:94 msgid "Min. Interleave Distance" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:95 msgid "Max. Interleave Distance" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:97 msgid "Health" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:98 msgid "Critical Health" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:99 msgid "Melee Range" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:103 msgid "Appearance" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:108 msgid "Skin: " msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:109 msgid "Head: " msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:109 #: ..\..\plugins\dm.editing\AIHeadPropertyEditor.cpp:31 msgid "Choose AI head..." msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:110 msgid "Vocal Set: " msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:110 msgid "Choose Vocal Set..." msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:115 msgid "Behaviour" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:157 msgid "Abilities" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:172 msgid "Optimization" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:184 msgid "Health / Combat" msgstr "" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:266 #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:269 msgid "AI" msgstr "" #: ..\..\plugins\dm.editing\AIHeadChooserDialog.cpp:18 msgid "Choose AI Head" msgstr "" #: ..\..\plugins\dm.editing\AIVocalSetChooserDialog.cpp:19 msgid "Choose AI Vocal Set" msgstr "" #: ..\..\plugins\dm.editing\AIVocalSetChooserDialog.cpp:44 msgid "Available Sets" msgstr "" #: ..\..\plugins\dm.editing\AIVocalSetPreview.cpp:114 msgid "Error: File not found." msgstr "" #: ..\..\plugins\dm.editing\AIVocalSetPropertyEditor.cpp:31 msgid "Select Vocal Set..." msgstr "" #: ..\..\plugins\dm.editing\FixupMap.cpp:26 msgid "Fixup in progress" msgstr "" #: ..\..\plugins\dm.editing\FixupMap.cpp:60 #, c-format msgid "Processing line %d..." msgstr "" #: ..\..\plugins\dm.editing\FixupMap.cpp:65 msgid "Fixup cancelled" msgstr "" #: ..\..\plugins\dm.editing\FixupMap.cpp:71 msgid "Completed" msgstr "" #: ..\..\plugins\dm.editing\FixupMap.cpp:155 #: ..\..\plugins\dm.editing\FixupMap.cpp:166 msgid "File not readable" msgstr "" #: ..\..\plugins\dm.editing\FixupMap.cpp:156 msgid "The specified file doesn't exist." msgstr "" #: ..\..\plugins\dm.editing\FixupMap.cpp:167 msgid "The specified file can't be opened." msgstr "" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:15 msgid "Fixup Map" msgstr "" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:16 msgid "Fixup File" msgstr "" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:47 #, c-format msgid "%d shaders replaced." msgstr "" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:48 #, c-format msgid "%d entities replaced." msgstr "" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:49 #, c-format msgid "%d models replaced." msgstr "" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:50 #, c-format msgid "%d spawnargs replaced." msgstr "" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:55 msgid "Errors occurred:" msgstr "" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:61 #, c-format msgid "(Line %d): %s" msgstr "" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:66 msgid "Fixup Results" msgstr "" #: ..\..\plugins\dm.editing\plugin.cpp:64 msgid "Fixup Map..." msgstr "" #: ..\..\plugins\dm.gui\GuiSelector.cpp:22 msgid "Choose a Gui Definition..." msgstr "" #: ..\..\plugins\dm.gui\GuiSelector.cpp:130 #: ..\..\plugins\dm.gui\GuiSelector.cpp:139 msgid "Gui Path" msgstr "" #: ..\..\plugins\dm.gui\GuiSelector.cpp:135 msgid "One-Sided Readable Guis" msgstr "" #: ..\..\plugins\dm.gui\GuiSelector.cpp:144 msgid "Two-Sided Readable Guis" msgstr "" #: ..\..\plugins\dm.gui\plugin.cpp:93 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:42 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:533 msgid "Readable Editor" msgstr "" #: ..\..\plugins\dm.gui\plugin.cpp:100 msgid "Reload Readable Guis" msgstr "" #: ..\..\plugins\dm.gui\plugin.cpp:110 msgid "Settings/Readable Editor" msgstr "" #: ..\..\plugins\dm.gui\plugin.cpp:114 msgid "Mod/xdata" msgstr "" #: ..\..\plugins\dm.gui\plugin.cpp:115 msgid "Mod Base/xdata" msgstr "" #: ..\..\plugins\dm.gui\plugin.cpp:116 ..\..\plugins\dm.gui\plugin.cpp:120 msgid "Custom Folder" msgstr "" #: ..\..\plugins\dm.gui\plugin.cpp:118 msgid "XData Storage Folder" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:44 msgid "" "Cannot run Readable Editor on this selection.\n" "Please select a single XData entity." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:47 msgid "Page Editing:" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:48 msgid "General Properties:" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:229 msgid "Insert whole Page" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:230 msgid "Insert on left Side" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:231 msgid "Insert on right Side" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:237 msgid "Delete whole Page" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:238 msgid "Delete on left Side" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:239 msgid "Delete on right Side" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:245 msgid "Append Page" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:250 msgid "Prepend Page" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:255 msgid "Show last XData import summary" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:256 msgid "Show duplicated definitions" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:257 msgid "Show Gui import summary" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:294 msgid "" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:319 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:635 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1374 #, c-format msgid "Failed to import %s." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:321 msgid "Creating a new XData definition..." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:323 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:637 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:656 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:711 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1376 #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:62 msgid "Do you want to open the import summary?" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:325 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:639 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:658 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:713 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1378 #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:79 msgid "Import failed" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:379 msgid "" "You have imported an XData definition that is contained in a PK4, which " "can't be accessed for saving." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:381 msgid "" "Please rename your XData definition, so that it is stored under a different " "filename." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:398 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:419 #, c-format msgid "Failed to open %s for saving." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:405 msgid "" "Merging failed, because the length of the definition to be overwritten could " "not be retrieved." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:443 msgid "Mod path not defined. Using Base path..." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:456 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:474 msgid "Mod Base path not defined, neither is Mod path. Using Engine path..." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:461 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:479 msgid "Mod Base path not defined. Using Mod path..." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:505 #, c-format msgid "" "%s%s already exists in another path.\n" "\n" "XData will be stored in %s%s!" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:654 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:709 #, c-format msgid "Failed to load gui definition %s." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:810 msgid "Import definition?" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:811 #, c-format msgid "The definition %s already exists. Should it be imported?" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:835 msgid "Import failed:" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:838 msgid "Consult the import summary for further information." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:861 #, c-format msgid "" "To avoid duplicated XData definitions the current definition has been " "renamed to %s." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:865 msgid "XData has been renamed." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1133 msgid "The specified gui definition is not a readable." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1138 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1150 msgid "" "The specified gui definition is not suitable for the currently chosen page-" "layout." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1160 msgid "Failure during import." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1163 msgid "The specified Definition does not exist." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1171 msgid "Not a suitable Gui Definition!" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1172 msgid "Start the Gui Browser?" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1206 msgid "Switching to default Gui..." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1207 msgid "You didn't choose a Gui. Using the default Gui now." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1224 msgid "" "No import summary available. An XData definition has to be imported first..." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1236 msgid "XData import summary" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1244 msgid "No import summary available. Browse Gui Definitions first." msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1255 msgid "Gui import summary" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1321 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1339 msgid "Please specify an XData name first!" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1528 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1554 msgid "Duplicated XData definitions" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1529 msgid "There are no duplicated definitions!" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1548 #, c-format msgid "%s has been defined in:" msgstr "" #: ..\..\plugins\dm.gui\ReadablePopulator.h:35 msgid "Analysing Guis" msgstr "" #: ..\..\plugins\dm.gui\ReadableReloader.h:31 msgid "Reloading Guis" msgstr "" #: ..\..\plugins\dm.gui\XData.cpp:254 ..\..\plugins\dm.gui\XData.cpp:282 #: ..\..\plugins\dm.gui\XData.cpp:364 ..\..\plugins\dm.gui\XData.cpp:379 msgid "Page Index out of bounds." msgstr "" #: ..\..\plugins\dm.gui\XData.h:120 ..\..\plugins\dm.gui\XData.h:127 msgid "GUI Page Index out of bounds." msgstr "" #: ..\..\plugins\dm.gui\XDataSelector.cpp:17 msgid "Choose an XData Definition..." msgstr "" #: ..\..\plugins\dm.gui\XDataSelector.cpp:48 msgid "Xdata Path" msgstr "" #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:20 msgid "Choose a file..." msgstr "" #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:60 #, c-format msgid "%s successfully imported." msgstr "" #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:64 msgid "Problems during import" msgstr "" #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:99 msgid "" "The requested definition has been found in multiple Files. Choose the file:" msgstr "" #: ..\..\plugins\dm.objectives\ce\AIFindBodyComponentEditor.cpp:31 msgid "Body:" msgstr "" #: ..\..\plugins\dm.objectives\ce\AIFindBodyComponentEditor.cpp:36 #: ..\..\plugins\dm.objectives\ce\AlertComponentEditor.cpp:43 #: ..\..\plugins\dm.objectives\ce\DestroyComponentEditor.cpp:37 #: ..\..\plugins\dm.objectives\ce\ItemComponentEditor.cpp:37 #: ..\..\plugins\dm.objectives\ce\KillComponentEditor.cpp:38 #: ..\..\plugins\dm.objectives\ce\KnockoutComponentEditor.cpp:38 #: ..\..\plugins\dm.objectives\ce\PickpocketComponentEditor.cpp:37 msgid "Amount:" msgstr "" #: ..\..\plugins\dm.objectives\ce\AIFindItemComponentEditor.cpp:23 #: ..\..\plugins\dm.objectives\ce\DestroyComponentEditor.cpp:31 #: ..\..\plugins\dm.objectives\ce\ItemComponentEditor.cpp:31 #: ..\..\plugins\dm.objectives\ce\PickpocketComponentEditor.cpp:31 msgid "Item:" msgstr "" #: ..\..\plugins\dm.objectives\ce\AlertComponentEditor.cpp:37 msgid "AI:" msgstr "" #: ..\..\plugins\dm.objectives\ce\AlertComponentEditor.cpp:46 msgid "Minimum Alert Level:" msgstr "" #: ..\..\plugins\dm.objectives\ce\CustomClockedComponentEditor.cpp:36 msgid "Script Function:" msgstr "" #: ..\..\plugins\dm.objectives\ce\CustomClockedComponentEditor.cpp:42 #: ..\..\plugins\dm.objectives\ce\DistanceComponentEditor.cpp:68 msgid "Clock interval:" msgstr "" #: ..\..\plugins\dm.objectives\ce\CustomClockedComponentEditor.cpp:48 #: ..\..\plugins\dm.objectives\ce\DistanceComponentEditor.cpp:70 msgid "seconds:" msgstr "" #: ..\..\plugins\dm.objectives\ce\CustomComponentEditor.cpp:17 msgid "" "A custom component requires no specifiers,\n" "the state of this component is manually controlled \n" "(i.e. by scripts or triggers)." msgstr "" #: ..\..\plugins\dm.objectives\ce\DistanceComponentEditor.cpp:50 #: ..\..\plugins\dm.objectives\ce\InfoLocationComponentEditor.cpp:24 #: ..\..\plugins\dm.objectives\ce\LocationComponentEditor.cpp:24 msgid "Entity:" msgstr "" #: ..\..\plugins\dm.objectives\ce\DistanceComponentEditor.cpp:56 msgid "Location Entity:" msgstr "" #: ..\..\plugins\dm.objectives\ce\DistanceComponentEditor.cpp:62 msgid "Distance:" msgstr "" #: ..\..\plugins\dm.objectives\ce\InfoLocationComponentEditor.cpp:30 #: ..\..\plugins\dm.objectives\ce\LocationComponentEditor.cpp:30 msgid "Location:" msgstr "" #: ..\..\plugins\dm.objectives\ce\KillComponentEditor.cpp:32 msgid "Kill target:" msgstr "" #: ..\..\plugins\dm.objectives\ce\KnockoutComponentEditor.cpp:32 msgid "Knockout target:" msgstr "" #: ..\..\plugins\dm.objectives\ce\ReadableClosedComponentEditor.cpp:22 #: ..\..\plugins\dm.objectives\ce\ReadableOpenedComponentEditor.cpp:22 #: ..\..\plugins\dm.objectives\ce\ReadablePageReachedComponentEditor.cpp:31 msgid "Readable:" msgstr "" #: ..\..\plugins\dm.objectives\ce\ReadablePageReachedComponentEditor.cpp:37 msgid "Page Number:" msgstr "" #: ..\..\plugins\dm.objectives\ComponentsDialog.cpp:30 msgid "Edit Objective" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:21 msgid "AI is killed" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:26 msgid "AI is knocked out" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:31 msgid "AI finds an item" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:36 msgid "AI finds a body" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:41 msgid "AI is alerted" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:46 msgid "Object is destroyed" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:51 msgid "Player possesses item" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:56 msgid "Player pickpockets AI" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:61 msgid "Item is in location" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:66 msgid "Item is in info_location" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:71 msgid "Custom script" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:77 msgid "Custom script queried periodically" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:84 msgid "Two entities are within a radius of each other" msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:92 msgid "Readable is opened." msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:100 msgid "Readable is closed." msgstr "" #: ..\..\plugins\dm.objectives\ComponentType.cpp:108 msgid "A certain page of a readable is reached." msgstr "" #: ..\..\plugins\dm.objectives\DifficultyPanel.cpp:22 msgid "All Levels" msgstr "" #: ..\..\plugins\dm.objectives\DifficultyPanel.cpp:31 msgid "Level 1: Easy" msgstr "" #: ..\..\plugins\dm.objectives\DifficultyPanel.cpp:32 msgid "Level 2: Hard" msgstr "" #: ..\..\plugins\dm.objectives\DifficultyPanel.cpp:33 msgid "Level 3: Expert" msgstr "" #: ..\..\plugins\dm.objectives\LogicEditor.cpp:24 msgid "Success Logic:" msgstr "" #: ..\..\plugins\dm.objectives\LogicEditor.cpp:25 msgid "Failure Logic:" msgstr "" #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:18 msgid "Edit Mission Logic" msgstr "" #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:21 msgid "This is the standard logic for all difficulty levels" msgstr "" #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:24 msgid "" "These logics override the standard logic for the given difficulty level\n" "if the logic string is non-empty." msgstr "" #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:45 msgid "Default Logic" msgstr "" #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:57 msgid "Difficulty-specific Logic" msgstr "" #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:66 #, c-format msgid "Logic for Difficulty Level %d" msgstr "" #: ..\..\plugins\dm.objectives\Objective.h:73 msgid "INCOMPLETE" msgstr "" #: ..\..\plugins\dm.objectives\Objective.h:74 msgid "COMPLETE" msgstr "" #: ..\..\plugins\dm.objectives\Objective.h:75 msgid "FAILED" msgstr "" #: ..\..\plugins\dm.objectives\Objective.h:76 msgid "INVALID" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:24 #: xml_file_content.cpp:13 msgid "Edit Objective Conditions" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:145 msgid "Change Objective State" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:147 msgid "Change Visibility" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:149 msgid "Change Mandatory Flag" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:211 #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:212 #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:213 #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:214 #, c-format msgid "Set state to %s" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:225 msgid "Set Invisible" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:226 msgid "Set Visible" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:237 msgid "Clear mandatory flag" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:238 msgid "Set mandatory flag" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:463 #, c-format msgid "Condition affecting objective %d" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:493 #, c-format msgid "If Objective %d in Mission %d is in state '%s' do the following: " msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:504 #, c-format msgid "Set State on Objective %d to %s" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:511 #, c-format msgid "Make Objective %d visible" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:515 #, c-format msgid "Make Objective %d invisible" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:522 #, c-format msgid "Make Objective %d mandatory" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:526 #, c-format msgid "Make Objective %d not mandatory" msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:535 msgid "This condition is not valid or complete yet." msgstr "" #: ..\..\plugins\dm.objectives\ObjectiveEntity.cpp:280 #, c-format msgid "New objective %d" msgstr "" #: ..\..\plugins\dm.objectives\objectives.cpp:68 msgid "Objectives..." msgstr "" #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:34 msgid "Mission Objectives" msgstr "" #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:100 msgid "Start" msgstr "" #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:138 msgid "Diff." msgstr "" #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:263 msgid "Exception occurred: " msgstr "" #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:440 msgid "Unable to create Objective Entity: classes not defined in registry." msgstr "" #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:469 #, c-format msgid "Unable to create Objective Entity: class '%s' not found." msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:20 msgid "entity" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:20 msgid "entities" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:43 msgid "" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:46 msgid "entity " msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:54 #, c-format msgid "%d loot in gold" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:57 #, c-format msgid "%d loot in goods" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:60 #, c-format msgid "%d loot in jewels" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:63 #, c-format msgid "%d loot" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:66 #, c-format msgid "%d of \"%s\"" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:70 #, c-format msgid "%s of type %s" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:73 #, c-format msgid "%s of spawnclass %s" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:76 #, c-format msgid "%s AI of type %s" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:79 #, c-format msgid "%s AI of team %s" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:82 #, c-format msgid "%s AI of %s" msgstr "" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:16 msgid "No specifier" msgstr "" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:20 msgid "Name of single entity" msgstr "" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:24 msgid "Overall (component-specific)" msgstr "" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:29 msgid "Group identifier (component-specific)" msgstr "" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:34 msgid "Any entity of specified class" msgstr "" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:39 msgid "Any entity with SDK-level spawnclass" msgstr "" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:44 msgid "Any AI of specified type" msgstr "" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:48 msgid "Any AI on specified team" msgstr "" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:53 msgid "Any AI with specified combat status" msgstr "" #: ..\..\plugins\dm.stimresponse\ClassEditor.cpp:62 msgid "S/R" msgstr "" #: ..\..\plugins\dm.stimresponse\ClassEditor.cpp:82 xml_file_content.cpp:7 msgid "Remove" msgstr "" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:53 #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:397 #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:412 #: ..\..\plugins\dm.stimresponse\StimEditor.cpp:403 #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:95 #: xml_file_content.cpp:178 xml_file_content.cpp:3 xml_file_content.cpp:7 #: xml_file_content.cpp:9 xml_file_content.cpp:15 xml_file_content.cpp:2 #: xml_file_content.cpp:5 xml_file_content.cpp:6 xml_file_content.cpp:18 msgid "Delete" msgstr "" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:106 #: xml_file_content.cpp:2 msgid "Name:" msgstr "" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:117 msgid "" "Note: Please beware that deleting custom stims may\n" "affect other entities as well. So check before you delete." msgstr "" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:129 msgid "Add Stim Type" msgstr "" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:130 msgid "Remove Stim Type" msgstr "" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:185 #: ..\..\plugins\dm.stimresponse\StimTypes.cpp:290 msgid "Custom Stim" msgstr "" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:209 msgid "Delete Custom Stim" msgstr "" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:210 msgid "" "Beware that other entities might still be using this stim type.\n" "Do you really want to delete this custom stim?" msgstr "" #: ..\..\plugins\dm.stimresponse\EffectEditor.cpp:22 msgid "Edit Response Effect" msgstr "" #: ..\..\plugins\dm.stimresponse\EffectEditor.cpp:111 msgid "Effect:" msgstr "" #: ..\..\plugins\dm.stimresponse\EffectEditor.cpp:118 xml_file_content.cpp:2 msgid "Active" msgstr "" #: ..\..\plugins\dm.stimresponse\EffectEditor.cpp:123 msgid "Arguments" msgstr "" #: ..\..\plugins\dm.stimresponse\plugin.cpp:55 msgid "Stim/Response..." msgstr "" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:24 xml_file_content.cpp:5 msgid "Response Effects" msgstr "" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:231 msgid "Effect" msgstr "" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:234 msgid "Details (double-click to edit)" msgstr "" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:391 #: ..\..\plugins\dm.stimresponse\StimEditor.cpp:397 msgid "Activate" msgstr "" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:393 #: ..\..\plugins\dm.stimresponse\StimEditor.cpp:399 msgid "Deactivate" msgstr "" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:395 #: ..\..\plugins\dm.stimresponse\StimEditor.cpp:401 xml_file_content.cpp:11 msgid "Duplicate" msgstr "" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:402 msgid "Add new Effect" msgstr "" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:404 xml_file_content.cpp:6 #: xml_file_content.cpp:12 xml_file_content.cpp:4 xml_file_content.cpp:8 msgid "Edit" msgstr "" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:407 xml_file_content.cpp:4 msgid "Move Up" msgstr "" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:409 xml_file_content.cpp:5 msgid "Move Down" msgstr "" #: ..\..\plugins\dm.stimresponse\ResponseEffect.cpp:195 msgid "Error: eclass pointer invalid." msgstr "" #: ..\..\plugins\dm.stimresponse\StimResponseEditor.cpp:26 msgid "Stim/Response Editor" msgstr "" #: ..\..\plugins\dm.stimresponse\StimResponseEditor.cpp:31 msgid "A single entity must be selected to edit Stim/Response properties." msgstr "" #: ..\..\plugins\dm.stimresponse\StimResponseEditor.cpp:97 msgid "Stims" msgstr "" #: ..\..\plugins\dm.stimresponse\StimResponseEditor.cpp:104 msgid "Responses" msgstr "" #: ..\..\plugins\dm.stimresponse\StimResponseEditor.cpp:111 msgid "Custom Stims" msgstr "" #: ..\..\plugins\eclassmgr\EClassManager.cpp:311 msgid "Reloading Defs" msgstr "" #: ..\..\plugins\eclasstree\EClassTree.cpp:23 msgid "Entity Class Tree" msgstr "" #: ..\..\plugins\eclasstree\plugin.cpp:51 msgid "Entity Class Tree..." msgstr "" #: ..\..\plugins\entity\EntityCreator.cpp:38 msgid "createNodeForEntity(): cannot create entity for NULL entityclass." msgstr "" #: ..\..\plugins\entitylist\EntityList.cpp:23 xml_file_content.cpp:59 msgid "Entity List" msgstr "" #: ..\..\plugins\entitylist\EntityList.cpp:68 msgid "Focus camera on selected entity" msgstr "" #: ..\..\plugins\entitylist\EntityList.cpp:69 msgid "List visible nodes only" msgstr "" #: ..\..\plugins\eventmanager\MouseToolGroup.cpp:23 msgid "XY View" msgstr "" #: ..\..\plugins\eventmanager\MouseToolGroup.cpp:25 xml_file_content.cpp:49 msgid "Camera View" msgstr "" #: ..\..\plugins\eventmanager\MouseToolGroup.cpp:27 msgid "Unknown" msgstr "" #: ..\..\plugins\filetypes\FileTypeRegistry.cpp:13 msgid "All Files" msgstr "" #: ..\..\plugins\grid\Grid.cpp:151 msgid "Settings/Grid" msgstr "" #: ..\..\plugins\grid\Grid.cpp:153 msgid "Default Grid Size" msgstr "" #: ..\..\plugins\grid\Grid.cpp:157 msgid "Lines" msgstr "" #: ..\..\plugins\grid\Grid.cpp:158 msgid "Dotted Lines" msgstr "" #: ..\..\plugins\grid\Grid.cpp:159 msgid "More Dotted Lines" msgstr "" #: ..\..\plugins\grid\Grid.cpp:160 msgid "Crosses" msgstr "" #: ..\..\plugins\grid\Grid.cpp:161 msgid "Dots" msgstr "" #: ..\..\plugins\grid\Grid.cpp:162 msgid "Big Dots" msgstr "" #: ..\..\plugins\grid\Grid.cpp:163 msgid "Squares" msgstr "" #: ..\..\plugins\grid\Grid.cpp:165 msgid "Major Grid Style" msgstr "" #: ..\..\plugins\grid\Grid.cpp:166 msgid "Minor Grid Style" msgstr "" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:50 #: ..\..\plugins\mapdoom3\Quake3MapReader.cpp:45 #, c-format msgid "" "Failed parsing entity %d:\n" "%s" msgstr "" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:95 #: ..\..\plugins\mapdoom3\Quake4MapReader.cpp:49 msgid "Unable to parse map version (parse exception)." msgstr "" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:103 #: ..\..\plugins\mapdoom3\Quake4MapReader.cpp:57 msgid "Could not recognise map version number format." msgstr "" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:111 #: ..\..\plugins\mapdoom3\Quake4MapReader.cpp:65 #, c-format msgid "Incorrect map version: required %f, found %f" msgstr "" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:144 #: ..\..\plugins\mapdoom3\Quake3MapReader.cpp:94 #, c-format msgid "Primitive #%d: parse error" msgstr "" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:154 #: ..\..\plugins\mapdoom3\Quake3MapReader.cpp:104 #, c-format msgid "Primitive #%d: parse exception %s" msgstr "" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:245 #: ..\..\plugins\mapdoom3\Quake3MapReader.cpp:195 #, c-format msgid "Parsed invalid value '%s' for key '%s'" msgstr "" #: ..\..\plugins\mapdoom3\primitiveparsers\BrushDef.cpp:125 #, c-format msgid "BrushDefParser: invalid token '%s'" msgstr "" #: ..\..\plugins\mapdoom3\primitiveparsers\BrushDef3.cpp:115 #, c-format msgid "BrushDef3Parser: invalid token '%s'" msgstr "" #: ..\..\plugins\mapdoom3\primitiveparsers\BrushDef3.cpp:186 #, c-format msgid "BrushDef3ParserQuake4: invalid token '%s'" msgstr "" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:43 msgid "Particle Editor" msgstr "" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:207 msgid "Stage" msgstr "" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1033 #, c-format msgid "Note: changes will be written to the file %s" msgstr "" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1340 msgid "Save Changes" msgstr "" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1341 #, c-format msgid "" "Do you want to save the changes\n" "you made to the particle %s?" msgstr "" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1374 #, c-format msgid "" "Error saving particle definition:\n" "%s" msgstr "" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1504 msgid "Select .prt file" msgstr "" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1538 msgid "Enter Particle Name" msgstr "" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1552 msgid "Cannot create particle with an empty name." msgstr "" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1567 msgid "This name is already in use." msgstr "" #: ..\..\plugins\particles\editor\ParticleEditorModule.h:56 msgid "Particle Editor..." msgstr "" #: ..\..\plugins\particles\ParticlesManager.cpp:256 msgid "Cannot save particle, it has not been registered yet." msgstr "" #: ..\..\plugins\particles\ParticlesManager.cpp:286 #: ..\..\plugins\particles\ParticlesManager.cpp:314 #, c-format msgid "Cannot open file for writing: %s" msgstr "" #: ..\..\plugins\particles\ParticlesManager.cpp:327 #, c-format msgid "Cannot open file for reading: %s" msgstr "" #: ..\..\plugins\particles\ParticlesManager.cpp:374 #, c-format msgid "Could not remove the file %s" msgstr "" #: ..\..\plugins\particles\ParticlesManager.cpp:388 #, c-format msgid "Could not rename the temporary file %s" msgstr "" #: ..\..\plugins\script\ScriptingSystem.cpp:180 #: ..\..\plugins\script\ScriptingSystem.cpp:183 msgid "Script" msgstr "" #: ..\..\plugins\script\ScriptingSystem.cpp:459 msgid "Reload Scripts" msgstr "" #: ..\..\plugins\script\ScriptMenu.cpp:51 msgid "No scripts available" msgstr "" #: ..\..\plugins\script\ScriptWindow.cpp:37 msgid "Python Script Input" msgstr "" #: ..\..\plugins\script\ScriptWindow.cpp:39 msgid "Run Script" msgstr "" #: ..\..\plugins\shaders\Doom3ShaderSystem.cpp:301 msgid "Loading Shaders" msgstr "" #: ..\..\plugins\shaders\ShaderFileLoader.cpp:96 #, c-format msgid "Parsing material file %s" msgstr "" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:27 msgid "Edit Colour Schemes" msgstr "" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:84 #: xml_file_content.cpp:5 msgid "Colour" msgstr "" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:96 #: xml_file_content.cpp:4 msgid "Copy" msgstr "" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:271 msgid "Copy Colour Scheme" msgstr "" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:271 msgid "Enter a name for the new scheme:" msgstr "" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:281 msgid "A Scheme with that name already exists." msgstr "" #: ..\..\plugins\uimanager\FilterMenu.cpp:16 msgid "_Filters" msgstr "" #: ..\..\plugins\undo\UndoSystem.cpp:378 msgid "Settings/Undo System" msgstr "" #: ..\..\plugins\undo\UndoSystem.cpp:379 msgid "Undo Queue Size" msgstr "" #: ..\..\plugins\wavefront\WaveFrontModule.cpp:31 msgid "Save as Obj" msgstr "" #: ..\..\plugins\wavefront\WaveFrontModule.cpp:89 msgid "Export Selection as OBJ..." msgstr "" #: ..\..\libs\wxutil\dialog\MessageBox.cpp:21 xml_file_content.cpp:8 #: xml_file_content.cpp:10 xml_file_content.cpp:3 xml_file_content.cpp:21 msgid "Save" msgstr "" #: ..\..\libs\wxutil\dialog\MessageBox.cpp:21 msgid "Close without saving" msgstr "" #: ..\..\libs\wxutil\FileChooser.cpp:65 msgid "Open File" msgstr "" #: ..\..\libs\wxutil\FileChooser.cpp:65 msgid "Save File" msgstr "" #: ..\..\libs\wxutil\FileChooser.cpp:115 msgid "All Files (*.*)" msgstr "" #: ..\..\libs\wxutil\ModalProgressDialog.cpp:17 #: ..\..\libs\wxutil\ModalProgressDialog.cpp:27 msgid "Operation cancelled by user" msgstr "" #: ..\..\libs\wxutil\Modifier.h:147 msgid "Alt" msgstr "" #: ..\..\libs\wxutil\Modifier.h:148 msgid "Ctrl" msgstr "" #: ..\..\libs\wxutil\Modifier.h:149 msgid "Shift" msgstr "" #: ..\..\libs\wxutil\PathEntry.cpp:72 msgid "Choose File" msgstr "" #: ..\..\libs\wxutil\PathEntry.cpp:93 msgid "Choose Directory" msgstr "" #: ..\..\libs\wxutil\preview\ModelPreview.cpp:146 #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:177 #, c-format msgid "" "Unable to setup the preview,\n" "could not find the entity class %s" msgstr "" #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:53 msgid "Show coordinate axes" msgstr "" #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:59 msgid "Show wireframe" msgstr "" #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:63 #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:65 msgid "Auto Loop" msgstr "" #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:69 msgid "Reload Particle Defs" msgstr "" #: ..\..\libs\wxutil\preview\RenderPreview.cpp:75 #: ..\..\libs\wxutil\preview\RenderPreview.cpp:77 xml_file_content.cpp:1 msgid "Filters" msgstr "" #: xml_file_content.cpp:1 msgid "&File" msgstr "" #: xml_file_content.cpp:2 msgid "&New Map" msgstr "" #: xml_file_content.cpp:3 msgid "&Open..." msgstr "" #: xml_file_content.cpp:4 msgid "&Import map..." msgstr "" #: xml_file_content.cpp:5 msgid "Import &prefab..." msgstr "" #: xml_file_content.cpp:6 msgid "&Save" msgstr "" #: xml_file_content.cpp:7 msgid "Save &as..." msgstr "" #: xml_file_content.cpp:8 msgid "Save © as..." msgstr "" #: xml_file_content.cpp:9 msgid "&Save selected as Map..." msgstr "" #: xml_file_content.cpp:10 msgid "&Save selected as prefab..." msgstr "" #: xml_file_content.cpp:11 msgid "Save selected as Collision Model..." msgstr "" #: xml_file_content.cpp:12 msgid "Save ®ion..." msgstr "" #: xml_file_content.cpp:13 msgid "&Reload Models" msgstr "" #: xml_file_content.cpp:14 msgid "Reload Selected Models" msgstr "" #: xml_file_content.cpp:15 msgid "Reload S&kins" msgstr "" #: xml_file_content.cpp:16 xml_file_content.cpp:26 msgid "Reload Materials" msgstr "" #: xml_file_content.cpp:17 msgid "Reload Defs" msgstr "" #: xml_file_content.cpp:18 msgid "Reload Particles" msgstr "" #: xml_file_content.cpp:19 msgid "Select &Game..." msgstr "" #: xml_file_content.cpp:20 msgid "&Pointfile" msgstr "" #: xml_file_content.cpp:21 msgid "E&xit" msgstr "" #: xml_file_content.cpp:22 msgid "&Edit" msgstr "" #: xml_file_content.cpp:23 msgid "&Undo" msgstr "" #: xml_file_content.cpp:24 msgid "&Redo" msgstr "" #: xml_file_content.cpp:25 msgid "&Copy" msgstr "" #: xml_file_content.cpp:26 msgid "&Paste" msgstr "" #: xml_file_content.cpp:27 msgid "Paste to Camera" msgstr "" #: xml_file_content.cpp:28 msgid "&Duplicate" msgstr "" #: xml_file_content.cpp:29 msgid "D&elete" msgstr "" #: xml_file_content.cpp:30 msgid "Rep&arent Primitives" msgstr "" #: xml_file_content.cpp:31 msgid "Reparent Primitives to &Worldspawn" msgstr "" #: xml_file_content.cpp:32 msgid "Merge selected Entities" msgstr "" #: xml_file_content.cpp:33 msgid "Copy Shader" msgstr "" #: xml_file_content.cpp:34 msgid "Paste Shader" msgstr "" #: xml_file_content.cpp:35 msgid "Paste Shader (Natural)" msgstr "" #: xml_file_content.cpp:36 msgid "C&lear selection" msgstr "" #: xml_file_content.cpp:37 msgid "&Invert selection" msgstr "" #: xml_file_content.cpp:38 msgid "Select complete t&all" msgstr "" #: xml_file_content.cpp:39 msgid "Select i&nside" msgstr "" #: xml_file_content.cpp:40 msgid "Select &touching" msgstr "" #: xml_file_content.cpp:41 msgid "Select Children" msgstr "" #: xml_file_content.cpp:42 msgid "Expand selection to all Siblings" msgstr "" #: xml_file_content.cpp:43 msgid "Select all of type" msgstr "" #: xml_file_content.cpp:44 msgid "Keyboard Shortcuts..." msgstr "" #: xml_file_content.cpp:45 msgid "Mouse Bindings..." msgstr "" #: xml_file_content.cpp:46 msgid "Pre&ferences..." msgstr "" #: xml_file_content.cpp:47 msgid "V&iew" msgstr "" #: xml_file_content.cpp:48 msgid "New XY view" msgstr "" #: xml_file_content.cpp:51 msgid "Console View" msgstr "" #: xml_file_content.cpp:53 msgid "Media Browser" msgstr "" #: xml_file_content.cpp:54 msgid "Entity Inspector" msgstr "" #: xml_file_content.cpp:55 msgid "&Light Inspector" msgstr "" #: xml_file_content.cpp:56 msgid "&Surface Inspector" msgstr "" #: xml_file_content.cpp:57 msgid "&Patch Inspector" msgstr "" #: xml_file_content.cpp:58 msgid "&Texture Tool" msgstr "" #: xml_file_content.cpp:61 msgid "&Center" msgstr "" #: xml_file_content.cpp:62 msgid "&Up Floor" msgstr "" #: xml_file_content.cpp:63 msgid "&Down Floor" msgstr "" #: xml_file_content.cpp:64 msgid "Far Clip Plane In" msgstr "" #: xml_file_content.cpp:65 msgid "Far Clip Plane Out" msgstr "" #: xml_file_content.cpp:66 msgid "Next leak spot" msgstr "" #: xml_file_content.cpp:67 msgid "Previous leak spot" msgstr "" #: xml_file_content.cpp:68 msgid "Orthographic" msgstr "" #: xml_file_content.cpp:69 msgid "Next (XY, XZ, YZ)" msgstr "" #: xml_file_content.cpp:70 msgid "XY (Top)" msgstr "" #: xml_file_content.cpp:71 msgid "YZ" msgstr "" #: xml_file_content.cpp:72 msgid "XZ" msgstr "" #: xml_file_content.cpp:73 msgid "&XY 100%" msgstr "" #: xml_file_content.cpp:74 msgid "&XY Zoom In" msgstr "" #: xml_file_content.cpp:75 msgid "&XY Zoom Out" msgstr "" #: xml_file_content.cpp:76 msgid "Show" msgstr "" #: xml_file_content.cpp:77 msgid "Show &Angles" msgstr "" #: xml_file_content.cpp:78 msgid "Show &Names" msgstr "" #: xml_file_content.cpp:80 msgid "Show C&oordinates" msgstr "" #: xml_file_content.cpp:84 msgid "Show size info" msgstr "" #: xml_file_content.cpp:85 msgid "Hide/Show" msgstr "" #: xml_file_content.cpp:86 msgid "Hide Selected" msgstr "" #: xml_file_content.cpp:87 msgid "Hide Deselected" msgstr "" #: xml_file_content.cpp:88 msgid "Show hidden" msgstr "" #: xml_file_content.cpp:90 msgid "&Switch off" msgstr "" #: xml_file_content.cpp:91 msgid "Set from &XY view" msgstr "" #: xml_file_content.cpp:92 msgid "Set from &Brush" msgstr "" #: xml_file_content.cpp:93 msgid "Set from Se&lection" msgstr "" #: xml_file_content.cpp:94 msgid "Colours..." msgstr "" #: xml_file_content.cpp:95 msgid "Background Image..." msgstr "" #: xml_file_content.cpp:96 msgid "Mo&dify" msgstr "" #: xml_file_content.cpp:97 xml_file_content.cpp:16 msgid "Components" msgstr "" #: xml_file_content.cpp:98 msgid "&Edges" msgstr "" #: xml_file_content.cpp:99 msgid "&Vertices" msgstr "" #: xml_file_content.cpp:100 msgid "&Faces" msgstr "" #: xml_file_content.cpp:101 msgid "En&tities" msgstr "" #: xml_file_content.cpp:102 msgid "Nudge" msgstr "" #: xml_file_content.cpp:103 msgid "Nudge Left" msgstr "" #: xml_file_content.cpp:104 msgid "Nudge Right" msgstr "" #: xml_file_content.cpp:105 msgid "Nudge Up" msgstr "" #: xml_file_content.cpp:106 msgid "Nudge Down" msgstr "" #: xml_file_content.cpp:107 xml_file_content.cpp:15 msgid "Rotate" msgstr "" #: xml_file_content.cpp:108 msgid "Rotate X" msgstr "" #: xml_file_content.cpp:109 msgid "Rotate Y" msgstr "" #: xml_file_content.cpp:110 msgid "Rotate Z" msgstr "" #: xml_file_content.cpp:111 msgid "Mirror" msgstr "" #: xml_file_content.cpp:112 msgid "Mirror &X" msgstr "" #: xml_file_content.cpp:113 msgid "Mirror &Y" msgstr "" #: xml_file_content.cpp:114 msgid "Mirror &Z" msgstr "" #: xml_file_content.cpp:115 msgid "Free Model Rotation" msgstr "" #: xml_file_content.cpp:116 msgid "Rotate and scale..." msgstr "" #: xml_file_content.cpp:117 msgid "&Grid" msgstr "" #: xml_file_content.cpp:118 msgid "Snap selected to grid" msgstr "" #: xml_file_content.cpp:119 msgid "Grid0.125" msgstr "" #: xml_file_content.cpp:120 msgid "Grid0.25" msgstr "" #: xml_file_content.cpp:121 msgid "Grid0.5" msgstr "" #: xml_file_content.cpp:122 msgid "Grid1" msgstr "" #: xml_file_content.cpp:123 msgid "Grid2" msgstr "" #: xml_file_content.cpp:124 msgid "Grid4" msgstr "" #: xml_file_content.cpp:125 msgid "Grid8" msgstr "" #: xml_file_content.cpp:126 msgid "Grid16" msgstr "" #: xml_file_content.cpp:127 msgid "Grid32" msgstr "" #: xml_file_content.cpp:128 msgid "Grid64" msgstr "" #: xml_file_content.cpp:129 msgid "Grid128" msgstr "" #: xml_file_content.cpp:130 msgid "Grid256" msgstr "" #: xml_file_content.cpp:131 msgid "M&ap" msgstr "" #: xml_file_content.cpp:132 msgid "Find brush..." msgstr "" #: xml_file_content.cpp:133 msgid "Map info..." msgstr "" #: xml_file_content.cpp:134 msgid "E&ntity" msgstr "" #: xml_file_content.cpp:135 msgid "&Revert group to worldspawn" msgstr "" #: xml_file_content.cpp:136 msgid "&Connect selected entities" msgstr "" #: xml_file_content.cpp:137 msgid "&Bind selected entities" msgstr "" #: xml_file_content.cpp:139 msgid "B&rush" msgstr "" #: xml_file_content.cpp:140 msgid "Prism..." msgstr "" #: xml_file_content.cpp:141 msgid "Cone..." msgstr "" #: xml_file_content.cpp:142 msgid "Sphere..." msgstr "" #: xml_file_content.cpp:143 msgid "CSG" msgstr "" #: xml_file_content.cpp:144 msgid "Make &Hollow" msgstr "" #: xml_file_content.cpp:145 msgid "Make &Room" msgstr "" #: xml_file_content.cpp:146 msgid "CSG &Subtract" msgstr "" #: xml_file_content.cpp:147 msgid "CSG &Merge" msgstr "" #: xml_file_content.cpp:149 msgid "Clip Selection" msgstr "" #: xml_file_content.cpp:150 msgid "Split Selection" msgstr "" #: xml_file_content.cpp:151 msgid "Flip Clip Orientation" msgstr "" #: xml_file_content.cpp:152 msgid "Texture lock" msgstr "" #: xml_file_content.cpp:153 msgid "Create Decal Patches" msgstr "" #: xml_file_content.cpp:155 msgid "Make Detail" msgstr "" #: xml_file_content.cpp:156 msgid "Make Structural" msgstr "" #: xml_file_content.cpp:157 msgid "&Patch" msgstr "" #: xml_file_content.cpp:158 msgid "Create Simple Patch Mesh" msgstr "" #: xml_file_content.cpp:159 msgid "Create End cap" msgstr "" #: xml_file_content.cpp:160 msgid "Create Bevel" msgstr "" #: xml_file_content.cpp:161 msgid "Create Cone" msgstr "" #: xml_file_content.cpp:162 msgid "Create Cylinder" msgstr "" #: xml_file_content.cpp:163 msgid "Create Sphere" msgstr "" #: xml_file_content.cpp:164 msgid "More cylinders" msgstr "" #: xml_file_content.cpp:165 msgid "Create Dense Cylinder" msgstr "" #: xml_file_content.cpp:166 msgid "Create Very Dense Cylinder" msgstr "" #: xml_file_content.cpp:167 msgid "Create Square Cylinder" msgstr "" #: xml_file_content.cpp:168 msgid "Insert" msgstr "" #: xml_file_content.cpp:169 msgid "Insert 2 Columns at the beginning" msgstr "" #: xml_file_content.cpp:170 msgid "Insert 2 Columns at the end" msgstr "" #: xml_file_content.cpp:171 msgid "Insert 2 Rows at the beginning" msgstr "" #: xml_file_content.cpp:172 msgid "Insert 2 Rows at the end" msgstr "" #: xml_file_content.cpp:173 msgid "Append" msgstr "" #: xml_file_content.cpp:174 msgid "Append 2 columns at the beginning" msgstr "" #: xml_file_content.cpp:175 msgid "Append 2 columns at the end" msgstr "" #: xml_file_content.cpp:176 msgid "Append 2 rows at the beginning" msgstr "" #: xml_file_content.cpp:177 msgid "Append 2 rows at the end" msgstr "" #: xml_file_content.cpp:179 msgid "Delete 2 columns from the beginning" msgstr "" #: xml_file_content.cpp:180 msgid "Delete 2 columns from the end" msgstr "" #: xml_file_content.cpp:181 msgid "Delete 2 rows from the beginning" msgstr "" #: xml_file_content.cpp:182 msgid "Delete 2 rows from the end" msgstr "" #: xml_file_content.cpp:183 msgid "Matrix" msgstr "" #: xml_file_content.cpp:184 msgid "Invert" msgstr "" #: xml_file_content.cpp:185 msgid "Re-disperse" msgstr "" #: xml_file_content.cpp:186 msgid "Rows" msgstr "" #: xml_file_content.cpp:187 msgid "Columns" msgstr "" #: xml_file_content.cpp:188 msgid "Transpose" msgstr "" #: xml_file_content.cpp:189 msgid "Thicken Selected Patches" msgstr "" #: xml_file_content.cpp:190 msgid "Cap Selection" msgstr "" #: xml_file_content.cpp:191 msgid "Cycle Cap Texture" msgstr "" #: xml_file_content.cpp:192 msgid "Stitch Patch Textures" msgstr "" #: xml_file_content.cpp:193 msgid "Bulge patch" msgstr "" #: xml_file_content.cpp:194 msgid "&Curve" msgstr "" #: xml_file_content.cpp:195 msgid "Create NURBS Curve" msgstr "" #: xml_file_content.cpp:196 msgid "Create CatmullRom Curve" msgstr "" #: xml_file_content.cpp:197 msgid "Convert NURBS <-> CatmullRom" msgstr "" #: xml_file_content.cpp:198 msgid "Append Curve Control Point" msgstr "" #: xml_file_content.cpp:199 msgid "Insert Curve Control Points" msgstr "" #: xml_file_content.cpp:200 msgid "Remove Curve Control Points" msgstr "" #: xml_file_content.cpp:201 msgid "&Help" msgstr "" #: xml_file_content.cpp:202 msgid "&About" msgstr "" #: xml_file_content.cpp:1 msgid "Texture Background" msgstr "" #: xml_file_content.cpp:2 msgid "Grid Background" msgstr "" #: xml_file_content.cpp:3 msgid "Grid Major" msgstr "" #: xml_file_content.cpp:4 msgid "Grid Minor" msgstr "" #: xml_file_content.cpp:5 msgid "Grid Text" msgstr "" #: xml_file_content.cpp:6 msgid "Grid Block" msgstr "" #: xml_file_content.cpp:7 msgid "Brushes" msgstr "" #: xml_file_content.cpp:8 msgid "Entities (default)" msgstr "" #: xml_file_content.cpp:9 msgid "Camera Background" msgstr "" #: xml_file_content.cpp:10 msgid "Selected Brush" msgstr "" #: xml_file_content.cpp:11 msgid "Selected Brush (Camera)" msgstr "" #: xml_file_content.cpp:13 msgid "Active View Name" msgstr "" #: xml_file_content.cpp:14 msgid "X-Axis" msgstr "" #: xml_file_content.cpp:15 msgid "Y-Axis" msgstr "" #: xml_file_content.cpp:16 msgid "Z-Axis" msgstr "" #: xml_file_content.cpp:17 msgid "Workzone" msgstr "" #: xml_file_content.cpp:18 msgid "Camera Icon" msgstr "" #: xml_file_content.cpp:19 msgid "Brush Size Info" msgstr "" #: xml_file_content.cpp:20 msgid "Light Volumes" msgstr "" #: xml_file_content.cpp:21 msgid "Brush Vertices" msgstr "" #: xml_file_content.cpp:22 msgid "Patch Inner Vertex" msgstr "" #: xml_file_content.cpp:23 msgid "Patch Corner Vertex" msgstr "" #: xml_file_content.cpp:24 msgid "Light Vertices (deselected)" msgstr "" #: xml_file_content.cpp:25 msgid "Light Vertices (selected)" msgstr "" #: xml_file_content.cpp:26 msgid "Light Vertices (normal)" msgstr "" #: xml_file_content.cpp:27 msgid "Light Start/End (selected)" msgstr "" #: xml_file_content.cpp:28 msgid "Light Start/End (deselected)" msgstr "" #: xml_file_content.cpp:29 msgid "XYView Crosshairs" msgstr "" #: xml_file_content.cpp:30 msgid "Drag-Selection Box" msgstr "" #: xml_file_content.cpp:1 msgid "Open a map file" msgstr "" #: xml_file_content.cpp:2 msgid "Save the current map" msgstr "" #: xml_file_content.cpp:3 msgid "Change views" msgstr "" #: xml_file_content.cpp:4 msgid "Select complete tall" msgstr "" #: xml_file_content.cpp:5 msgid "Select touching" msgstr "" #: xml_file_content.cpp:6 msgid "Select inside" msgstr "" #: xml_file_content.cpp:7 msgid "Create Decals for selected Faces" msgstr "" #: xml_file_content.cpp:8 msgid "x-axis Mirror" msgstr "" #: xml_file_content.cpp:9 msgid "x-axis Rotate" msgstr "" #: xml_file_content.cpp:10 msgid "y-axis Mirror" msgstr "" #: xml_file_content.cpp:11 msgid "y-axis Rotate" msgstr "" #: xml_file_content.cpp:12 msgid "z-axis Mirror" msgstr "" #: xml_file_content.cpp:13 msgid "z-axis Rotate" msgstr "" #: xml_file_content.cpp:14 msgid "Snap selection to grid" msgstr "" #: xml_file_content.cpp:15 msgid "Floor selection" msgstr "" #: xml_file_content.cpp:16 msgid "CSG Subtract" msgstr "" #: xml_file_content.cpp:17 msgid "CSG Merge" msgstr "" #: xml_file_content.cpp:18 msgid "Hollow" msgstr "" #: xml_file_content.cpp:19 msgid "Make Room" msgstr "" #: xml_file_content.cpp:20 msgid "Put caps on the current patch" msgstr "" #: xml_file_content.cpp:21 msgid "Creates a NURBS curve" msgstr "" #: xml_file_content.cpp:22 msgid "Convert the selected curve (NURBS <-> CatmullRom)" msgstr "" #: xml_file_content.cpp:23 msgid "Appends a control point to the selected curves" msgstr "" #: xml_file_content.cpp:24 msgid "Inserts a curve control point before the selected ones" msgstr "" #: xml_file_content.cpp:25 msgid "Removes the selected curve control points" msgstr "" #: xml_file_content.cpp:27 msgid "Find & Replace" msgstr "" #: xml_file_content.cpp:28 msgid "Decrease Grid Size" msgstr "" #: xml_file_content.cpp:29 msgid "Increase Grid Size" msgstr "" #: xml_file_content.cpp:30 msgid "Snap to Grid" msgstr "" #: xml_file_content.cpp:31 msgid "Merge Selection" msgstr "" #: xml_file_content.cpp:32 msgid "Flip Selection Horiz (S-Axis)" msgstr "" #: xml_file_content.cpp:33 msgid "Flip Selection Vertical (T-Axis)" msgstr "" #: xml_file_content.cpp:34 msgid "Select Related Items" msgstr "" #: xml_file_content.cpp:1 msgid "Cubic clip the camera view" msgstr "" #: xml_file_content.cpp:2 msgid "Select Vertices" msgstr "" #: xml_file_content.cpp:3 msgid "Select Edges" msgstr "" #: xml_file_content.cpp:5 msgid "Select Entities" msgstr "" #: xml_file_content.cpp:6 msgid "Select Group Parts" msgstr "" #: xml_file_content.cpp:7 msgid "Show/hide all light volumes" msgstr "" #: xml_file_content.cpp:8 msgid "Show/hide all speaker volumes" msgstr "" #: xml_file_content.cpp:10 msgid "Rotate Models independently" msgstr "" #: xml_file_content.cpp:11 msgid "Rotate func_* Entities around origin" msgstr "" #: xml_file_content.cpp:12 msgid "Drag-resize entities symmetrically (leave origin unchanged)" msgstr "" #: xml_file_content.cpp:13 msgid "Offset cloned objects by one grid unit to the right and downwards." msgstr "" #: xml_file_content.cpp:14 msgid "Translate" msgstr "" #: xml_file_content.cpp:16 msgid "Resize" msgstr "" #: xml_file_content.cpp:18 msgid "Hide Unused" msgstr "" #: xml_file_content.cpp:19 msgid "Clamp texture thumbnails to constant size" msgstr "" #: xml_file_content.cpp:20 msgid "Toggle Grid" msgstr "" #: xml_file_content.cpp:21 msgid "Center Pivot when scaling faces" msgstr "" #: xml_file_content.cpp:1 msgid "DarkRadiant x.y.z" msgstr "" #: xml_file_content.cpp:2 msgid "Build date: 2014-08-04" msgstr "" #: xml_file_content.cpp:3 msgid "" "The Dark Mod (www.thedarkmod.com)\n" "\n" "This product contains software technology\n" "from id Software, Inc. ('id Technology').\n" "id Technology 2000 id Software,Inc.\n" "DarkRadiant is based on the GPL version\n" "of GtkRadiant.\n" "\n" "http://darkradiant.sourceforge.net/" msgstr "" #: xml_file_content.cpp:4 msgid "wxWidgets Properties" msgstr "" #: xml_file_content.cpp:5 xml_file_content.cpp:8 msgid "Version:" msgstr "" #: xml_file_content.cpp:6 msgid "OpenGL Properties" msgstr "" #: xml_file_content.cpp:7 msgid "Vendor:" msgstr "" #: xml_file_content.cpp:9 msgid "Renderer:" msgstr "" #: xml_file_content.cpp:10 msgid "OpenGL Extensions" msgstr "" #: xml_file_content.cpp:11 msgid "DarkRadiant Modules" msgstr "" #: xml_file_content.cpp:1 msgid "wireframeBtn" msgstr "" #: xml_file_content.cpp:2 msgid "flatShadeBtn" msgstr "" #: xml_file_content.cpp:3 msgid "texturedBtn" msgstr "" #: xml_file_content.cpp:4 msgid "lightingBtn" msgstr "" #: xml_file_content.cpp:5 xml_file_content.cpp:1 msgid "startTimeButton" msgstr "" #: xml_file_content.cpp:6 xml_file_content.cpp:3 msgid "stopTimeButton" msgstr "" #: xml_file_content.cpp:7 msgid "clipPlaneInButton" msgstr "" #: xml_file_content.cpp:8 msgid "clipPlaneOutButton" msgstr "" #: xml_file_content.cpp:3 msgid "Command Arguments" msgstr "" #: xml_file_content.cpp:4 msgid "Command Properties" msgstr "" #: xml_file_content.cpp:5 msgid "Wait until finished" msgstr "" #: xml_file_content.cpp:1 msgid "Conversation Entities" msgstr "" #: xml_file_content.cpp:4 msgid "Conversations" msgstr "" #: xml_file_content.cpp:8 xml_file_content.cpp:7 msgid "Clear" msgstr "" #: xml_file_content.cpp:1 msgid "Properties" msgstr "" #: xml_file_content.cpp:3 msgid "Actors must be within talk distance" msgstr "" #: xml_file_content.cpp:4 msgid "Actors always face each other while talking" msgstr "" #: xml_file_content.cpp:5 msgid "Let this conversation play" msgstr "" #: xml_file_content.cpp:6 msgid "times at maximum" msgstr "" #: xml_file_content.cpp:7 msgid "Actors" msgstr "" #: xml_file_content.cpp:10 msgid "Commands" msgstr "" #: xml_file_content.cpp:13 xml_file_content.cpp:9 msgid "Move up" msgstr "" #: xml_file_content.cpp:14 xml_file_content.cpp:10 msgid "Move down" msgstr "" #: xml_file_content.cpp:3 msgid "Refresh" msgstr "" #: xml_file_content.cpp:5 msgid "Classname:" msgstr "" #: xml_file_content.cpp:6 msgid "Spawnarg:" msgstr "" #: xml_file_content.cpp:7 msgid "Argument:" msgstr "" #: xml_file_content.cpp:3 xml_file_content.cpp:68 msgid "View" msgstr "" #: xml_file_content.cpp:2 msgid "Rules" msgstr "" #: xml_file_content.cpp:7 msgid "" "Filter rules are applied in the shown order.\n" "\"Match\" is accepting regular expressions.\n" "\"Object\"-type filters can be used to match \"patch\" or \"brush\"." msgstr "" #: xml_file_content.cpp:1 msgid "Find:" msgstr "" #: xml_file_content.cpp:2 msgid "Replace:" msgstr "" #: xml_file_content.cpp:3 msgid "Search current selection only" msgstr "" #: xml_file_content.cpp:4 msgid "x shader(s) replaced." msgstr "" #: xml_file_content.cpp:5 msgid "Find and Replace" msgstr "" #: xml_file_content.cpp:6 xml_file_content.cpp:13 xml_file_content.cpp:88 msgid "Close" msgstr "" #: xml_file_content.cpp:1 msgid "Light Volume" msgstr "" #: xml_file_content.cpp:2 msgid "Omni" msgstr "" #: xml_file_content.cpp:3 msgid "Projected" msgstr "" #: xml_file_content.cpp:4 msgid "Use start/end" msgstr "" #: xml_file_content.cpp:6 xml_file_content.cpp:9 msgid "Options" msgstr "" #: xml_file_content.cpp:7 msgid "Parallel" msgstr "" #: xml_file_content.cpp:8 msgid "Do not cast shadows (fast)" msgstr "" #: xml_file_content.cpp:9 msgid "Skip specular lighting" msgstr "" #: xml_file_content.cpp:10 msgid "Skip diffuse lighting" msgstr "" #: xml_file_content.cpp:11 msgid "Light Texture" msgstr "" #: xml_file_content.cpp:1 msgid "Options:" msgstr "" #: xml_file_content.cpp:2 msgid "Surround with monsterclip brush" msgstr "" #: xml_file_content.cpp:2 msgid "Difficulty" msgstr "" #: xml_file_content.cpp:3 msgid "Iniital State" msgstr "" #: xml_file_content.cpp:4 xml_file_content.cpp:20 msgid "Flags" msgstr "" #: xml_file_content.cpp:5 msgid "Mandatory" msgstr "" #: xml_file_content.cpp:6 msgid "Ongoing" msgstr "" #: xml_file_content.cpp:7 xml_file_content.cpp:22 msgid "Irreversible" msgstr "" #: xml_file_content.cpp:9 msgid "Enabling Objectives" msgstr "" #: xml_file_content.cpp:10 msgid "Sucess Logic" msgstr "" #: xml_file_content.cpp:11 msgid "Failure Logic" msgstr "" #: xml_file_content.cpp:12 msgid "Completion Script" msgstr "" #: xml_file_content.cpp:13 msgid "Failure Script" msgstr "" #: xml_file_content.cpp:14 msgid "Completion Target" msgstr "" #: xml_file_content.cpp:15 msgid "Failure Target" msgstr "" #: xml_file_content.cpp:21 msgid "Satisfied at start" msgstr "" #: xml_file_content.cpp:23 msgid "Boolean NOT" msgstr "" #: xml_file_content.cpp:24 msgid "Player responsible" msgstr "" #: xml_file_content.cpp:25 msgid "&OK" msgstr "" #: xml_file_content.cpp:26 msgid "&Cancel" msgstr "" #: xml_file_content.cpp:1 msgid "Objective Conditions" msgstr "" #: xml_file_content.cpp:4 msgid "Condition" msgstr "" #: xml_file_content.cpp:5 msgid "Source Mission:" msgstr "" #: xml_file_content.cpp:6 msgid "Source Objective:" msgstr "" #: xml_file_content.cpp:7 msgid "Source Objective State:" msgstr "" #: xml_file_content.cpp:8 msgid "Target Objective:" msgstr "" #: xml_file_content.cpp:9 msgid "Action:" msgstr "" #: xml_file_content.cpp:10 msgid "Action Value:" msgstr "" #: xml_file_content.cpp:11 msgid "Sentence" msgstr "" #: xml_file_content.cpp:12 msgid "-" msgstr "" #: xml_file_content.cpp:1 msgid "Objective Entities" msgstr "" #: xml_file_content.cpp:4 msgid "Objectives" msgstr "" #: xml_file_content.cpp:11 msgid "Success Logic" msgstr "" #: xml_file_content.cpp:12 msgid "Edit Mission Success Logic" msgstr "" #: xml_file_content.cpp:1 msgid "Use background image" msgstr "" #: xml_file_content.cpp:2 msgid "Image file" msgstr "" #: xml_file_content.cpp:3 msgid "Transparency" msgstr "" #: xml_file_content.cpp:4 msgid "transparent" msgstr "" #: xml_file_content.cpp:5 msgid "opaque" msgstr "" #: xml_file_content.cpp:6 msgid "Image scale" msgstr "" #: xml_file_content.cpp:7 msgid "Horizontal offset" msgstr "" #: xml_file_content.cpp:8 msgid "Vertical offset" msgstr "" #: xml_file_content.cpp:10 msgid "Keep aspect ratio" msgstr "" #: xml_file_content.cpp:11 msgid "Zoom image with viewport" msgstr "" #: xml_file_content.cpp:12 msgid "Pan image with viewport" msgstr "" #: xml_file_content.cpp:1 msgid "Particle Definitions" msgstr "" #: xml_file_content.cpp:5 msgid "Particle Stages" msgstr "" #: xml_file_content.cpp:8 msgid "Toggle Visibility" msgstr "" #: xml_file_content.cpp:9 msgid "Up" msgstr "" #: xml_file_content.cpp:10 msgid "Down" msgstr "" #: xml_file_content.cpp:12 msgid "Depth Hack:" msgstr "" #: xml_file_content.cpp:13 msgid "Stage Settings" msgstr "" #: xml_file_content.cpp:16 msgid "Colour:" msgstr "" #: xml_file_content.cpp:17 msgid "Fade Colour:" msgstr "" #: xml_file_content.cpp:18 msgid "Use Entity Colour" msgstr "" #: xml_file_content.cpp:19 msgid "Fade In Fraction:" msgstr "" #: xml_file_content.cpp:20 msgid "Fade Out Fraction:" msgstr "" #: xml_file_content.cpp:21 msgid "Fade Index Fraction:" msgstr "" #: xml_file_content.cpp:22 msgid "Animation:" msgstr "" #: xml_file_content.cpp:23 msgid "Frames:" msgstr "" #: xml_file_content.cpp:24 msgid "Rate:" msgstr "" #: xml_file_content.cpp:25 msgid "FPS" msgstr "" #: xml_file_content.cpp:26 msgid "Count / Time" msgstr "" #: xml_file_content.cpp:27 msgid "Count:" msgstr "" #: xml_file_content.cpp:28 msgid "Duration / sec:" msgstr "" #: xml_file_content.cpp:29 msgid "Bunching:" msgstr "" #: xml_file_content.cpp:30 msgid "Cycles:" msgstr "" #: xml_file_content.cpp:31 msgid "Time Offset / sec:" msgstr "" #: xml_file_content.cpp:32 msgid "Dead Time / sec:" msgstr "" #: xml_file_content.cpp:33 msgid "Size / Speed" msgstr "" #: xml_file_content.cpp:34 msgid "Speed:" msgstr "" #: xml_file_content.cpp:35 xml_file_content.cpp:38 xml_file_content.cpp:41 #: xml_file_content.cpp:44 msgid "From:" msgstr "" #: xml_file_content.cpp:36 xml_file_content.cpp:39 xml_file_content.cpp:42 #: xml_file_content.cpp:45 msgid "To:" msgstr "" #: xml_file_content.cpp:37 msgid "Size:" msgstr "" #: xml_file_content.cpp:40 msgid "Rotation Speed:" msgstr "" #: xml_file_content.cpp:43 msgid "Aspect Ratio:" msgstr "" #: xml_file_content.cpp:46 msgid "Gravity:" msgstr "" #: xml_file_content.cpp:47 msgid "Use World Gravity" msgstr "" #: xml_file_content.cpp:48 msgid "Bounds Expansion:" msgstr "" #: xml_file_content.cpp:49 msgid "Distribution" msgstr "" #: xml_file_content.cpp:50 msgid "Shape:" msgstr "" #: xml_file_content.cpp:51 msgid "Rectangular" msgstr "" #: xml_file_content.cpp:52 msgid "Cylindric" msgstr "" #: xml_file_content.cpp:53 msgid "Spherical" msgstr "" #: xml_file_content.cpp:54 msgid "X Size:" msgstr "" #: xml_file_content.cpp:55 msgid "Y Size:" msgstr "" #: xml_file_content.cpp:56 msgid "Z Size:" msgstr "" #: xml_file_content.cpp:57 msgid "Ring Size:" msgstr "" #: xml_file_content.cpp:58 msgid "Offset:" msgstr "" #: xml_file_content.cpp:59 msgid "Randomness:" msgstr "" #: xml_file_content.cpp:60 msgid "Distribute Particles randomly within Volume" msgstr "" #: xml_file_content.cpp:61 msgid "Direction / Orientation" msgstr "" #: xml_file_content.cpp:62 msgid "Direction:" msgstr "" #: xml_file_content.cpp:63 msgid "Cone" msgstr "" #: xml_file_content.cpp:64 msgid "Outward" msgstr "" #: xml_file_content.cpp:65 msgid "Cone Angle:" msgstr "" #: xml_file_content.cpp:66 msgid "Upward Bias:" msgstr "" #: xml_file_content.cpp:67 msgid "Orientation:" msgstr "" #: xml_file_content.cpp:69 msgid "Aimed" msgstr "" #: xml_file_content.cpp:70 msgid "X" msgstr "" #: xml_file_content.cpp:71 msgid "Y" msgstr "" #: xml_file_content.cpp:72 msgid "Z" msgstr "" #: xml_file_content.cpp:73 msgid "Trails:" msgstr "" #: xml_file_content.cpp:74 msgid "Time:" msgstr "" #: xml_file_content.cpp:75 msgid "Initial Angle:" msgstr "" #: xml_file_content.cpp:76 msgid "Path" msgstr "" #: xml_file_content.cpp:77 msgid "Path Type:" msgstr "" #: xml_file_content.cpp:78 msgid "Standard" msgstr "" #: xml_file_content.cpp:79 msgid "Flies" msgstr "" #: xml_file_content.cpp:80 msgid "Helix" msgstr "" #: xml_file_content.cpp:81 msgid "Radial Speed:" msgstr "" #: xml_file_content.cpp:82 msgid "Axial Speed:" msgstr "" #: xml_file_content.cpp:83 msgid "Sphere Radius:" msgstr "" #: xml_file_content.cpp:84 msgid "Cylinder Size X:" msgstr "" #: xml_file_content.cpp:85 msgid "Cylinder Size Y:" msgstr "" #: xml_file_content.cpp:86 msgid "Cylinder Size Z:" msgstr "" #: xml_file_content.cpp:87 msgid "Note: changes will be written to the file ....." msgstr "" #: xml_file_content.cpp:1 msgid "Create simple Patch Mesh" msgstr "" #: xml_file_content.cpp:2 msgid "Width:" msgstr "" #: xml_file_content.cpp:3 msgid "Height:" msgstr "" #: xml_file_content.cpp:4 msgid "Remove selected Brush" msgstr "" #: xml_file_content.cpp:1 msgid "Patch Control Vertices" msgstr "" #: xml_file_content.cpp:2 msgid "Row:" msgstr "" #: xml_file_content.cpp:3 msgid "Column:" msgstr "" #: xml_file_content.cpp:4 msgid "Coordinates" msgstr "" #: xml_file_content.cpp:5 msgid "Patch Tesselation" msgstr "" #: xml_file_content.cpp:6 msgid "Fixed Subdivisions" msgstr "" #: xml_file_content.cpp:7 msgid "Horizontal:" msgstr "" #: xml_file_content.cpp:8 msgid "Vertical:" msgstr "" #: xml_file_content.cpp:1 msgid "Thicken selected Patches" msgstr "" #: xml_file_content.cpp:2 msgid "Extrude along Vertex Normals" msgstr "" #: xml_file_content.cpp:3 msgid "Extrude along X-Axis" msgstr "" #: xml_file_content.cpp:4 msgid "Extrude along Y-Axis" msgstr "" #: xml_file_content.cpp:5 msgid "Extrude along Z-Axis" msgstr "" #: xml_file_content.cpp:6 msgid "Thickness (units):" msgstr "" #: xml_file_content.cpp:7 msgid "Create Seams (\"side walls\")" msgstr "" #: xml_file_content.cpp:1 msgid "General Properties" msgstr "" #: xml_file_content.cpp:2 msgid "Inventory Name:" msgstr "" #: xml_file_content.cpp:3 msgid "XData Name:" msgstr "" #: xml_file_content.cpp:4 msgid "Number of Pages:" msgstr "" #: xml_file_content.cpp:5 msgid "Layout:" msgstr "" #: xml_file_content.cpp:6 msgid "One-sided" msgstr "" #: xml_file_content.cpp:7 msgid "Two-sided" msgstr "" #: xml_file_content.cpp:8 msgid "Pageturn Sound:" msgstr "" #: xml_file_content.cpp:9 msgid "Page Editing" msgstr "" #: xml_file_content.cpp:10 msgid "Insert Page" msgstr "" #: xml_file_content.cpp:11 msgid "Current Page:" msgstr "" #: xml_file_content.cpp:12 msgid "1" msgstr "" #: xml_file_content.cpp:13 msgid "Remove Page" msgstr "" #: xml_file_content.cpp:14 msgid "GUI Definition:" msgstr "" #: xml_file_content.cpp:17 msgid "Title" msgstr "" #: xml_file_content.cpp:18 msgid "Body" msgstr "" #: xml_file_content.cpp:19 msgid "Tools" msgstr "" #: xml_file_content.cpp:22 msgid "Save and Close" msgstr "" #: xml_file_content.cpp:2 msgid "pauseTimeButton" msgstr "" #: xml_file_content.cpp:4 msgid "prevButton" msgstr "" #: xml_file_content.cpp:5 msgid "nextButton" msgstr "" #: xml_file_content.cpp:1 msgid "Type:" msgstr "" #: xml_file_content.cpp:3 xml_file_content.cpp:22 msgid "Chance:" msgstr "" #: xml_file_content.cpp:4 msgid "Random Effects:" msgstr "" #: xml_file_content.cpp:3 msgid "Activation Timer:" msgstr "" #: xml_file_content.cpp:4 msgid "h" msgstr "" #: xml_file_content.cpp:5 msgid "m" msgstr "" #: xml_file_content.cpp:6 msgid "s" msgstr "" #: xml_file_content.cpp:7 xml_file_content.cpp:13 xml_file_content.cpp:15 msgid "ms" msgstr "" #: xml_file_content.cpp:8 msgid "Timer restarts after firing" msgstr "" #: xml_file_content.cpp:9 msgid "Timer reloads" msgstr "" #: xml_file_content.cpp:10 msgid "times" msgstr "" #: xml_file_content.cpp:11 msgid "Timer waits for start (when disabled: starts at spawn time)" msgstr "" #: xml_file_content.cpp:12 msgid "Time interval:" msgstr "" #: xml_file_content.cpp:14 msgid "Duration:" msgstr "" #: xml_file_content.cpp:16 msgid "Radius" msgstr "" #: xml_file_content.cpp:17 msgid "Use bounds" msgstr "" #: xml_file_content.cpp:18 msgid "Radius changes over time to:" msgstr "" #: xml_file_content.cpp:19 msgid "Magnitude:" msgstr "" #: xml_file_content.cpp:20 msgid "Falloff Exponent:" msgstr "" #: xml_file_content.cpp:21 msgid "Max Fire Count:" msgstr "" #: xml_file_content.cpp:23 msgid "Velocity:" msgstr "" #: xml_file_content.cpp:24 msgid "Bounds:" msgstr "" #: xml_file_content.cpp:25 msgid "Min:" msgstr "" #: xml_file_content.cpp:26 msgid "Max:" msgstr "" DarkRadiant-2.0.2/install/i18n/de/000077500000000000000000000000001245424655700165325ustar00rootroot00000000000000DarkRadiant-2.0.2/install/i18n/de/LC_MESSAGES/000077500000000000000000000000001245424655700203175ustar00rootroot00000000000000DarkRadiant-2.0.2/install/i18n/de/LC_MESSAGES/darkradiant.mo000066400000000000000000002744441245424655700231570ustar00rootroot00000000000000/ _~ ~~~~6~&6G Ydu    5 IWCqԀ܀ $ 0;BHOU[ap ȁӁف #? R ^l r |  ƂTQ9'(փ}B}Ä ؄'  .<K_(s  ɅӅ  !3:KQ Zh~+#Ն ن  #-38A PZ j u ʇ# $> cn!u҈ .AT] dn  7‰  :O^e mz Ɋ Њ ڊnbk| Ջ ܋ * ?M]#l)"݌'% < F R ^hpw  ؍" !- =IZl~ ;8*.+Y8;=+86dD:;=W1(Α-N%6t(9Ԓ4$C*hy ) JkR5H~B9ݕ' ?MUg Ӗ  .@ Q ] j x җ*; JWg) Ҙ ܘW,˙љ *= FPb t   Úښ 3#7 M[l1 қޛ !)2*J)u.؜)$&N,u'3ʝ  %6 NZj Şܞ 4BY t̟" 05(Enw Ǡ7Ԡ " =J\q šϡաݡ "->QY ky #Ȣ +FYt ѣ ݣ# , 2=O iw #פ% +' S`g(&'ҥ<7 <"Il q };  ) 9CIRZ`e y ǧ4; C PZ!j-Ψ ֨" )?S 7L_h {  ͪ  $!F]| 9ޫ % @N_|¬Ƭˬ Ѭެ5!Jl ŭܭ &ASexʮ`hw  ů ɯ֯ );AG]m Ȱذ 1?FLRb37ڱ+?HOR[a q | Ų̲Ҳڲ%"+>GOU\csz  ³&̳  &5 G S ]h pzA~9   '9 LZ i t, ǵ ҵ!#Ea ն6 DP hrz*ͷܷ  4:CL[t| Ƹ Ӹ߸ $(.6KRZ_ z ù ޹ : G Ua r| ú޺  -A Yd u  һ ݻ  9Uu  ǼѼ ټ  $0F\ dpv ߽- 3 AM\l^' . 8 BL_ g!uD,ܿ ( AKQ b mx    *;C_h m{   .8JYnL: 05,f  m +z/A3q+ "6HK_t B ! )3<Len    0 M Zh & +;N ^k 6J]m   U'N}#  % ,9L!g $ ,:A^ nz  D &2: AM^s  +<Q)g  "2Pbi z  $'LUd t~     -7@O ^(j#  +5Kahx   .=Pf!{ ! )7 Wcs %7Jax2 :HOU [i n {  3BV jx $3Om     6(Cl8 $ ,6= L V`px~  (9?U Zh w  #);AFM` p} 8)%.O'~K(#!?/aRv$[i/0J,{04(~E  ;'cTi    ,; C0M ~ .   8$C];0,,;.h.?'>FI iv{    . : G Ta q { % ? `fv }    !6?FN`c lw} 3e_aip  A,5=FM Ubd iuw z    !6 L Zh  OU]m~   %7 HVk K! ) 3> ^hn    '- =GYl    %. 6 CP_ac$y^WUj19T)?Wr.  )4FMS [f} /"(KTh    % 0; ?IQa y "#.(,-Zkt =X my   @+ 4 AK]u    #.4 , : @ LY k x '-&<ck't    +48K[.n+ -DYm <85 6CKzO>?UKSG5O}> `7wB8B+<nE@92 =l   -g 0  sr E , cH > 1   8 D .[    %  ) /? HSk-J^} '9N0]  ( 7 39 @JRZar  $9ATI7 C \hq2&&E%l'"8/HF8D  "*:Mhx/#%9_u  4E%[;  7PEi4/J `mv    &6PYp   :"X{  -%>dj}( ($'C0k2 ( -4 .b %   )  !!,!=!PP! !&! !'! """$"-"4" ="H"_"q"""" ""###<#V#]# e#s#!|#%#C#$ $)$#9$]$f${$$$$$%% %&'& 9&C& J&T& k&x&&& & & &&0&'&/'V' k'u'~'B'''!' (*(<(%P(v((((((( (( ) )#3)W)+u)&)))) *!*$5*&Z*9**** ++++=+P+d+9,@,R, k,w,,,, ,,, , , ,, - -,-2-:-U-#f-!----&-..(+. T. b.o.t.z... ..D.R/V/^/w/ /// / // / / / / 0000%0-040:0B0I0O0V0-\00000 000 00 011 1121D1^1n1'11 1 11111 2 2*2 92 C2O2?S2F22 2 2223343J3a3 q32333 33334 *4 44U4t44444455?+5 k5w5 5555 5556!6:6 A6 N6(Z66 6 6 666 666 67 #7.7E7L7 [7 g7r7{77 77777 7777777 8 8*83;8-o8 8"888 9 9 9)9 <9H9O9X9 x99*9 999 9 9::+: 3:@:!E: g: t::: ::: :::!:$;*9;d;;;;; ; ; ;; ; <<<</<O<_<w<<<<<<< <<<5=,==j==== ====%>j,>>>>>>>?? (?6? G?!U?Iw?3??/@ 4@>@E@ V@ b@m@u@ @@ @@@@$@ "A -A 7A!BAdA ~A,AAAAAAAA BB !B ,B9B @BLB PB]BoBxB B BBBBBCU#CPyCC;CQ!DsD DD DD D D DDE2EE<nFBF2F !G-GCGYGpGG&GGGGG H "H0H AHGMHHHHH HH H H H&I 'I3IHI]I tII I III I I I I!I,I*J:JJJaJhJJ(JJJ5JJ KK*K9KKKZK)kKK)KK!KL)LELbLhL}LLLLLLLM M M M(M1M CMMMbM}M^MRM'JNrNNN NNNNNNN O'O;ORO dO oO }O O"OOOOO)O P4P CP PP^P"sP PPEP Q $Q /Q9Q@QOQcQQQQQQQR!R 6R@R^RnRRR+RRR S S-"SPSnS SSSSSS TT/TGT NT [TfTuT&|TTTTT'TUU8U RU\UcUjU qUUUUUUUUU UUUVV,VCV SVaV{VVMV*VW:W UW cWnWuW#W WWW WWWX0XBXTXhXzXXXXXXY%YEY*eYYYYYYZ Z +Z5Z>Z+PZ|ZZZZZZ Z [%[>[S[i[[[[[[[\)\"A\d\\\\\\\\\\] ]'] .] ;] G] T]b]t]]"]] ]-]^%^?^S^j^ ^^^^ ^^^/_L_f_!v_$___ _ ____` ```0` K` V`a`~``7```.a 2a =a Ja Vadaaa aa aa aaaaa bbb$8b]bqbbbbbbbbbbc+c AcNc`c{ccc ccc c c c c dddd 9d GdSded#ydd ddd dd@e/?f4of,fbf*4g1_g%g5gZgHh+h i i iii=j9EjOj:j k&(k}Ok kkkkl llN8ll[lll mm9m?m HmRm Wm bmnmmm m'm m mmm m n n=nNn mnxn|n n nBn\nC6o?zo6o7o8)p1bp9pp8p q *q.4qcqsqxq"qqqq qqr rr !r-r\Vf:h0"p@G(i6l?[W}.9K)*:dqxxw^s)<O!%6U\hI\a*&TwJ$w9?~]%;ja^?'H  @imC@ {oJE} PU ^Mha?},TBI/D b\a#Iz5*GoEdfW-f;0g,KWL>5un1 I/n+&QM#W|zb-.nV(CLwY ieoXJ\*$ryUk|mDMF^X`Y&'wKAGu 9L7Fb&Uy@!R06ZV OrQ=EH45bO %{g8jem@0]1hjf{$4c'}HQ#! ZzwYry'OS9 \) d7c=Q|_7.1tuvr{3"A,fo|K-29%qK_[ '^N #kxE_p1@%+<lNM.  `B,VXCU7u:3n"qRDe->8~vX>2ilj2[eax;bzXpOV`b=TWD$+YTtriV!g _P7>;QB8+`$32 _ kg &<:_}4HS%X/Nt3O-3t<<Yg ~]]h;>6y(n*vcTU)u dLG'( .PBze:EWZ4m:kvlS "~6C0/N#]S+GpD?sqgnIj$,}C=Ke`|HBk[1Rp!M F&=dQqfcyC"r,y v)J)^m82Jqp/xs0 xm (overridden) Y: Z: %d entities replaced.%d faces were not suitable (had more than 4 vertices).%d loot%d loot in gold%d loot in goods%d loot in jewels%d minutes%d models loaded%d models replaced.%d of "%s"%d seconds%d shader(s) replaced.%d shaders replaced.%d spawnargs replaced.%s AI of %s%s AI of team %s%s AI of type %s%s at [ %s ]%s has been defined in:%s of spawnclass %s%s of type %s%s successfully imported.%s%s already exists in another path. XData will be stored in %s%s!&About&Bind selected entities&Cancel&Center&Connect selected entities&Copy&Curve&Deactivate all Filters&Down Floor&Duplicate&Edges&Edit&Faces&File&Grid&Help&Import map...&Invert selection&Light Inspector&New Map&OK&Open...&Paste&Patch&Patch Inspector&Pointfile&Redo&Reload Models&Revert group to worldspawn&Save&Save selected as Map...&Save selected as prefab...&Surface Inspector&Switch off&Texture Tool&Undo&Up Floor&Vertices&XY 100%&XY Zoom In&XY Zoom Out(Line %d): %s-1Error: File not found.Note: You'll need to restart DarkRadiant after changing the language setting.Note: You will have to restart DarkRadiant for the changes to take effect.?A Scheme with that name already exists.A certain page of a readable is reached.A custom component requires no specifiers, the state of this component is manually controlled (i.e. by scripts or triggers).A single entity must be selected to edit Stim/Response properties.AIAI can be flatfootedAI can drownAI doesn't think outside the player PVSAI finds a bodyAI finds an itemAI is alertedAI is civilianAI is immune to GasAI is immune to KOsAI is immune to KOs at high alert levelsAI is killedAI is knocked outAI:AbilitiesAbkhazianAbout DarkRadiantActionAction Value:Action:ActivateActivate &all FiltersActivation Timer:ActiveActive View NameActorActor %dActor %d (%s)Actor (click to edit)ActorsActors always face each other while talkingActors must be within talk distanceAddAdd Stim TypeAdd new EffectAdd propertyAdd property...Add to Layer...AfrikaansAimedAkanAlbanianAlign Texture:All FilesAll Files (*.*)All LevelsAll skinsAltAmharicAmount:Analysing GuisAnimal Patrol ModeAnimationAnimation:Any AI of specified typeAny AI on specified teamAny AI with specified combat statusAny entity of specified classAny entity with SDK-level spawnclassAppearanceAppendAppend 2 columns at the beginningAppend 2 columns at the endAppend 2 rows at the beginningAppend 2 rows at the endAppend Curve Control PointAppend PageAppends a control point to the selected curvesApply to selectionApply...ArabicAragoneseArbitrary TransformationArgument:ArgumentsArmenianAspect Ratio:AssameseAssignAt least one brush must be selected for this operation.AttributeAudio AcuityAuto LoopAutosave Interval (in minutes)Available AnimationsAvailable SetsAvaricAvestanAxial Speed:AymaraAzerbaijaniB&rushBackground Image...Background imageBambaraBashkirBasqueBehaviourBelarusianBengaliBevelBeware that other entities might still be using this stim type. Do you really want to delete this custom stim?Big DotsBihari languagesBislamaBodyBody is shoulderableBody:Boolean NOTBosnianBoth fit values must be > 0.BottomBottom LeftBottom RightBounds Expansion:Bounds:BretonBrowse custom path:Browse mod resourcesBrush Number:Brush Size InfoBrush VerticesBrushDef3Parser: invalid token '%s'BrushDef3ParserQuake4: invalid token '%s'BrushDefParser: invalid token '%s'BrushesBrushes:Brushes: %lu Patches: %lu Entities: %luBuild date: %sBuild date: 2014-08-04BulgarianBulge PatchBulge patchBunching:BurmeseButtonC&lear selectionCOMPLETECSGCSG &MergeCSG &SubtractCSG MergeCSG Merge: No brushes selected.CSG SubtractCSG Subtract: No brushes selected.CameraCamera BackgroundCamera IconCamera PositionCamera ViewCan greet othersCan light TorchesCan operate DoorsCan operate ElevatorsCan operate Switch LightsCan searchCan't append curve point - no entities with curve selected.Can't convert curves - no entities with curves selected.Can't copy Shader. Couldn't retrieve face.Can't copy Shader. Couldn't retrieve patch.Can't copy Shader. Please select a single face or patch.Can't insert curve points - must be in vertex editing mode.Can't insert curve points - no entities with curves selected.Can't paste Texture Coordinates from faces.Can't paste Texture Coordinates from patches to faces.Can't paste Texture Coordinates. Target patch dimensions must match.Can't paste shader to entire brush. Target is not a brush.Can't remove curve points - must be in vertex editing mode.Can't remove curve points - no entities with curves selected.CancelCannot add, filter with same name already exists.Cannot bulge patch. No patches selected.Cannot change classname of worldspawn entity.Cannot create a selection set, there is nothing selected in the current scene.Cannot create bevel-cap, patch must have a width of 3.Cannot create caps, no patches selected.Cannot create cylinder-cap, patch must have a width of 9.Cannot create end-cap, patch must have a width of 5.Cannot create layer with empty name.Cannot create particle with an empty name.Cannot create selection setCannot merge entities, the selection must consist of func_* entities only. (The first selected entity will be preserved.)Cannot open file for reading: %sCannot open file for writing: %sCannot reparent primitives to entity. Please select at least one brush/patch and exactly one entity.(The entity has to be selected last.)Cannot run Readable Editor on this selection. Please select a single XData entity.Cannot save particle, it has not been registered yet.Cannot scale by zero value.Cannot stitch patch textures. Exactly 2 patches must be selected.Cannot stitch textures. Could not cast nodes to patches.Cannot thicken patch. Nothing selected.Cap SelectionCatalanCaulk shader nameCenter Pivot when scaling facesCentral KhmerChamorroChance:Change Mandatory FlagChange Objective StateChange VisibilityChange viewsChechenChichewaChineseChoose AI HeadChoose AI Vocal SetChoose AI head...Choose DirectoryChoose FileChoose ModelChoose PrefabChoose ShaderChoose SkinChoose Vocal Set...Choose a Gui Definition...Choose a file...Choose an XData Definition...Choose entity class...Choose model...Choose particle...Choose particlesChoose skin...Choose soundChoose sound...Choose target entity...Choose textureChoose texture...ChuvashClamp texture thumbnails to constant sizeClassnameClassname:ClearClear Selection SetsClear mandatory flagClick here to assignClick to select all in layer, hold SHIFT to deselect, hold CTRL to set as active layer.Clip SelectionClipperClipper tool uses caulk textureClock interval:CloseClose without savingColourColour:Colours...Column:ColumnsCommandCommand ArgumentsCommand PropertiesCommandsCompletedCompletion ScriptCompletion TargetComponentsConditionCondition affecting objective %dConeCone Angle:Cone...Confirm Layer DeletionConsoleConsole ViewConsult the import summary for further information.Conversation EditorConversation EntitiesConversationsConversations...Convert NURBS <-> CatmullRomConvert the selected curve (NURBS <-> CatmullRom)Convert to func_staticCoordinatesCopyCopy Colour SchemeCopy ShaderCopy SpawnargCopy shader nameCornishCorsicanCould not create patch.Could not determine map format of file: %sCould not open output streams for writingCould not open pointfile: %sCould not read map file: %sCould not recognise map version number format.Could not remove the file %sCould not rename layer, please try again.Could not rename the temporary file %sCould not set Region: XY Top View not found.Could not set Region: nothing selected.Could not set Region: please select a single Brush.CountCount / TimeCount:Create BevelCreate Cap PatchCreate CatmullRom CurveCreate ConeCreate CylinderCreate Decal PatchesCreate Decals for selected FacesCreate Dense CylinderCreate End capCreate Flat Patch MeshCreate Layer...Create NURBS CurveCreate Seams ("side walls")Create Simple Patch MeshCreate SphereCreate Square CylinderCreate Very Dense CylinderCreate entityCreate entity...Create light...Create model...Create player start hereCreate simple Patch MeshCreate speaker...Creates a NURBS curveCreating a new XData definition...CreeCritical HealthCritical: Cannot find selected entities.CroatianCrossesCtrlCubic clip the camera viewCurrent Page:Custom FolderCustom StimCustom StimsCustom properties defined for this entity class, if anyCustom scriptCustom script queried periodicallyCut SpawnargCycle Cap TextureCycle Face SelectionCycle SelectionCycles:CylinderCylinder Size X:Cylinder Size Y:Cylinder Size Z:CylindricCzechD&eleteDanishDarkRadiant ModulesDarkRadiant PreferencesDarkRadiant x.y.zDeactivateDead Time / sec:Decrease Grid SizeDefaultDefault Grid SizeDefault LogicDefault Scale:Default texture scaleDefined inDefined in:Definition:DeleteDelete 2 columns from the beginningDelete 2 columns from the endDelete 2 rows from the beginningDelete 2 rows from the endDelete Custom StimDelete all selection sets?Delete on left SideDelete on right SideDelete propertyDelete this layerDelete whole PageDepth Hack:DescriptionDeselect elements using this shaderDetails (double-click to edit)Diff.DifficultyDifficulty EditorDifficulty-specific LogicDifficulty...Direction / OrientationDirection:Disable Alert Idle StateDisable Windows Desktop CompositionDisable sound for this session.Discrete movement (non-freelook mode)Distance:Distribute Particles randomly within VolumeDistributionDivehiDo not cast shadows (fast)Do you really want to delete this layer?Do you want to correct these settings?Do you want to open the import summary?Do you want to save the changes you made to the particle %s?DotsDotted LinesDouble click row to edit a bindingDownDrag CameraDrag ViewDrag-Selection BoxDrag-create BrushDrag-resize entities symmetrically (leave origin unchanged)DrunkDrunk Acuity FactorDuplicateDuplicated XData definitionsDuration / sec:Duration:DutchDzongkhaE&ntityE&xitEditEdit Colour SchemesEdit CommandEdit ConversationEdit FilterEdit Filters...Edit Mission LogicEdit Mission Success LogicEdit Mouse BindingsEdit ObjectiveEdit Objective ConditionsEdit Response EffectEffectEffect:Empty FilterEn&titiesEnable AutosaveEnable Texture Lock (for Brushes)Enable far-clip plane (hides distant objects)Enabling ObjectivesEnd CapEngine PathEngine path "%1%" does not exist. EnglishEnter Layer NameEnter NameEnter Number of SidesEnter Particle NameEnter a name and hit ENTER to save a set. Select an item from the dropdown list to restore the selection. Hold SHIFT when opening the dropdown list and selecting the item to de-select the set.Enter a name for the new scheme:Enter new Layer NameEnter new ShortcutEntitiesEntities (default)Entities:EntityEntity %dEntity %d, Primitive %dEntity ClassEntity Class TreeEntity Class Tree...Entity InspectorEntity KeyEntity ListEntity Number:Entity:Error saving particle definition: %sError: File not found.Error: eclass pointer invalid.Errors occurred:EsperantoEstonianEweExactly two entities must be selected for this operation.Exception occurred: Exit DarkRadiantExpand selection to all SiblingsExport Selection as OBJ...Export regionExport selectionExtrude along Vertex NormalsExtrude along X-AxisExtrude along Y-AxisExtrude along Z-AxisFAILEDFPSFaceFacesFade Colour:Fade In Fraction:Fade Index Fraction:Fade Out Fraction:Failed parsing entity %d: %sFailed to import %s.Failed to load gui definition %s.Failed to open %s for saving.Failure LogicFailure Logic:Failure ScriptFailure TargetFailure during import.Failure opening map file: %sFailure reading map file: %s %sFailure reading map from clipboard: %sFalloff Exponent:Far Clip Plane InFar Clip Plane OutFaroeseFijianFileFile is write-protected: %sFile not readableFilter SettingsFilter rules are applied in the shown order. "Match" is accepting regular expressions. "Object"-type filters can be used to match "patch" or "brush".FiltersFind & ReplaceFind & Replace ShaderFind BrushFind and ReplaceFind brush...Find:FinnishFitFit Texture:Fixed SubdivisionsFixup FileFixup MapFixup Map...Fixup ResultsFixup cancelledFixup in progressFlagsFliesFlip Clip OrientationFlip HorizontalFlip Selection Horiz (S-Axis)Flip Selection Vertical (T-Axis)Flip Texture:Flip VerticalFloor selectionFocus camera on selected entityFrames:Free Model RotationFreelook mode can be toggledFreemove ModeFrenchFrom:FulahGUI Definition:GUI Page Index out of bounds.Gaelic; Scottish GaelicGalicianGameGameManager: No game type selected, can't continue.GameManager: No valid game files found, can't continue.GandaGeneral PropertiesGeneral Properties:GeorgianGermanGoGravity:GreekGrid BackgroundGrid BlockGrid MajorGrid MinorGrid TextGrid0.125Grid0.25Grid0.5Grid1Grid128Grid16Grid2Grid256Grid32Grid4Grid64Grid8Group identifier (component-specific)GuaraniGui PathGui import summaryGujaratiHaitianHausaHead: HealthHealth / CombatHebrewHeight:HelixHereroHide DeselectedHide SelectedHide UnusedHide allHide/ShowHigher Selection Priority for EntitiesHindiHiri MotuHollowHoriz. Scale:Horiz. Shift:Horizontal FOVHorizontal offsetHorizontal:HungarianINCOMPLETEINVALIDIcelandicIdoIf Objective %d in Mission %d is in state '%s' do the following: If you don't save, changes from the last %s will be lost.IgboIgnoreImage fileImage mapImage scaleImport &prefab...Import definition?Import failedImport failed:Import mapImporting...Incorrect map version: required %f, found %fIncrease Grid SizeIndexIndonesianIniital StateInitial Angle:Initialising Module: %sInitialising ModulesInsertInsert 2 Columns at the beginningInsert 2 Columns at the endInsert 2 Rows at the beginningInsert 2 Rows at the endInsert Curve Control PointsInsert PageInsert on left SideInsert on right SideInsert prefab...Insert whole PageInserts a curve control point before the selected onesInterlinguaInterlingue; OccidentalInuktitutInupiaqInvalid SettingsInventory Name:InvertInvert mouse vertical axis (freelook mode)Inverted BevelInverted EndcapIrishIrreversibleItalianItem is in info_locationItem is in locationItem:JapaneseJavaneseJump to ObjectKalaallisut; GreenlandicKannadaKanuriKashmiriKazakhKeep aspect ratioKeyKeyboard Shortcuts...KikuyuKill target:KinyarwandaKirghizKnockout target:KomiKongoKoreanKuanyamaKurdishLanguageLaoLatinLatvianLay down to the leftLayersLayout:LeftLet this conversation playLevel 1: EasyLevel 2: HardLevel 3: ExpertLight Start/End (deselected)Light Start/End (selected)Light TextureLight Vertices (deselected)Light Vertices (normal)Light Vertices (selected)Light VolumeLight VolumesLight flagsLight propertiesLimburganLinesLingalaList visible nodes onlyLithuanianLoad in Textures viewLoad media tree at startupLoading ShadersLoading entity %d Loading mapLoading modelsLoading texturesLoading textures...Loading, please wait...Loading...Location Entity:Location:Logic for Difficulty Level %dLuba-KatangaLuxembourgishM&apMD5 Animation ViewerMacedonianMagnitude:Major Grid StyleMake &HollowMake &RoomMake DetailMake Objective %d invisibleMake Objective %d mandatoryMake Objective %d not mandatoryMake Objective %d visibleMake RoomMake StructuralMake VisportalMalagasyMalayMalayalamMalteseMandatoryManipulateManxMaoriMapMap InfoMap Info File Version invalidMap info...Map loading cancelledMap writing cancelledMarathiMarshalleseMatchMatching skinsMaterialMaterial surfacesMaterial:MatrixMax Fire Count:Max Snapshot Folder size (MB)Max shadername lengthMax. Interleave DistanceMax:Maximum Chase Mouse SpeedMediaMedia BrowserMelee RangeMerge EntitiesMerge SelectionMerge selected EntitiesMerging failed, because the length of the definition to be overwritten could not be retrieved.Min. Interleave DistanceMin:Minimum Alert Level:Minor Grid StyleMirrorMirror &XMirror &YMirror &ZMission ObjectivesMo&difyMod (fs_game)Mod Base (fs_game_base, optional)Mod Base path not defined, neither is Mod path. Using Engine path...Mod Base path not defined. Using Mod path...Mod Base/xdataMod path not defined. Using Base path...Mod/xdataModelModel DefinitionModel PathModel nameModelsModels used:ModifierModify Texture:MongolianMore Dotted LinesMore cylindersMouse Bindings...Mousewheel IncrementMove DownMove UpMove downMove player start hereMove to Layer...Move upMovement Speed (game units)MultiplyNameName ConflictName of single entityName:Named Skins used:NaturalNauruNavajoNdebele, NorthNdebele, SouthNdongaNepaliNewNew ActorNew ConversationNew MapNew XY viewNew objective %dNewFilterNext (XY, XZ, YZ)Next leak spotNo brushes selected.No faces selected.No game type selected.No import summary available. An XData definition has to be imported first...No import summary available. Browse Gui Definitions first.No patches selected.No rules defined for this filter, cannot insert.No rules defined for this filter. Delete it?No scripts availableNo shaderNo specifierNoise:NoneNormaliseNorthern SamiNorwegianNot a suitable Gui Definition!Note: Please beware that deleting custom stims may affect other entities as well. So check before you delete.Note: This shortcut is already assigned to:Note: be careful when using the CSG tool, as you might end up with an unnecessary number of tiny brushes and/or leaks. This popup will not be shown again.Note: changes will be written to the file .....Note: changes will be written to the file %sNothing must be selected for model creationNudgeNudge DownNudge LeftNudge RightNudge UpNumber of Pages:Number of most recently used filesNumber of sides: OKObject is destroyedObjective ConditionsObjective EntitiesObjectivesObjectives...OccitanOffset cloned objects by one grid unit to the right and downwards.Offset:OjibwaOmniOne-Sided Readable GuisOne-sidedOngoingOpen FileOpen MapOpen a map fileOpen last map on startupOpen mapOpenGL ExtensionsOpenGL PropertiesOperation cancelled by userOptimizationOptionsOptions:Orientation:OriyaOromoOrthographicOssetianOther MaterialsOutwardOverall (component-specific)Overwrite existing shortcut?Page EditingPage Editing:Page Index out of bounds.Page Number:Pageturn Sound:PaliPan image with viewportPanjabiParallelParsed invalid value '%s' for key '%s'Parsing material file %sParticleParticle DefinitionsParticle EditorParticle Editor...Particle StagesPaste ShaderPaste Shader (Natural)Paste Shader NamePaste Shader NaturalPaste Shader ProjectedPaste Shader to all Brush FacesPaste SpawnargPaste Texture CoordinatesPaste to CameraPatchPatch Control VerticesPatch Corner VertexPatch Inner VertexPatch InspectorPatch Subdivide ThresholdPatch TesselationPatch ThickenPatchesPatches:PathPath Type:PatrolPersianPick ShaderPlayPlayer pickpockets AIPlayer possesses itemPlayer responsiblePlease rename your XData definition, so that it is stored under a different filename.Please select a new button/modifier combination by clicking on the area below.Please specify an XData name first!Point CameraPolishPolysPortuguesePre&ferences...PrefabPrepend PagePrevious leak spotPrimitive #%d: parse errorPrimitive #%d: parse exception %sPrism...Problems during importProcessing line %d...Processing...ProjectedPropertiesPropertyPushtoPut caps on the current patchPython Script InputQuechuaRadial Speed:RadiusRadius changes over time to:Random Effects:Randomness:Rate:Re-disperseReadable EditorReadable is closed.Readable is opened.Readable:Really clear all bindings and reload them from the default settings?Recently used MapsRectangularRefreshRegionReload DefsReload MaterialsReload Particle DefsReload ParticlesReload Readable GuisReload S&kinsReload ScriptsReload Selected ModelsReloading DefsReloading GuisReloading ModelsRemoveRemove Curve Control PointsRemove PageRemove Stim TypeRemove from Layer...Remove selected BrushRemoves the selected curve control pointsRename LayerRename this layerRenderer:Renderer: %sRep&arent PrimitivesReparent Primitives to &WorldspawnReparent primitivesReplace:Rescan Prefab FoldersReset all mappings to defaultReset to default?ResizeResponse EffectsResponsesRevert part to worldspawnRevert to worldspawnRightRing Size:RomanianRomanshRotateRotate Models independentlyRotate XRotate YRotate ZRotate and scale...Rotate func_* Entities around originRotationRotation SpeedRotation Speed:Rotation:Row:RowsRulesRun ScriptRundiRussianS/RSamoanSangoSanskritSardinianSatisfied at startSaveSave &as...Save © as...Save ®ion...Save ChangesSave Copy As...Save FileSave MapSave SnapshotsSave and CloseSave as ObjSave changes to map "%s" before closing?Save selected as Collision Model...Save selected as PrefabSave the current mapSaving MapScaleScriptScript Function:Search current selection onlySearchingSearching for ModulesSeek in Media BrowserSelectSelect &Game...Select &touchingSelect .prt fileSelect ChildrenSelect EdgesSelect EntitiesSelect EntitySelect FacesSelect Group PartsSelect Related ItemsSelect VerticesSelect Vocal Set...Select a Game:Select all of typeSelect complete t&allSelect complete tallSelect elements using this shaderSelect i&nsideSelect insideSelect new Binding: %sSelect touchingSelected BrushSelected Brush (Camera)Selection Set: SentenceSerbianSet InvisibleSet State on Objective %d to %sSet VisibleSet from &BrushSet from &XY viewSet from Se&lectionSet mandatory flagSet state to %sSettingSettingsSettings/AutosaveSettings/CameraSettings/ClipperSettings/CompatibilitySettings/GridSettings/LanguageSettings/Map FilesSettings/Media BrowserSettings/Multi MonitorSettings/OrthoviewSettings/PatchSettings/PrimitivesSettings/Readable EditorSettings/Texture BrowserSettings/Undo SystemShaderShader:ShaderClipboard is empty.ShaderClipboard: %sShadersShaders used:Shape:ShiftShonaShortcut ListShowShow &AnglesShow &NamesShow AxesShow BlocksShow C&oordinatesShow CoordinatesShow CrosshairsShow Entity Angle ArrowShow Entity NamesShow GridShow Gui import summaryShow Shader DefinitionShow Size InfoShow Texture FilterShow Window OutlineShow WorkzoneShow allShow camera toolbarShow coordinate axesShow duplicated definitionsShow helpShow hiddenShow inherited propertiesShow last XData import summaryShow size infoShow wireframeShow/hide all light volumesShow/hide all speaker volumesSichuan Yi; NuosuSindhiSinhalaSitting AngleSize / SpeedSize:SkinSkin nameSkin: SkinsSkip diffuse lightingSkip specular lightingSlovakSlovenianSnap selected to gridSnap selection to gridSnap to GridSnapshot folder (relative to map folder)Solid selection boxesSomaliSorry. Patch is not suitable for this kind of operation.Sotho, SouthernSound FilesSoundshaderSource Mission:Source Objective State:Source Objective:SpanishSpawnarg:Speed:Sphere Radius:Sphere...SphericalSplit SelectionSquaresStageStage SettingsStandardStartStart DarkRadiant on monitorStart in Alert Idle StateStart sittingStart sleepingStart the Gui Browser?StateStep:Stim/Response EditorStim/Response...StimsStitch Patch TexturesStopSuccess LogicSuccess Logic:Sucess LogicSundaneseSurface InspectorSurround with monsterclipSurround with monsterclip brushSwahiliSwatiSwedishSwitching to default Gui...TagalogTahitianTajikTamilTarget Objective:TatarTeamTeluguTexture BackgroundTexture BrowserTexture LockTexture OperationsTexture PropertiesTexture Thumbnail ScaleTexture ToolTexture lockTexture scrollbarTexturesThaiThe Dark Mod (www.thedarkmod.com) This product contains software technology from id Software, Inc. ('id Technology'). id Technology 2000 id Software,Inc. DarkRadiant is based on the GPL version of GtkRadiant. http://darkradiant.sourceforge.net/The definition %s already exists. Should it be imported?The fs_game folder "%1%" does not exist. The fs_game_base folder "%1%" does not exist. The name %s already exists in this map!The requested definition has been found in multiple Files. Choose the file:The specified Definition does not exist.The specified file can't be opened.The specified file doesn't exist.The specified gui definition is not a readable.The specified gui definition is not suitable for the currently chosen page-layout.The specified shortcut is already assigned to %s Overwrite the current setting and assign this shortcut to %s instead?There are no duplicated definitions!These logics override the standard logic for the given difficulty level if the logic string is non-empty.Thicken Selected PatchesThicken selected PatchesThickness (units):This Is Not Dromed WarningThis command is not available in component mode.This condition is not valid or complete yet.This default setting is overridden, cannot edit.This is the standard logic for all difficulty levelsThis name already exists.This name is already in use.This will delete all set definitions. The actual map objects will not be affected by this step. Continue with that operation?TibetanTigrinyaTime Offset / sec:Time interval:Time:Timer reloadsTimer restarts after firingTimer waits for start (when disabled: starts at spawn time)TitleTo avoid duplicated XData definitions the current definition has been renamed to %s.To:Toggle GridToggle VisibilityToggle layer visibilityTongaToolToolsTopTop LeftTop RightTotal polysTotal verticesTrails:TranslateTranslate Manipulator always constrained to AxisTransparencyTransposeTsongaTswanaTurkishTurkmenTwiTwo entities are within a radius of each otherTwo-Sided Readable GuisTwo-sidedTypeType:UighurUkrainianUnable to create Objective Entity: class '%s' not found.Unable to create Objective Entity: classes not defined in registry.Unable to create conversation Entity: class '%s' not found.Unable to create entity %s, no brushes selected.Unable to create light, classname not found.Unable to create model, classname not found.Unable to create speaker, classname not found.Unable to parse map version (parse exception).Unable to setup the preview, could not find the entity class %sUndo Queue SizeUniform texture thumbnail size (pixels)UnknownUpUpdate Views on Camera MovementUpward Bias:UrduUse Entity ColourUse World GravityUse background imageUse boundsUse start/endUzbekV&iewValueVelocity:VendaVendor:Vendor: %sVerbose logging.Version:Version: %d.%d.%dVersion: %sVert. Scale:Vert. Shift:Vertical FOVVertical offsetVertical:VietnameseViewView FilterView Shader DefinitionView chases Mouse Cursor during DragsVisibleVisual AcuityVocal Set: VolapuekWaitWait until finishedWalloonWarning: Camera not within region, can't set info_player_start.WelshWestern FrisianWidth:Window LayoutWolofWorkzoneWriting mapWriting node %dXX Size:X-AxisX-Axis Rotate:X-Axis Scale:X: XData Name:XData Storage FolderXData has been renamed.XData import summaryXY (Top)XY TopXY ViewXYView CrosshairsXZXZ FrontXdata PathXhosaYY Size:Y-AxisY-Axis Rotate:Y-Axis Scale:YZYZ SideYiddishYorubaYou didn't choose a Gui. Using the default Gui now.You have imported an XData definition that is contained in a PK4, which can't be accessed for saving.ZZ Size:Z-AxisZ-Axis Rotate:Z-Axis Scale:ZhuangZoom ViewZoom image with viewportZulu_FiltersclipPlaneInButtonclipPlaneOutButtoncreateNodeForEntity(): cannot create entity for NULL entityclass.disabledenabledentitiesentityentity flatShadeBtnhhidelightingBtnmmsnextButtonnoopaquepauseTimeButtonprevButtonsseconds:showstartTimeButtonstopTimeButtontexturedBtntimestimes at maximumtransparentunnamed.mapwireframeBtnwxWidgets Propertiesx shader(s) replaced.x-axis Mirrorx-axis Rotatex: %6.1lf y: %6.1lf z: %6.1lfy-axis Mirrory-axis Rotateyesz-axis Mirrorz-axis RotateProject-Id-Version: DarkRadiant Report-Msgid-Bugs-To: greebo@angua.at POT-Creation-Date: 2014-12-31 06:19+0100 PO-Revision-Date: 2014-12-31 06:23+0100 Last-Translator: greebo Language-Team: The Dark Mod MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-KeywordsList: _;gettext;gettext_noop X-Poedit-Basepath: . X-Poedit-Language: German X-Poedit-SearchPath-0: ..\..\..\..\radiant X-Poedit-SearchPath-1: ..\..\..\..\libs X-Poedit-SearchPath-2: ..\..\..\..\plugins (außer Kraft)Y:Z:%d Entities ersetzt.%d ungeeignete Faces wurden nicht bearbeitet (Faces mit mehr als 4 Eckpunkten).%d Loot%d Loot in Gold%d Loot in Waren%d Loot in Edelsteinen%d Minuten%d Modelle geladen%d Modelle ersetzt.%d "%s"%d Sekunden%d Shader ersetzt.%d Shader ersetzt.%d Wertepaare ersetzt.%s AI von %s%s AI vom Team %s%s AI vom Typ %s%s bei [ %s ]%s ist definiert in:%s der Spawnklasse %s%s vom Typ %s%s erfolgreich importiert%s%s existiert bereits unter anderem Pfad. XData wird in %s%s gespeichert!Über DarkRadiantAusgewählte Entities verknüpfenAbbrechenZentrierenAusgewählte Entities verbinden&KopierenKurve&Deaktiviere alle FilterEin Stockwerk tiefer&DuplizierenEdgesBearbeitenFaces&DateiRasterHilfe&Map importierenAuswahl umkehrenLight Inspector&Neue MapOK&Öffnen&EinfügenPatchPatch InspectorPointfileWiede&rherstellen&Modelle neu ladenGruppe zu Worldspawn umwandeln&Speichern&Auswahl als Map speichern...Auswahl als &Prefab speichern...Surface InspectorAusschaltenTextur-WerkzeugRückgängigEin Stockwerk höherVerticesXY 100%XY EinzoomenXY Auszoomen(Zeile %d): %s-1Fehler: Datei nicht gefunden.Hinweis: Du musst DarkRadiant neu starten, damit die neue Spracheinstellung aktiv wird.Hinweis: Du musst DarkRadiant neu starten, damit die Änderungen wirksam werden.?Es existiert bereits ein Schema mit diesem Namen.Eine bestimmte Seite eines Schriftstücks wird angezeigt.Eine benutzerdefinierte Komponente benötigt keine Spezifikatoren, der Zustand der Komponente wird anderweitig gesteuert (z.B. durch Skript oder einen Trigger).Um Stim/Response-Eigenschaften zu editieren muss genau eine Entity ausgewählt sein.AIAI kann kalt erwischt werdenAI kann ertrinkenAI außerhalb des Spieler-PVS denkt nichtAI findet einen KörperAI findet einen GegenstandAI wird alarmiertAI ist ZivilistAI ist immun gegen GasAI ist immun gegen KOsAI ist gegen KOs immun (auf hohem Alert-Level)AI wird getötetAI wird KO geschlagenAI:FähigkeitenAbchasischÜber DarkRadiantAktionWert:Aktion:AktivierenAktiviere &alle FilterAktivierungs-Timer:AktivName der aktiven AnsichtAkteurAkteur %dAkteur %d (%s)Akteur (zum Bearbeiten klicken)AkteureAkteure sehen sich beim Sprechen gegenseitig anAkteur müssen in Sprechweite seinAddierenStimtyp hinzufügenNeuen Effekt hinzufügenEigenschaft hinzufügenEigenschaft hinzufügen...Zu Layer hinzufügen...AfrikaansAusgerichtetAkanAlbanischTextur ausrichten:Alle DateienAlle Dateien (*.*)All StufenAlle SkinsAltAmharischAnzahl:Analysiere GUIsPatrol-Modus für TiereAnimationAnimation:Irgendeine AI des angegebenen TypsIrgendeine AI des angegebenen TeamsIrgendeine AI mit dem angegebenen KampfzustandIrgendeine Entity der angegebenen KlasseIrgendeine Entity der angegebenen SDK KlasseErscheinungsbildAnfügenZwei Spalten am Anfang anfügenZwei Spalten am Ende anfügenZwei Zeilen am Anfang anfügenZwei Zeilen am Ende anfügenKurvenkontrollpunkt anfügenSeite anfügenEinen Kurvenkontrollpunkt zur ausgewählten Kurve hinzufügenAuf Auswahl anwendenAnwenden...ArabischAragonesischFreie TransformationArgument:ArgumenteArmenischSeitenverhältnis:AssamesischZuweisenFür diese Operation muss mindestens ein Brush ausgewählt sein.AttributHörschärfeAuto LoopSpeicherintervallVerfügbare AnimationenVerfügbare Sätze:AwarischAvestischAxiale Geschw.:AymaraAserbaidschanischBrushHintergrundbild...HintergrundbildBambaraBaschkirischBaskischVerhaltenBelarussischBengalischBogenBeachte, dass andere Entities diesen Stimtyp noch verwenden könnten. Möchtest du diesen benutzerdefinierten Stim wirklich löschen?Große PunkteBihariBislamaText:Kann geschultert werdenText:NegierenBosnischBeide Fit-Werte müssen größer als 0 sein.UntenUnten linksUnten rechtsBounds Expansion:Boundingbox:BretonischPfad durchsuchen:Mod-Ressourcen durchsuchenBrushnummer:Brush-GrößeninformationBrush-VerticesBrushDef3Parser: ungültiges Token '%s'BrushDef3ParserQuake4: ungültiges Token '%s'BrushDefParser: Ungültiges Token '%s'BrushesBrushes:Brushes: %lu Patches: %lu Entities: %luKompilierungsdatum: %sKompilierungsdatum: %sBulgarischPatch auswölbenPatch auswölbenHäufung:BurmesischSchaltflächeAuswahl aufhebenERFÜLLTCSGCSG ZusammenfügenCSG SubtraktionCSG ZusammenfügenCSG Zusammenfügen: Keine Brushes ausgewählt.CSG SubtraktionCSG Subtraktion: Keine Brushes ausgewählt.KameraKamera-HintergrundKamera-SymbolKamera-PositionKameraKann andere grüßenKann Fackeln anzündenKann Türen bedienenKann Lifte bedienenKann Lichtschalter betätigenKann suchenKann Kontrollpunkt nicht anfügen, keine Kurven ausgewählt.Kann Kurve nicht konvertieren, keine Kurven ausgewählt.Konnte Face nicht casten, Shader wurde nicht kopiert.Konnte Patch nicht casten, Shader wurde nicht kopiert.Shader nicht kopiert: bitte ein einzelnes Face oder einen Patch auswählen.Kann Kontrollpunkte nicht einfügen, bitte vorher in den Vertex-Modus wechseln.Kann Kontrollpunkte nicht einfügen, keine Kurven ausgewählt.Es ist nicht möglich, Texturkoordinaten von Faces zu kopieren.Es ist nicht möglich, Texturkoordinaten von Patches auf Faces zu kopieren.Kann Texturkoordinaten nicht kopieren, da die Patch-Dimensionen nicht passend sind.Kann Shader nicht auf gesamten Brush anwenden, das Ziel ist kein Brush.Kann Kontrollpunkte nicht entfernen, bitte vorher in den Vertex-Modus wechseln.Kann Kontrollpunkte nicht entfernen, keine Kurven ausgewählt.AbbrechenKann diesen Filter nicht hinzufügen, ein weiterer Filter mit demselben Namen existiert bereits.Kann Patch nicht auswölben: keine Patches ausgewählt.Der Klassenname der Worldspawn-Entity darf nicht geändert werden.Kann Auswahlsatz nicht anlegen, keine Auswahl vorhanden.Kann keine Bevel-Caps erzeugen, Patch muss eine Breite von 3 habenKann keine Caps erzeugen, da keine Patches ausgewählt sind.Kann keine Zylinder-Caps erzeugen, Patch muss eine Breite von 9 habenKann keine End-Caps erzeugen, Patch muss eine Breite von 5 habenEs ist nicht möglich eine Ebene ohne Namen zu erstellen.Es ist nicht möglich einen Partikel ohne Namen zu erstellen.Kann Auswahlsatz nicht erstellenKann Entities nicht zusammenführen, die Auswahl muss ausschließlich aus func_*-Entities bestehen. (Die zuerst ausgewählte Entity bleibt dabei erhalten.)Kann die Datei nicht im Lesemodus öffnen: %sKann die Datei nicht im Schreibmodus öffnen: %sKann die ausgewählten Primitive nicht neu zuordnen. Bitte zumindest einen Brush/Patch sowie eine Entity auswählen. (Die Entity muss als letztes ausgewählt worden sein.)Schriftstück-Editor kann für diese Auswahl nicht ausgeführt werden. Bitte eine einzelne XData-Entity auswählen.Kann Partikeldefinition nicht speichern, sie wurde nicht registriert.Kann nicht mit 0 skalieren.Kann Texturen nicht zusammenheften, für diese Operation müssten genau 2 Patches ausgewählt sein.Kann Texturen nicht zusammenheften. Konnte Nodes nicht casten.Nichts ausgewählt: kann Patch nicht extrudieren.Cap für Auswahl erstellenKatalanischName des Caulk ShadersPivotpunkt beim Skalieren von Faces zentrierenKhmerChamorroWahrscheinlichkeit:Setze die 'obligatorisch'-EigenschaftSetze Status eines MissionszielsSetze Misionsziel auf sichtbar/unsichtbarAnsicht wechselnTschetschenischChichewaChinesischKopf für AI auswählenSprachsatz für AI auswählenKopf für AI auswählen...Verzeichnis auswählenDatei auswählenModell auswählenPrefab wählenShader auswählenSkin auswählenSprachsatz für AI auswählenGUI-Definition auswählen...Datei auswählen...XData-Definition auswählen...Entityklasse auswählenModell auswählen...Partikel auswählen...Partikel auswählenSkin auswählen...Sound auswählenSound auswählen...Ziel-Entity auswählen...Textur auswählenTextur auswählen...TschuwaschischTextur-Vorschaubilder mit fixer Größe anzeigenKlassennameKlassenname:LöschenAuswahlsätze löschenNicht obligatorisch machenHier klicken um neue Belegung zuzuweisenKlicken um alles in der Ebene auszuwählen, UMSCHALT beim Klicken gedrückt halten um Auswahl aufzuheben, STRG halten um die Ebene als aktive Ebene festzulegen.Auswahl clippenClipperClipper verwendet Caulk-Textur für neu erzeugte Faces.Zeitintervall:SchließenSchließen ohne zu speichernFarbeFarbe:Farben...Spalte:SpaltenBefehlBefehlsargumenteBefehlseigenschaftenBefehleFertigSkript bei ErfüllungTarget bei ErfüllungKomponentenBedingungBedingung betreffend Missionsziel %dKegelÖffnungswinkel:Kegel...Ebenenlöschung bestätigenKonsoleKonsoleBitte sieh in der Import-Zusammenfassung nach, um weitere Informationen zu erhalten.Konversations-EditorKonversations-EntitiesKonversationenKonversationen...Konversion NURBS <-> CatmullRomKonvertiert die ausgewählte Kurve NURBS <-> CatmullRomIn func_static umwandelnKoordinatenKopierenFarbschema kopierenShader kopierenWertepaar kopierenKopiere ShadernamenKornischKorsischKonnte Patch nicht erzeugen.Konnte das Format der Mapdatei nicht bestimmen: %sFehler beim Öffnen der Output-StreamsKonnte das Pointfile nicht öffnen: %sKonnte die Mapdatei nicht öffnen: %sNicht erkennbares VersionsnummernformatKann die Datei nicht entfernen: %sKonnte Ebene nicht umbenennen, bitte nochmals versuchen.Konnte die temporäre Datei nicht entfernen: %sKonnte Region nicht festlegen, weil die XY-Ansicht nicht gefunden wurde.Kann keine Region festlegen: keine Elemente ausgewählt.Kann Region nicht festlegen: bitte einen einzelnen Brush auswählen.AnzahlAnzahl / ZeitAnzahl:Bogen erstellenPatch-Cap erzeugenCatmullRom-Kurve erstellenKegel erstellenZylinder erstellenDecal-Patches erstellenDecal-Patches für ausgewählte Faces erstellenErstelle "dichten" ZylinderEndcap erstellenNeuer flacher PatchNeuer Layer...NURBS-Kurve erstellenUmschließen (erzeuge "Seitenwände")Neuer einfacher PatchKugel erzeugenErstelle quadratischen ZylinderErstelle "sehr dichten" ZylinderNeue EntityNeue Entity...Neues Licht...Neues Modell...Erzeuge Spielerstartpunkt hierNeuer einfacher PatchNeuer Speaker...NURBS-Kurve erstellenErzeuge eine neue XData-Definition...CreeKritischer GesundheitswertKritischer Fehler: kann ausgewählte Entities nicht finden.KroatischKreuzeStrgFar-Clip-Ebene verwendenAktuelle Seite:Benutzerdefinierter OrdnerBenutzerdefinierter StimBenutzerdefinierte StimsBenutzerdefinierte Eigenschaften dieser Entityklasse, falls definiertBenutzerdefiniertes SkriptBenutzerdefiniertes Skript wird periodisch abgefragtWertepaar ausschneidenCap-Textur durchrotierenFace-Auswahl durchrotierenAuswahl durchrotierenDurchläufe:ZylinderZylindergröße X:Zylindergröße Y:Zylindergröße Z:ZylindrischTschechisch&LöschenDänischDarkRadiant ModuleDarkRadiant EinstellungenDarkRadiant x.y.zDeaktivierenTotzeit / Sek.:Rastergröße verkleinernStandardStandard-RastergrößeStandard-LogikStandardskalierung:Standard-TexturskalierungDefiniert inDefiniert in:Definition:LöschenZwei Spalten am Anfang löschenZwei Spalten am Ende löschenZwei Zeilen am Anfang löschenZwei Spalten am Ende löschenBenutzerdefinierten Stim entfernenAlle Auswahlsätze löschen?Links löschenRechts löschenEigenschaft entfernenDiese Ebene löschenGanze Seite löschenDepth Hack:BeschreibungAlle Elemente mit diesem Shader deselektierenDetails (doppelklicken zum Editieren)Schw.SchwierigkeitsgradSchwierigkeitsstufen-EditorLogik für bestimmte SchwierigkeitsstufeSchwierigkeitsstufe...Richtung / OrientierungRichtung:"Alarmierter" Idle-Zustand nicht erlaubtDesktopgestaltung deaktivierenKeine Soundwiedergabe in dieser SessionSchrittweise Bewegung (freier Umsichtsmodus aus)Distanz:Verteile Polygone zufällig im angegebenen VolumenVerteilungDhivehiWirft keine Schatten (schnell).Willst Du diese Ebene wirklich löschen?Möchtest Du diese Einstellungen korrigieren?Willst Du die Import-Zusammenfassung anzeigen?Änderungen am Partikel %s speichern?PunkteGepunktete LinienDoppelklicken um eine Belegung zu ändernNach untenKamera verschiebenAnsicht verschiebenAuswahl-RechteckErzeuge neue BrushSymmetrisches Verändern von Entities beim Ziehen (Ursprung bleibt unverändert)BetrunkenSinnesschärfen-Faktor bei TrunkenheitDuplizierenMehrfach vorkommende XData-DefinitionenDauer / Sek.:Dauer:DänischDzongkhaEntityB&eendenBearbeitenFarbschemas bearbeitenBefehl bearbeitenKonversation bearbeitenFilter bearbeitenFilter bearbeiten...Missions-Logik bearbeitenLogik für Erfüllung bearbeitenMaustastenbelegungen ändernZiel editieren:Missionsziel-Bedingungen bearbeitenResponse-Effekt editierenEffektEffekt:Leerer FilterEntitiesAktiviere automatisches SpeichernTextur-Lock aktivieren (für Brushes)Aktiviere hintere Clip-Ebene (ferne Objekte werden nicht angezeigt)Vorausgesetzte ZieleDoppelbogenPfad zur EngineEngine-Pfad "%1%" existiert nicht. EnglischEbenennamen eingebenNamen eingebenAnzahl der Seiten festlegenPartikelnamen eingebenNamen eingaben und mit der EINGABETASTE bestätigen um einen neuen Satz anzulegen. Ein Element in der Liste auswählen um die entsprechende Auswahl wiederherzustellen. UMSCHALTTASTE gedrückt halten um die Auswahl der entsprechenden Elemente aufzuheben.Namen für das neue Schema eingeben:Neuen Ebenennamen eingebenNeue Tastenkombination festlegenEntitiesStandard-EntitiesEntities:EntityEntity %dEntity %d, Primitiv %dEntityklasseEntity-KlassenbaumEntity-Klassenbaum...Entity InspectorEntity KeyEntity-ListeEntitynummer:Entity:Fehler beim Speichern der Partikeldefinition: %sFehler: Datei nicht gefunden.Fehler: Entityklassenzeiger ungültig.Aufgetretene Fehler:EsperantoEstnischEweFür diese Operation müssen genau zwei Entities ausgewählt sein.Ausnahmefehler:DarkRadiant beendenAuswahl auf Geschwister ausweitenAuswahl als OBJ exportieren...Exportiere RegionAuswahl exportierenExtrusion entlang der Vertex-NormalenExtrusion entlang der X-AchseExtrusion entlang der Y-AchseExtrusion entlang der Z-AchseFEHLGESCHLAGENFPSFaceFacesFade-FarbeFade In Fraction:Fade Index Fraction:Fade Out Fraction:Fehler beim Parsen der Entity %d %sImport von %s fehlgeschlagen.Laden der GUI-Definition %s fehlgeschlagen.Konnte %s nicht zum Speichern öffnen.Logik für FehlschlagLogik für Fehlschlag:Skript bei FehlschlagTarget bei FehlschlagFehler beim Import.Fehler beim Öffnen der Mapdatei: %sFehler beim Lesen der Mapdatei: %s %sFehler beim Lesen der Mapdatei aus der Zwischenablage: %sFalloff-Exponent:Entfernte Clip-Ebene heranEntfernte Clip-Ebene hinausFäröischFidschiDateiDatei ist schreibgeschützt: %sDatei nicht lesbarFiltereinstellungenFilterregeln werden in der angegebenen Reihenfolge angewandt. Das Ausdruck-Feld akzeptiert reguläre Ausdrücke (RegEx). Für Filter vom Typ Objekt können die Schlüsselwörter patch oder brush verwendet werden.FilterSuchen & ErsetzenShader Suchen & ErsetzenSuche BrushSuchen & ErsetzenBrush suchen...Suchen:FinnischEinpassenTexture einpassen:Fixe TesselierungFixup-DateiMap-FixupMap-Fixup...Fixup ErgebnisseFixup abgebrochenFixup läuftFlagsFliegenClip-Orientierung umkehrenHorizonal kippenAuswahl Horizontal kippen (S-Achse)Auswahl vertikal kippen (T-Achse)Textur kippen:Vertikal kippenAuswahl auf den Boden setzenKamera auf ausgewählte Entity richtenFrames:Freie ModelldrehungUmschalten von/zu Umsichtsmodus erlaubenUmsichtsmodusFranzösischVon:FulahGUI-Definition:GUI-Seitenindex ungültigGälischGalicischeSpielGameManager: kein Spieltyp ausgewählt, kann daher nicht fortfahren.GameManager: keine gültigen Spieldateien (.game) gefunden, kann nicht fortfahren.LugandaAllgemeine EigenschaftenAllgemeine Eigenschaften:GeorgischDeutschLosSchwerkraft:GriechischRasterhintergrundRasterblockGrobes RasterFeines RasterRastertextGrid0.125Grid0.25Grid0.5Grid1Grid128Grid16Grid2Grid256Grid32Grid4Grid64Grid8Gruppenidentifizierer (komponentenspezifisch)GuaraníGUI PfadGUI ImportzusammenfassungGujaratiHaitianischHausaKopf:GesundheitGesundheit / KampfHebräischHöhe:HelixHereroNicht ausgewähltes verbergenAuswahl verbergenNicht Benutztes verbergenAlle ausblendenVerbergen/ZeigenHöhere Auswahlpriorität für EntitiesHindiHiri MotuAushöhlenHoriz. Skalierung:Horiz. Verschiebung:Horizontaler FOVHorizontale VerschiebungHorizontal:UngarischNICHT ERFÜLLTUNGÜLTIGIsländischIdoWenn das Missionsziel %d in Mission Nr. %d den Status '%s' hat:Wenn Du nicht sicherst, gehen die Änderungen der letzten %s verloren.IgboIgnorierenBilddateiBildBildskalierung&Prefab importierenDefinition importieren?Import fehlgeschlagenImport fehlgeschlagen:Map importierenImportiere...Ungültige Map-Version: erwartet: %f, gefunden: %fRastergröße vergrößernIndexIndonesischAnfangszustandAnfangswinkel:Initialisiere Modul: %sInitialisiere ModuleEinfügenZwei Spalten am Anfang einfügenZwei Spalten am Ende einfügenZwei Zeilen am Anfang einfügenZwei Zeilen am Ende einfügenKurvenkontrollpunkt einfügenSeite einfügenLinks einfügenRechts einfügenPrefab einfügen...Ganze Seite einfügenFügt einen Kurvenkontrollpunkt vor dem ausgewählten Punkt einInterlinguaOccidental-InterlingueInuktitutInupiaqUngültige EinstellungenName im Inventory:InvertierenInvertiere vertikale Mausachse (freier Umsichtsmodus)Invertierter BogenInvertierter DoppelbogenIrischIrreversibelItalienischGegenstand ist am/im Ort (info_location)Gegenstand ist am/im OrtGegenstand:JapanischJavanischZu Objekt springenGrönländischKanaresischKanuriKashmiriKasachischSeitenverhältnis beibehaltenSchlüsselTastenkombinationen...KikuyuTötungs-Ziel:KinyarwandaKirgisischKO-Ziel:KomiKongoKoreanischKwanyamaKurdischSpracheLaoLateinischLettischNach links hinlegenEbenenLayout:LinksDiese Konversation wird maximalLevel 1: LeichtLevel 1: HartLevel 1: ExperteLicht-Anfangs- und End-Vertices (nicht ausgewählt)Licht-Anfangs- und End-Vertices (ausgewählt)LichttexturLicht-Vertices (nicht ausgewählt)Licht-Vertices (normal)Licht-Vertices (ausgewählt)LichtvoluminaLichtvoluminaLicht-FlagsLichteigenschaftenLimburgischLinienLingálaNur sichtbare Elemente anzeigenLitauischIn Texturbrowser ladenLade Medienbaum während des StartvorgangsLade ShaderLade Entity %d Lade MapLade ModelleLade TexturenLade Texturen...Lade, bitte warten...Lade...Orts-Entity:Ort:Logik für Schwierigkeitsstufe %dLuba-KatangaLuxemburgischMapMD5-AnimationsvorschauMazedonischStärke:Hauptgitter-StilAushöhlenRaum erstellenAls Detail markierenMissionsziel %d unsichtbar machenMissionsziel %d obligatorisch machenMissionsziel %d nicht obligatorisch machenMissionsziel %d sichtbar machenRaum erstellenAls Struktur markierenErzeuge VisportalMalagasyMalaiischMalayalamMaltesischObgligatorisches ZielManipulierenManx-GälischMaoriMapMap-InformationUngültige Map Info File VersonMap-InformationLadevorgang abgebrochenSchreibvorgang abgebrochenMarathiMarshallesischAusdruckPassende SkinsMaterialAnzahl OberflächenMaterial:MatrixMax. Auslösevorgänge:Maximale Grösse des Schnappschussverzeichnisses (MB)Maximal dargestellte Länge für ShadernamenMax. Interleaving DistanzMax:Maximale FolgegeschwindigkeitMediaMediabrowserReichweite für HandwaffenEntities zusammenführenAuswahl zusammenführenAusgewählte Entities zusammenführenFehler beim Zusammenführen. Die Länge der zu überschreibenden Definition konnte nicht abgerufen werden.Min. Interleaving DistanzMin:Minimale Alarmierungs-StufeNebengitter-StilSpiegelnSpiegeln um X-AchseSpiegeln um Y-AchseSpiegeln um Z-AchseMissionszieleKomponentenmodusMod (fs_game)Mod Base (fs_game_base, optional)Mod-Base-Pfad nicht definiert, Mod-Pfad auch nicht, verwende Base-Pfad...Mod-Base-Pfad nicht definiert, verwende Mod-Pfad...Mod Base/xdataMod-Pfad nicht definiert, verwende Base-Pfad...Mod/xdataModellModel-DefinitionModell-PfadModellnameModelleBenutzte Modelle:HilfstastenTexturierung bearbeiten:MongolischStärker gepunktete LinienMehr ZylinderartenMaustastenbelegungen...Bildlaufgeschwindgkeit beim ScrollenNach untenNach obenNach untenVerschiebe Spielerstartpunkt hierNach Layer verschieben...Nach obenBewegungsgeschwindigkeit (in Spieleinheiten)MultiplizierenNameNamenskonfliktName der EntityName:Benutzte Skins:Natürliche SkalaNauruischNavajoIsiNdebeleSüd-NdebeleNdongaNepalesischNeuNeuer AkteurNeue KonversationNeue MapNeue XY-AnsichtNeues Ziel %dNeuerFilterNächste Ansicht (XY, XZ, YZ)Nächster Leak-SpotKeine Brushes ausgewählt.Keine Faces ausgewählt.Kein Spieltyp ausgewählt.Die Importzusammenfassung ist erst nach dem Import einer XData-Definition verfügbar.Die Importzusammenfassung ist erst nach dem Öffnen des GUI-Browsers verfügbar.Keine Patches ausgewählt.Kann diesen Filter nicht einfügen, keine Regeln definiert.Für diesen Filter sind keine Regeln definiert, soll der Filter gelöscht werden?Keine Skripts verfügbarKein ShaderKein SpezifikatorAmplitude:KeineNormalisierenNordsamischNorwegischKeine geeignete GUI-Definition!Hinweis: Bitte beachte, dass sich das Löschen benutzerdefinierter Stims auf andere Entities auswirken kann. Gehe deshalb sorgfältig vor.Hinweis: diese Kombination ist bereits zugeordnet:Hinweis: das CSG Werkzeug sollte vorsichtig benutzt werden, da es unnötig viele sehr kleine Brushes und/oder Lecks erzeugen kann. Dieser Hinweis wird nicht wieder erscheinen.Hinweis: alle Änderungen werden in den File ... geschriebenHinweis: alle Änderungen werden in den File %s geschriebenFür diese Operation darf nichts ausgewählt sein.VerschiebenVerschiebe nach untenVerschiebe nach linksVerschiebe nach rechtsVerschiebe nach obenAnzahl der Seiten:Anzahl der zuletzt geöffneten DateienAnzahl der Seitenflächen:OKObjekt wird zerstörtMissionsziel-BedingungenMissionsziel-EntitiesMissionszieleMissionsziele...OkzitanischDuplizierte Objekte um eine Rastereinheit nach rechts unten verschiebenAbstand:OjibweOmniEinseitige Schriftstück-GUIsEinseitigLaufendDatei öffnenMap öffnenMap öffnenLade zuletzt geöffnete Map beim StartMap öffnenOpenGL ErweiterungenOpenGL EigenschaftenAbbruch durch BenutzerOptimierungOptionenOptionen:Orientierung:OriyaOromo2D-AnsichtOssetischAndere ShaderAuswärts Insgesamt (komponentenspezifisch)Bestehende Tastenkombination überschreiben?TextbearbeitungTextbearbeitungSeitenindex ungültig.Seite:Sound beim Umblättern:PaliBild zusammen mit 2D-Ansicht verschiebenPanjabiParallelUngültigen Wert '%s' für Schlüssel '%s' eingelesenLade Material Datei %sPartikelPartikeldefinitionenPartikeleditorPartikeleditor...PartikelstufenShader einfügenShader einfügen (Natürliche Skalierung)Shadernamen einfügenShader einfügen (Natürliche Skalierung)Shader einfügen (Projektion)Shader einfügen (gesamter Brush)Wertepaar einfügenTexturkoordinaten einfügenBei Kameraposition einfügenPatchPatch-KontrollpunktePatch-Vertices (Ecke)Patch-Vertices (innen)Patch InspectorPatch-TesselierungsgrenzwertPatch-TesselierungPatch-ExtrusionPatchesPatches:PfadPfad-Typ:PatroullierenPersischShader auswählenAbspielenSpieler bestiehlt AISpieler besitzt GegenstandSpieler ist verantwortlichBitte benenne Deine XData-Definition um, so dass sie unter einem neuen Namen gespeichert wird.Bitte eine neue Maus-/Tastenkombination durch Klick auf die Fläche unten wählen.Bitte zuerst einen XData-Namen angeben!Kamera ausrichtenPolnischPolygonePortugiesischEinstellungen...PrefabSeite voranstellenVorheriger Leak-SpotPrimitiv #%d: ParserfehlerPrimitiv #%d: Parserfehler %sPrisma...Fehler beim Import.Verarbeite Zeile %d...Vorgang läuft...ProjektionEigenschaftenEigenschaftPaschtunischCap-Patches für Auswahl erstellenPython SkripteingabeQuechuaRadiale Geschwindigkeit:RadiusRadius verändert sich über die Zeit zu:Zufällige Effekte:Zufälligkeit:Abspielrate:Neu verteilenSchriftstück-EditorEin Schriftstück wird geschlossenEin Schriftstück wird geöffnetSchriftstück:Wirklich alle Belegungen auf die Standardeinstellungen zurücksetzen?Zuletzt geöffnete MapsRechteckigNeu ladenRegionDefs neu ladenMaterials neu ladenPartikel-Definitionen neu ladenPartikel neu ladenSchriftstück-GUIs neu ladenS&kins neu ladenSkripts neu ladenAusgewählte Modelle neu ladenNeuladen der DefinitionenNeuladen der GUIsNeuladen der ModelleEntfernenKurvenkontrollpunkt entfernenSeite EntfernenStimtyp entfernenVon Layer entfernen...Entferne die ausgewählte BrushAusgewählte Kurvenkontrollpunkte entfernenEbene umbenennenDiese Ebene umbenennenRenderer:Renderer: %sPrimitive neu zuordnen (Elternknoten ändern)Primitive Worldspawn zuordnenPrimitive neu zuordnenErsetzen:Prefab-Ordner neu durchsuchenAlle Belegungen zurücksetzenAuf Standard zurücksetzen?Größe ändernResponse-EffekteResponsesTeil zu Worldspawn umwandelnZu Worldspawn umwandelnRechtsRinggröße:RumänischRätoromanischDrehenModelle unabhängig voneinander drehenDrehe um X-AchseDrehe um Y-AchseDrehe um Z-AchseDrehen und skalieren...Drehe func_*-Entities um deren UrsprungRotationRotationsgeschwindigkeitRotationsgeschwindigkeit:Rotation:Reihe:ZeilenRegelnStarte SkriptKirundiRussischS/RSamoischSangoSanskritSardischBei Missionsstart erfülltSpeichernSpeichern &als...&Kopie speichern als...&Region speichernÄnderungen SpeichernSpeichere Kopie als...Datei speichernMap speichernSpeichere SchnappschüsseSpeichern & SchließenAls OBJ speichernSollen die Änderungen an der Map "%s" vor dem Schließen gespeichert werden?_Auswahl als Kollisionsmodell speichern...Auswahl als Prefab speichernDie aktuelle Map speichernSpeichere MapSkalierungSkriptSkriptfunktion:Durchsuche nur die aktuelle AuswahlDurchsuchenSuche nach ModulenIn Media Browser zeigenAuswählenSpiel auswählen...Berührtes auswählenEine .prt-Datei auswählenKinder auswählenKanten auswählenEntities auswählenEntity auswählenFaces auswählenTeile einer Gruppe auswähenVerbundene Objekte auswählenVertices auswählenSprachsatz auswählen...Spiel auswählen:Alles vom selben Typ auswählenInneres auswählen (Projektion)Inneres auswählen (Projektion)Alle Elemente mit diesem Shader auswählenInneres auswählenInneres auswählenNeue Tastenbelegung wählen: %sBerührtes auswählenAusgewählter BrushAusgewählter Brush (Kamera)Auswahlsatz: In WortenSerbischUnsichtbar machenSetze den Status von Missionsziel %d auf %sSichtbar machenÜber Brush festlegenÜber XY-Ansicht festlegenÜber Auswahl festlegenObligatorisch machenSetze Status auf %sEinstellungEinstellungenEinstellungen/Automatisches SpeichernEinstellungen/KameraEinstellungen/ClipperEinstellungen/KompatibilitätEinstellungen/RasterEinstellungen/SpracheEinstellungen/MapEinstellungen/MediabrowserEinstellungen/MultimonitorEinstellungen/2D-AnsichtEinstellungen/PatchesEinstellungen/PrimitiveEinstellungen/Schriftstück-EditorEinstellungen/TexturbrowserEinstellungen/UndoShaderShader:Shader-Zwischenablage ist leer.Shader-Zwischenablage: %sShaderBenutzte Shader:Form:UmschaltShonaListe der TastenkombinationenZeigenZeige WinkelZeige NamenZeige AchsenZeige BlöckeZeige KoordinatenZeige KoordinatenZeige FadenkreuzZeige Richtungspfeile der EntitiesZeige Namen der EntitiesZeige RasterZeige Zusammenfassung des letzten GUI-ImportsZeige ShaderdefinitionZeige GrößeninformationZeige Textur-FilterZeige FensterumrandungZeige ArbeitsbereichAlle anzeigenZeige Toolbar im Kamera-FensterZeige KoordinatenachsenZeige doppelte DefinitionenZeige HilfeZeige VerborgenesZeige vererbte EigenschaftenZeige Zusammenfassung des letzten XData-ImportsZeige GrößeninformationZeige WireframeZeige/verberge alle LichtvoluminaZeige/verberge alle Speaker-VoluminaYiSindhiSinghalesischSitz-WinkelGröße / Geschw.Größe:SkinSkinnameSkin:SkinsKein Diffusemap-RenderingKein Specularmap-RenderingSlowakischSlowenischAuswahl am Raster ausrichtenAuswahl am Raster ausrichtenAm Raster ausrichtenSchnappschussverzeichniss (relativ zu map Verzeichniss)Feste AuswahlrahmenSomaliPatch ist nicht geeignet für diese Operation.Süd-SothoSounddateienSoundshaderQuellmission:Status des Quell-Missionsziels:Quell-Missionsziel:SpanischWertepaar:Geschw.:Kugelradius:Kugel...SphärischAuswahl splittenQuadrateStufeStufeneinstellungenStandardStartStarte DarkRadiant auf MonitorStarte im "alarmierten" Idle-ZustandSitzt von anfang anSchläft von anfang anGUI-Browser öffnen?ZustandSchritt:Stim/Response-EditorStim/Response...StimsPatch-Texturen zusammenfügenStopLogik für Erfüllung:Logik für Erfüllung:Logik für ErfüllungSundanesischSurface InspectorMit Monsterclip einhüllenMit Monsterclip einhüllenSwahiliSiswatiSchwedischSchalte zu Standard-GUI um...TagalogTahitianischTadschikischTamilischMissionsziel:TatarischTeamTeluguTexturbrowser-HintergrundTexturbrowserTextur-LockTexturoperationenTextureigenschaftenSkalierung der TexturvorschaubilderTextur-WerkzeugTextur-LockTexturbrowser-ScrollbalkenTexturenThailändischThe Dark Mod (www.thedarkmod.com) Dieses Produkt enthält teilweise Software der Firma id Software, Inc. ('id Technology'). id Technology 2000 id Software,Inc. DarkRadiant basiert auf der GPL version von GtkRadiant (www.qeradiant.com) http://darkradiant.sourceforge.net/Die Definition %s existiert bereits, soll sie importiert werden?Das fs_game Verzeichnis "%1%" existiert nicht. Das fs_game_base Verzeichnis "%1%" existiert nicht. Der Name %s existiert bereits in dieser Map!Die angeforderte Definition wurde in mehreren Dateien gefunden, bitte die genaue Datei auswählen:Die angegebene Definition existiert nicht.Die angegebene Datei kann nicht geöffnet werden.Die angegebene Datei existiert nicht.Die angegebene GUI-Definition ist kein Schriftstück.Die angegebene GUI-Definition ist für das momentan gewählte Seitenlayout nicht geeignet.Diese Tastenkombination ist bereits %s zugeordnet. Soll diese Assoziation aufgehoben werden und die Tastenkombination stattdessen %s zugeordnet werden?Es gibt keine mehrfachen XData-DefinitionenDiese Logik überschreibt die Standard-Logik für die angegebene Schwierigkeitsstufe wenn das Logik-Eingabefeld nicht leer ist.Ausgewählte Patches extrudierenAusgewählte Patches extrudierenTiefe (in Rastereinheiten):Das-ist-nicht-Dromed-WarnungDieser Befehl steht im Komponentenmodus nicht zur Verfügung.Diese Bedingung ist noch nicht gültig oder vollständig.Diese Standardeinstellung wurde außer Kraft gesetzt, Editieren nicht möglich.Das ist die Standard-Logik für alle Schwierigkeitsstufen.Dieser Name existiert bereitsDieser Name ist bereits in Verwendung.Dies entfernt alle vorhandenen Auswahlsätze. Die Objekte in der aktuellen Map werden dadurch nicht beeinflusst. Fortfahren?TibetanischTigrinyaZeitversatz / Sek.Zeitintervall:Zeit:Timer-NeustartsTimer startet neu nach AblaufTimer wartet auf Start (wenn Option deaktiviert: Timer startet zur Spawn-Zeit)Titel:Die aktuelle Definition wurde in %s umbenannt, um doppelte XData-Definitionen zu vermeiden.Bis:Raster anzeigen/verbergenAnzeigen/VersteckenEbenensichtbarkeit umkehrenTongaWerkzeugWerkzeugeObenOben linksOben rechtsGesamte PolygoneGesamte VerticesSpuren:TranslahierenTranslationen sind immer achsengebundenTransparenzTransponierenTsongaTswanaTürkischTurkmenischTwiZwei Entities befinden sich innerhalb eines bestimmten RadiusZweiseitige Schriftstück-GUIsZweiseitigTypTyp:UigurischUkrainischKann Ziel-Entity nicht erzeugen: EntityKlasse '%s' nicht gefunden.Kann Ziel-Entity nicht erzeugen: die Entityklassen sind nicht in der Registierung definiert.Kann Konversationsentity nicht anlegen, Klasse '%s' nicht gefunden.Entity %s kann nicht erzeugt werden. Keine Brushes ausgewählt.Kann Licht nicht erzeugen, Klassenname nicht gefunden.Kann Modell nicht erzeugen, Klassenname nicht gefunden.Kann Speaker nicht erzeugen, Klassenname nicht gefunden.Konnte Map-Version nicht parsen (Parse-Exception)Vorschau nicht möglich, Entityklasse %s nicht vorhanden.Größe des Undo-StapelsEinheitliche Größe der Texturvorschaubilder (in Pixel)UnbekanntNach obenAktualisiere 2D-Ansichten bei KamerabewegungenAufwärtsdrift:UrduEntity-Farbe verwendenWelt-Schwerkraftrichtung verwendenVerwende HintergrundbildBoundingbox benutzenVerwende Start/EndUsbekischAnsichtWertGeschwindigkeit:VendaHersteller:Hersteller: %sDetailliertes LoggingVersion:Version: %d.%d.%dVersion: %sVert. Skalierung:Vert. Verschiebung:Vertikaler FOVVertikale VerschiebungVertikal:VietnamesischAnsichtFilter anzeigenShaderdefinition ansehenAnsicht folgt Mauszeiger bei Verschiebe-OperationenSichtbarSehschärfeSprachsatz:VolapükWartenWarten bis Befehl fertig ausgeführt wurdeWallonischWarnung: die Kamera befindet sich nicht innerhalb der Region, konnte daher den Spielerstartpunkt nicht setzen.WalisischWestfriesischBreite:FensterlayoutWolofArbeitsbereichSchreibe MapSchreibe Knoten %dXX-Größe:X-AchseRotation um X-AchseSkalierung X-AchseX:XData-Name:Ordner zum Ablegen der XData-DateienXData wurde umbenannt.XData ImportzusammenfassungXY (Oben)XY ObenXY-AnsichtFadenkreuz (XY-Ansicht)XZXZ VorneXdata-PfadXhosaYY-Größe:Y-AchseRotation um Y-AchseSkalierung Y-AchseYZYZ SeiteYiddischYorubaDu hast keine GUI ausgewählt. Es wird die Standard-GUI verwendet.Du hast eine XData-Definition importiert, die in einem PK4-File gespeichert ist.ZZ-Größe:Z-AchseRotation um Z-AchseSkalierung Z-AchseZhuangAnsicht zoomenBild zusammen mit 2D-Ansicht zoomenZulu_FilterclipPlaneInButtonclipPlaneOutButtoncreateNodeForEntity: Entity für Entity-Klasse NULL kann nicht erstellt werden.deaktiviertaktiviertEntitiesEntityentityflatShadeBtnhversteckelightingBtnmmsnextButtonNeinintransparentpauseTimeButtonprevButtonsSekunden:zeigestartTimeButtonstopTimeButtontexturedBtnMal(e)Mal(e) abgespielttransparentunbenannt.mapwireframeBtnwxWidgets Eigenschaftenx shader ersetzt.An X-Achse SpiegelnUm X-Achse rotierenx: %6.1lf y: %6.1lf z: %6.1lfAn Y-Achse SpiegelnUm Y-Achse rotierenJaAn Z-Achse SpiegelnUm Z-Achse rotierenDarkRadiant-2.0.2/install/i18n/de/LC_MESSAGES/darkradiant.po000066400000000000000000005353271245424655700231620ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: DarkRadiant\n" "Report-Msgid-Bugs-To: greebo@angua.at\n" "POT-Creation-Date: 2014-12-31 06:19+0100\n" "PO-Revision-Date: 2014-12-31 06:23+0100\n" "Last-Translator: greebo \n" "Language-Team: The Dark Mod\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-KeywordsList: _;gettext;gettext_noop\n" "X-Poedit-Basepath: .\n" "X-Poedit-Language: German\n" "X-Poedit-SearchPath-0: ..\\..\\..\\..\\radiant\n" "X-Poedit-SearchPath-1: ..\\..\\..\\..\\libs\n" "X-Poedit-SearchPath-2: ..\\..\\..\\..\\plugins\n" #: ..\..\radiant\brush\BrushModule.cpp:27 msgid "Settings/Primitives" msgstr "Einstellungen/Primitive" #: ..\..\radiant\brush\BrushModule.cpp:31 msgid "Default texture scale" msgstr "Standard-Texturskalierung" #: ..\..\radiant\brush\BrushModule.cpp:34 msgid "Enable Texture Lock (for Brushes)" msgstr "Textur-Lock aktivieren (für Brushes)" #: ..\..\radiant\brush\csg\CSG.cpp:304 msgid "This Is Not Dromed Warning" msgstr "Das-ist-nicht-Dromed-Warnung" #: ..\..\radiant\brush\csg\CSG.cpp:305 msgid "" "Note: be careful when using the CSG tool, as you might end up\n" "with an unnecessary number of tiny brushes and/or leaks.\n" "This popup will not be shown again." msgstr "" "Hinweis: das CSG Werkzeug sollte vorsichtig benutzt werden,\n" "da es unnötig viele sehr kleine Brushes und/oder Lecks erzeugen kann.\n" "Dieser Hinweis wird nicht wieder erscheinen." #: ..\..\radiant\brush\csg\CSG.cpp:317 #: ..\..\radiant\brush\csg\CSG.cpp:318 msgid "CSG Subtract: No brushes selected." msgstr "CSG Subtraktion: Keine Brushes ausgewählt." #: ..\..\radiant\brush\csg\CSG.cpp:428 #: ..\..\radiant\brush\csg\CSG.cpp:429 msgid "CSG Merge: No brushes selected." msgstr "CSG Zusammenfügen: Keine Brushes ausgewählt." #: ..\..\radiant\camera\CameraSettings.cpp:56 msgid "Settings/Camera" msgstr "Einstellungen/Kamera" #: ..\..\radiant\camera\CameraSettings.cpp:59 msgid "Movement Speed (game units)" msgstr "Bewegungsgeschwindigkeit (in Spieleinheiten)" #: ..\..\radiant\camera\CameraSettings.cpp:60 msgid "Rotation Speed" msgstr "Rotationsgeschwindigkeit" #: ..\..\radiant\camera\CameraSettings.cpp:63 msgid "Freelook mode can be toggled" msgstr "Umschalten von/zu Umsichtsmodus erlauben" #: ..\..\radiant\camera\CameraSettings.cpp:64 msgid "Discrete movement (non-freelook mode)" msgstr "Schrittweise Bewegung (freier Umsichtsmodus aus)" #: ..\..\radiant\camera\CameraSettings.cpp:65 msgid "Enable far-clip plane (hides distant objects)" msgstr "Aktiviere hintere Clip-Ebene (ferne Objekte werden nicht angezeigt)" #: ..\..\radiant\camera\CameraSettings.cpp:68 msgid "Invert mouse vertical axis (freelook mode)" msgstr "Invertiere vertikale Mausachse (freier Umsichtsmodus)" #: ..\..\radiant\camera\CameraSettings.cpp:71 msgid "Solid selection boxes" msgstr "Feste Auswahlrahmen" #: ..\..\radiant\camera\CameraSettings.cpp:75 msgid "Show camera toolbar" msgstr "Zeige Toolbar im Kamera-Fenster" #: ..\..\radiant\camera\FloatingCamWnd.cpp:18 #: xml_file_content.cpp:60 msgid "Camera" msgstr "Kamera" #: ..\..\radiant\camera\tools\FreeMoveTool.h:23 msgid "Freemove Mode" msgstr "Umsichtsmodus" #: ..\..\radiant\camera\tools\JumpToObjectTool.h:22 msgid "Jump to Object" msgstr "Zu Objekt springen" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:96 msgid "Pick Shader" msgstr "Shader auswählen" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:114 msgid "Paste Shader Projected" msgstr "Shader einfügen (Projektion)" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:132 msgid "Paste Shader Natural" msgstr "Shader einfügen (Natürliche Skalierung)" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:150 msgid "Paste Texture Coordinates" msgstr "Texturkoordinaten einfügen" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:168 msgid "Paste Shader to all Brush Faces" msgstr "Shader einfügen (gesamter Brush)" #: ..\..\radiant\camera\tools\ShaderClipboardTools.h:186 msgid "Paste Shader Name" msgstr "Shadernamen einfügen" #: ..\..\radiant\clipper\Clipper.cpp:41 msgid "Settings/Clipper" msgstr "Einstellungen/Clipper" #: ..\..\radiant\clipper\Clipper.cpp:43 msgid "Clipper tool uses caulk texture" msgstr "Clipper verwendet Caulk-Textur für neu erzeugte Faces." #: ..\..\radiant\clipper\Clipper.cpp:44 msgid "Caulk shader name" msgstr "Name des Caulk Shaders" #: ..\..\radiant\layers\LayerSystem.cpp:34 msgid "Default" msgstr "Standard" #: ..\..\radiant\layers\LayerSystem.cpp:37 msgid "Create Layer..." msgstr "Neuer Layer..." #: ..\..\radiant\layers\LayerSystem.cpp:39 msgid "Add to Layer..." msgstr "Zu Layer hinzufügen..." #: ..\..\radiant\layers\LayerSystem.cpp:40 msgid "Move to Layer..." msgstr "Nach Layer verschieben..." #: ..\..\radiant\layers\LayerSystem.cpp:41 msgid "Remove from Layer..." msgstr "Von Layer entfernen..." #: ..\..\radiant\layers\LayerSystem.cpp:528 #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1537 msgid "Enter Name" msgstr "Namen eingeben" #: ..\..\radiant\layers\LayerSystem.cpp:529 msgid "Enter Layer Name" msgstr "Ebenennamen eingeben" #: ..\..\radiant\layers\LayerSystem.cpp:541 msgid "Cannot create layer with empty name." msgstr "Es ist nicht möglich eine Ebene ohne Namen zu erstellen." #: ..\..\radiant\layers\LayerSystem.cpp:555 msgid "This name already exists." msgstr "Dieser Name existiert bereits" #: ..\..\radiant\main.cpp:135 msgid "Disable sound for this session." msgstr "Keine Soundwiedergabe in dieser Session" #: ..\..\radiant\main.cpp:136 msgid "Verbose logging." msgstr "Detailliertes Logging" #: ..\..\radiant\main.cpp:153 msgid "Searching for Modules" msgstr "Suche nach Modulen" #: ..\..\radiant\map\algorithm\MapExporter.cpp:114 msgid "Writing map" msgstr "Schreibe Map" #: ..\..\radiant\map\algorithm\MapExporter.cpp:222 #, c-format msgid "Writing node %d" msgstr "Schreibe Knoten %d" #: ..\..\radiant\map\algorithm\MapImporter.cpp:41 msgid "Loading map" msgstr "Lade Map" #: ..\..\radiant\map\algorithm\MapImporter.cpp:44 #: ..\..\radiant\map\algorithm\MapImporter.cpp:59 #, c-format msgid "Loading entity %d\n" msgstr "Lade Entity %d\n" #: ..\..\radiant\map\AutoSaver.cpp:299 msgid "Settings/Autosave" msgstr "Einstellungen/Automatisches Speichern" #: ..\..\radiant\map\AutoSaver.cpp:302 msgid "Enable Autosave" msgstr "Aktiviere automatisches Speichern" #: ..\..\radiant\map\AutoSaver.cpp:303 msgid "Autosave Interval (in minutes)" msgstr "Speicherintervall" # Snapshots oder Schnappschüsse? #: ..\..\radiant\map\AutoSaver.cpp:305 msgid "Save Snapshots" msgstr "Speichere Schnappschüsse" # Snapshot oder Schnappschuss? #: ..\..\radiant\map\AutoSaver.cpp:306 msgid "Snapshot folder (relative to map folder)" msgstr "Schnappschussverzeichniss (relativ zu map Verzeichniss)" #: ..\..\radiant\map\AutoSaver.cpp:307 msgid "Max Snapshot Folder size (MB)" msgstr "Maximale Grösse des Schnappschussverzeichnisses (MB)" #: ..\..\radiant\map\CounterManager.cpp:67 #, c-format msgid "Brushes: %lu Patches: %lu Entities: %lu" msgstr "Brushes: %lu Patches: %lu Entities: %lu" #: ..\..\radiant\map\FindMapElements.cpp:95 msgid "Find Brush" msgstr "Suche Brush" #: ..\..\radiant\map\FindMapElements.cpp:97 msgid "Entity Number:" msgstr "Entitynummer:" #: ..\..\radiant\map\FindMapElements.cpp:98 msgid "Brush Number:" msgstr "Brushnummer:" #: ..\..\radiant\map\InfoFile.cpp:73 msgid "Map Info File Version invalid" msgstr "Ungültige Map Info File Verson" #: ..\..\radiant\map\Map.cpp:59 msgid "unnamed.map" msgstr "unbenannt.map" #: ..\..\radiant\map\Map.cpp:184 #: ..\..\radiant\map\Map.cpp:517 #: ..\..\radiant\map\Map.cpp:609 #: ..\..\radiant\map\Map.cpp:637 #: ..\..\radiant\RadiantModule.cpp:132 #: ..\..\radiant\referencecache\ModelCache.cpp:245 #: ..\..\radiant\referencecache\ModelCache.cpp:261 #: ..\..\plugins\shaders\Doom3ShaderSystem.cpp:301 msgid "Processing..." msgstr "Vorgang läuft..." #: ..\..\radiant\map\Map.cpp:184 msgid "Loading textures..." msgstr "Lade Texturen..." #: ..\..\radiant\map\Map.cpp:517 msgid "Saving Map" msgstr "Speichere Map" #: ..\..\radiant\map\Map.cpp:568 msgid "Importing..." msgstr "Importiere..." #: ..\..\radiant\map\Map.cpp:663 #, c-format msgid "" "Save changes to map \"%s\"\n" "before closing?" msgstr "" "Sollen die Änderungen an der Map \"%s\"\n" "vor dem Schließen gespeichert werden?" #: ..\..\radiant\map\Map.cpp:671 #, c-format msgid "%d minutes" msgstr "%d Minuten" #: ..\..\radiant\map\Map.cpp:675 #, c-format msgid "%d seconds" msgstr "%d Sekunden" #: ..\..\radiant\map\Map.cpp:679 #, c-format msgid "" "If you don't save, changes from the last %s\n" "will be lost." msgstr "" "Wenn Du nicht sicherst, gehen die Änderungen\n" "der letzten %s verloren." #: ..\..\radiant\map\Map.cpp:737 msgid "Save Map" msgstr "Map speichern" #: ..\..\radiant\map\Map.cpp:777 msgid "Save Copy As..." msgstr "Speichere Kopie als..." #: ..\..\radiant\map\Map.cpp:853 msgid "New Map" msgstr "Neue Map" #: ..\..\radiant\map\Map.cpp:864 #: ..\..\radiant\ui\mru\MRU.cpp:93 msgid "Open Map" msgstr "Map öffnen" #: ..\..\radiant\map\Map.cpp:868 msgid "Open map" msgstr "Map öffnen" #: ..\..\radiant\map\Map.cpp:882 msgid "Import map" msgstr "Map importieren" #: ..\..\radiant\map\Map.cpp:911 msgid "Export selection" msgstr "Auswahl exportieren" #: ..\..\radiant\map\Map.cpp:926 msgid "Save selected as Prefab" msgstr "Auswahl als Prefab speichern" #: ..\..\radiant\map\Map.cpp:1007 #, c-format msgid "" "Failure reading map from clipboard:\n" "%s" msgstr "" "Fehler beim Lesen der Mapdatei aus der Zwischenablage:\n" "%s" #: ..\..\radiant\map\MapFileManager.cpp:35 msgid "Map" msgstr "Map" #: ..\..\radiant\map\MapFileManager.cpp:36 #: xml_file_content.cpp:89 msgid "Region" msgstr "Region" #: ..\..\radiant\map\MapFileManager.cpp:37 #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:252 msgid "Prefab" msgstr "Prefab" #: ..\..\radiant\map\MapResource.cpp:274 #: ..\..\radiant\map\MapResource.cpp:637 #, c-format msgid "File is write-protected: %s" msgstr "Datei ist schreibgeschützt: %s" #: ..\..\radiant\map\MapResource.cpp:430 #, c-format msgid "" "Failure opening map file:\n" "%s" msgstr "" "Fehler beim Öffnen der Mapdatei:\n" "%s" #: ..\..\radiant\map\MapResource.cpp:472 #, c-format msgid "" "Could not determine map format of file:\n" "%s" msgstr "Konnte das Format der Mapdatei nicht bestimmen: %s" #: ..\..\radiant\map\MapResource.cpp:598 msgid "Map loading cancelled" msgstr "Ladevorgang abgebrochen" #: ..\..\radiant\map\MapResource.cpp:610 #, c-format msgid "" "Failure reading map file:\n" "%s\n" "\n" "%s" msgstr "" "Fehler beim Lesen der Mapdatei:\n" "%s\n" "\n" "%s" #: ..\..\radiant\map\MapResource.cpp:702 msgid "Map writing cancelled" msgstr "Schreibvorgang abgebrochen" #: ..\..\radiant\map\MapResource.cpp:717 msgid "Could not open output streams for writing" msgstr "Fehler beim Öffnen der Output-Streams" #: ..\..\radiant\map\PointFile.cpp:116 #, c-format msgid "Could not open pointfile: %s" msgstr "Konnte das Pointfile nicht öffnen: %s" #: ..\..\radiant\map\RegionManager.cpp:203 msgid "Warning: Camera not within region, can't set info_player_start." msgstr "Warnung: die Kamera befindet sich nicht innerhalb der Region, konnte daher den Spielerstartpunkt nicht setzen." #: ..\..\radiant\map\RegionManager.cpp:293 msgid "Could not set Region: XY Top View not found." msgstr "Konnte Region nicht festlegen, weil die XY-Ansicht nicht gefunden wurde." #: ..\..\radiant\map\RegionManager.cpp:320 msgid "Could not set Region: please select a single Brush." msgstr "Kann Region nicht festlegen: bitte einen einzelnen Brush auswählen." #: ..\..\radiant\map\RegionManager.cpp:345 msgid "This command is not available in component mode." msgstr "Dieser Befehl steht im Komponentenmodus nicht zur Verfügung." #: ..\..\radiant\map\RegionManager.cpp:351 msgid "Could not set Region: nothing selected." msgstr "Kann keine Region festlegen: keine Elemente ausgewählt." #: ..\..\radiant\map\RegionManager.cpp:368 msgid "Export region" msgstr "Exportiere Region" #: ..\..\radiant\modulesystem\ModuleRegistry.cpp:117 #, c-format msgid "Initialising Module: %s" msgstr "Initialisiere Modul: %s" #: ..\..\radiant\modulesystem\ModuleRegistry.cpp:133 msgid "Initialising Modules" msgstr "Initialisiere Module" #: ..\..\radiant\patch\algorithm\General.cpp:110 msgid "" "Cannot stitch textures. \n" "Could not cast nodes to patches." msgstr "" "Kann Texturen nicht zusammenheften.\n" "Konnte Nodes nicht casten." #: ..\..\radiant\patch\algorithm\General.cpp:119 msgid "" "Cannot stitch patch textures. \n" "Exactly 2 patches must be selected." msgstr "Kann Texturen nicht zusammenheften, für diese Operation müssten genau 2 Patches ausgewählt sein." #: ..\..\radiant\patch\algorithm\General.cpp:157 msgid "Cannot bulge patch. No patches selected." msgstr "Kann Patch nicht auswölben: keine Patches ausgewählt." #: ..\..\radiant\patch\algorithm\Prefab.cpp:244 msgid "Cannot create end-cap, patch must have a width of 5." msgstr "Kann keine End-Caps erzeugen, Patch muss eine Breite von 5 haben" #: ..\..\radiant\patch\algorithm\Prefab.cpp:251 msgid "Cannot create bevel-cap, patch must have a width of 3." msgstr "Kann keine Bevel-Caps erzeugen, Patch muss eine Breite von 3 haben" #: ..\..\radiant\patch\algorithm\Prefab.cpp:260 msgid "Cannot create cylinder-cap, patch must have a width of 9." msgstr "Kann keine Zylinder-Caps erzeugen, Patch muss eine Breite von 9 haben" #: ..\..\radiant\patch\Patch.cpp:1706 msgid "Sorry. Patch is not suitable for this kind of operation." msgstr "Patch ist nicht geeignet für diese Operation." #: ..\..\radiant\patch\PatchCreators.cpp:62 msgid "Settings/Patch" msgstr "Einstellungen/Patches" #: ..\..\radiant\patch\PatchCreators.cpp:63 msgid "Patch Subdivide Threshold" msgstr "Patch-Tesselierungsgrenzwert" #: ..\..\radiant\RadiantModule.cpp:233 #: ..\..\radiant\settings\GameManager.cpp:97 #: ..\..\radiant\settings\GameManager.cpp:323 #: ..\..\radiant\settings\GameManager.cpp:344 #: ..\..\radiant\ui\prefdialog\PrefDialog.cpp:198 msgid "Game" msgstr "Spiel" #: ..\..\radiant\RadiantModule.cpp:234 msgid "Settings" msgstr "Einstellungen" #: ..\..\radiant\referencecache\ModelCache.cpp:245 #: ..\..\radiant\referencecache\ModelCache.cpp:261 msgid "Reloading Models" msgstr "Neuladen der Modelle" #: ..\..\radiant\selection\algorithm\Curves.cpp:188 msgid "Can't append curve point - no entities with curve selected." msgstr "Kann Kontrollpunkt nicht anfügen, keine Kurven ausgewählt." #: ..\..\radiant\selection\algorithm\Curves.cpp:198 msgid "Can't remove curve points - must be in vertex editing mode." msgstr "Kann Kontrollpunkte nicht entfernen, bitte vorher in den Vertex-Modus wechseln." #: ..\..\radiant\selection\algorithm\Curves.cpp:218 msgid "Can't remove curve points - no entities with curves selected." msgstr "Kann Kontrollpunkte nicht entfernen, keine Kurven ausgewählt." #: ..\..\radiant\selection\algorithm\Curves.cpp:228 msgid "Can't insert curve points - must be in vertex editing mode." msgstr "Kann Kontrollpunkte nicht einfügen, bitte vorher in den Vertex-Modus wechseln." #: ..\..\radiant\selection\algorithm\Curves.cpp:248 msgid "Can't insert curve points - no entities with curves selected." msgstr "Kann Kontrollpunkte nicht einfügen, keine Kurven ausgewählt." #: ..\..\radiant\selection\algorithm\Curves.cpp:269 msgid "Can't convert curves - no entities with curves selected." msgstr "Kann Kurve nicht konvertieren, keine Kurven ausgewählt." #: ..\..\radiant\selection\algorithm\Entity.cpp:62 msgid "Cannot change classname of worldspawn entity." msgstr "Der Klassenname der Worldspawn-Entity darf nicht geändert werden." #: ..\..\radiant\selection\algorithm\Entity.cpp:104 msgid "Critical: Cannot find selected entities." msgstr "Kritischer Fehler: kann ausgewählte Entities nicht finden." #: ..\..\radiant\selection\algorithm\Entity.cpp:109 #: ..\..\radiant\selection\algorithm\Entity.cpp:125 msgid "Exactly two entities must be selected for this operation." msgstr "Für diese Operation müssen genau zwei Entities ausgewählt sein." #: ..\..\radiant\selection\algorithm\Entity.cpp:171 #, c-format msgid "Unable to create entity %s, no brushes selected." msgstr "Entity %s kann nicht erzeugt werden. Keine Brushes ausgewählt." #: ..\..\radiant\selection\algorithm\Group.cpp:236 msgid "Cannot reparent primitives to entity. Please select at least one brush/patch and exactly one entity.(The entity has to be selected last.)" msgstr "Kann die ausgewählten Primitive nicht neu zuordnen. Bitte zumindest einen Brush/Patch sowie eine Entity auswählen. (Die Entity muss als letztes ausgewählt worden sein.)" #: ..\..\radiant\selection\algorithm\Group.cpp:386 msgid "" "Cannot merge entities, the selection must consist of func_* entities only.\n" "(The first selected entity will be preserved.)" msgstr "" "Kann Entities nicht zusammenführen, die Auswahl muss ausschließlich aus func_*-Entities bestehen.\n" "(Die zuerst ausgewählte Entity bleibt dabei erhalten.)" #: ..\..\radiant\selection\algorithm\Patch.cpp:60 msgid "Cannot create caps, no patches selected." msgstr "Kann keine Caps erzeugen, da keine Patches ausgewählt sind." #: ..\..\radiant\selection\algorithm\Patch.cpp:208 msgid "Cannot thicken patch. Nothing selected." msgstr "Nichts ausgewählt: kann Patch nicht extrudieren." #: ..\..\radiant\selection\algorithm\Primitives.cpp:83 #: ..\..\radiant\selection\algorithm\Primitives.cpp:87 msgid "No patches selected." msgstr "Keine Patches ausgewählt." #: ..\..\radiant\selection\algorithm\Primitives.cpp:249 msgid "Could not create patch." msgstr "Konnte Patch nicht erzeugen." #: ..\..\radiant\selection\algorithm\Primitives.cpp:367 msgid "No faces selected." msgstr "Keine Faces ausgewählt." #: ..\..\radiant\selection\algorithm\Primitives.cpp:388 #, c-format msgid "%d faces were not suitable (had more than 4 vertices)." msgstr "%d ungeeignete Faces wurden nicht bearbeitet (Faces mit mehr als 4 Eckpunkten)." #: ..\..\radiant\selection\algorithm\Primitives.cpp:399 #: ..\..\radiant\selection\algorithm\Primitives.cpp:498 msgid "No brushes selected." msgstr "Keine Brushes ausgewählt." #: ..\..\radiant\selection\algorithm\Primitives.cpp:598 msgid "At least one brush must be selected for this operation." msgstr "Für diese Operation muss mindestens ein Brush ausgewählt sein." #: ..\..\radiant\selection\algorithm\Shader.cpp:286 msgid "" "Can't paste shader to entire brush.\n" "Target is not a brush." msgstr "Kann Shader nicht auf gesamten Brush anwenden, das Ziel ist kein Brush." #: ..\..\radiant\selection\algorithm\Shader.cpp:321 msgid "" "Can't paste Texture Coordinates.\n" "Target patch dimensions must match." msgstr "Kann Texturkoordinaten nicht kopieren, da die Patch-Dimensionen nicht passend sind." #: ..\..\radiant\selection\algorithm\Shader.cpp:328 msgid "Can't paste Texture Coordinates from patches to faces." msgstr "Es ist nicht möglich, Texturkoordinaten von Patches auf Faces zu kopieren." #: ..\..\radiant\selection\algorithm\Shader.cpp:333 msgid "Can't paste Texture Coordinates from faces." msgstr "Es ist nicht möglich, Texturkoordinaten von Faces zu kopieren." #: ..\..\radiant\selection\algorithm\Shader.cpp:389 msgid "Can't copy Shader. Couldn't retrieve patch." msgstr "Konnte Patch nicht casten, Shader wurde nicht kopiert." #: ..\..\radiant\selection\algorithm\Shader.cpp:399 msgid "Can't copy Shader. Couldn't retrieve face." msgstr "Konnte Face nicht casten, Shader wurde nicht kopiert." #: ..\..\radiant\selection\algorithm\Shader.cpp:405 msgid "Can't copy Shader. Please select a single face or patch." msgstr "Shader nicht kopiert: bitte ein einzelnes Face oder einen Patch auswählen." #: ..\..\radiant\selection\algorithm\Transformation.cpp:55 msgid "Cannot scale by zero value." msgstr "Kann nicht mit 0 skalieren." #: ..\..\radiant\selection\ManipulateMouseTool.cpp:28 msgid "Manipulate" msgstr "Manipulieren" #: ..\..\radiant\selection\SelectionMouseTools.cpp:53 msgid "Select" msgstr "Auswählen" #: ..\..\radiant\selection\SelectionMouseTools.cpp:168 #: xml_file_content.cpp:4 msgid "Select Faces" msgstr "Faces auswählen" #: ..\..\radiant\selection\SelectionMouseTools.cpp:187 msgid "Cycle Selection" msgstr "Auswahl durchrotieren" #: ..\..\radiant\selection\SelectionMouseTools.cpp:233 msgid "Cycle Face Selection" msgstr "Face-Auswahl durchrotieren" #: ..\..\radiant\selection\selectionset\SelectionSetManager.cpp:84 msgid "Selection Set: " msgstr "Auswahlsatz: " #: ..\..\radiant\selection\selectionset\SelectionSetManager.cpp:92 msgid "Clear Selection Sets" msgstr "Auswahlsätze löschen" #: ..\..\radiant\selection\selectionset\SelectionSetManager.cpp:194 msgid "Delete all selection sets?" msgstr "Alle Auswahlsätze löschen?" #: ..\..\radiant\selection\selectionset\SelectionSetManager.cpp:195 msgid "" "This will delete all set definitions. The actual map objects will not be affected by this step.\n" "\n" "Continue with that operation?" msgstr "" "Dies entfernt alle vorhandenen Auswahlsätze. Die Objekte in der aktuellen Map werden dadurch nicht beeinflusst.\n" "\n" "Fortfahren?" #: ..\..\radiant\selection\selectionset\SelectionSetToolmenu.cpp:18 msgid "" "Enter a name and hit ENTER to save a set.\n" "\n" "Select an item from the dropdown list to restore the selection.\n" "\n" "Hold SHIFT when opening the dropdown list and selecting the item to de-select the set." msgstr "" "Namen eingaben und mit der EINGABETASTE bestätigen um einen neuen Satz anzulegen.\n" "\n" "Ein Element in der Liste auswählen um die entsprechende Auswahl wiederherzustellen.\n" "\n" "UMSCHALTTASTE gedrückt halten um die Auswahl der entsprechenden Elemente aufzuheben." #: ..\..\radiant\selection\selectionset\SelectionSetToolmenu.cpp:62 msgid "Cannot create selection set" msgstr "Kann Auswahlsatz nicht erstellen" #: ..\..\radiant\selection\selectionset\SelectionSetToolmenu.cpp:63 msgid "Cannot create a selection set, there is nothing selected in the current scene." msgstr "Kann Auswahlsatz nicht anlegen, keine Auswahl vorhanden." #: ..\..\radiant\selection\shaderclipboard\ShaderClipboard.cpp:87 #, c-format msgid "ShaderClipboard: %s" msgstr "Shader-Zwischenablage: %s" #: ..\..\radiant\selection\shaderclipboard\ShaderClipboard.cpp:90 msgid "Face" msgstr "Face" #: ..\..\radiant\selection\shaderclipboard\ShaderClipboard.cpp:93 msgid "Patch" msgstr "Patch" #: ..\..\radiant\selection\shaderclipboard\ShaderClipboard.cpp:96 #: ..\..\radiant\ui\common\ShaderSelector.cpp:359 #: ..\..\radiant\ui\common\TexturePreviewCombo.cpp:73 #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:60 #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:359 #: xml_file_content.cpp:14 msgid "Shader" msgstr "Shader" #: ..\..\radiant\selection\shaderclipboard\ShaderClipboard.cpp:100 msgid "ShaderClipboard is empty." msgstr "Shader-Zwischenablage ist leer." #: ..\..\radiant\settings\GameManager.cpp:89 msgid "GameManager: No game type selected, can't continue." msgstr "GameManager: kein Spieltyp ausgewählt, kann daher nicht fortfahren." #: ..\..\radiant\settings\GameManager.cpp:104 msgid "Select a Game:" msgstr "Spiel auswählen:" #: ..\..\radiant\settings\GameManager.cpp:105 msgid "Engine Path" msgstr "Pfad zur Engine" #: ..\..\radiant\settings\GameManager.cpp:106 msgid "Mod (fs_game)" msgstr "Mod (fs_game)" #: ..\..\radiant\settings\GameManager.cpp:107 msgid "Mod Base (fs_game_base, optional)" msgstr "Mod Base (fs_game_base, optional)" #: ..\..\radiant\settings\GameManager.cpp:119 msgid "GameManager: No valid game files found, can't continue." msgstr "GameManager: keine gültigen Spieldateien (.game) gefunden, kann nicht fortfahren." #: ..\..\radiant\settings\GameManager.cpp:149 msgid "No game type selected." msgstr "Kein Spieltyp ausgewählt." #: ..\..\radiant\settings\GameManager.cpp:244 #, c-format msgid "Engine path \"%1%\" does not exist.\n" msgstr "Engine-Pfad \"%1%\" existiert nicht.\n" #: ..\..\radiant\settings\GameManager.cpp:249 #, c-format msgid "The fs_game folder \"%1%\" does not exist.\n" msgstr "Das fs_game Verzeichnis \"%1%\" existiert nicht.\n" #: ..\..\radiant\settings\GameManager.cpp:255 #, c-format msgid "The fs_game_base folder \"%1%\" does not exist.\n" msgstr "Das fs_game_base Verzeichnis \"%1%\" existiert nicht.\n" #: ..\..\radiant\settings\GameManager.cpp:259 msgid "Do you want to correct these settings?" msgstr "Möchtest Du diese Einstellungen korrigieren?" #: ..\..\radiant\settings\GameManager.cpp:261 msgid "Invalid Settings" msgstr "Ungültige Einstellungen" #: ..\..\radiant\settings\GameManager.cpp:345 msgid "" "Note: You will have to restart DarkRadiant\n" "for the changes to take effect." msgstr "" "Hinweis: Du musst DarkRadiant neu starten,\n" "damit die Änderungen wirksam werden." #: ..\..\radiant\settings\LanguageManager.cpp:103 msgid "Settings/Language" msgstr "Einstellungen/Sprache" #: ..\..\radiant\settings\LanguageManager.cpp:104 msgid "Language" msgstr "Sprache" #: ..\..\radiant\settings\LanguageManager.cpp:106 msgid "" "Note: You'll need to restart DarkRadiant\n" "after changing the language setting." msgstr "" "Hinweis: Du musst DarkRadiant neu starten,\n" "damit die neue Spracheinstellung aktiv wird." #: ..\..\radiant\settings\LanguageManager.cpp:217 #: ..\..\radiant\settings\LanguageManager.cpp:254 msgid "English" msgstr "Englisch" #: ..\..\radiant\settings\LanguageManager.cpp:218 msgid "Abkhazian" msgstr "Abchasisch" #: ..\..\radiant\settings\LanguageManager.cpp:219 msgid "Avestan" msgstr "Avestisch" #: ..\..\radiant\settings\LanguageManager.cpp:220 msgid "Afrikaans" msgstr "Afrikaans" #: ..\..\radiant\settings\LanguageManager.cpp:221 msgid "Akan" msgstr "Akan" #: ..\..\radiant\settings\LanguageManager.cpp:222 msgid "Amharic" msgstr "Amharisch" #: ..\..\radiant\settings\LanguageManager.cpp:223 msgid "Aragonese" msgstr "Aragonesisch" #: ..\..\radiant\settings\LanguageManager.cpp:224 msgid "Arabic" msgstr "Arabisch" #: ..\..\radiant\settings\LanguageManager.cpp:225 msgid "Assamese" msgstr "Assamesisch" #: ..\..\radiant\settings\LanguageManager.cpp:226 msgid "Avaric" msgstr "Awarisch" #: ..\..\radiant\settings\LanguageManager.cpp:227 msgid "Aymara" msgstr "Aymara" #: ..\..\radiant\settings\LanguageManager.cpp:228 msgid "Azerbaijani" msgstr "Aserbaidschanisch" #: ..\..\radiant\settings\LanguageManager.cpp:229 msgid "Bashkir" msgstr "Baschkirisch" #: ..\..\radiant\settings\LanguageManager.cpp:230 msgid "Belarusian" msgstr "Belarussisch" #: ..\..\radiant\settings\LanguageManager.cpp:231 msgid "Bulgarian" msgstr "Bulgarisch" #: ..\..\radiant\settings\LanguageManager.cpp:232 msgid "Bihari languages" msgstr "Bihari" #: ..\..\radiant\settings\LanguageManager.cpp:233 msgid "Bislama" msgstr "Bislama" #: ..\..\radiant\settings\LanguageManager.cpp:234 msgid "Bambara" msgstr "Bambara" #: ..\..\radiant\settings\LanguageManager.cpp:235 msgid "Bengali" msgstr "Bengalisch" #: ..\..\radiant\settings\LanguageManager.cpp:236 msgid "Tibetan" msgstr "Tibetanisch" #: ..\..\radiant\settings\LanguageManager.cpp:237 msgid "Breton" msgstr "Bretonisch" #: ..\..\radiant\settings\LanguageManager.cpp:238 msgid "Bosnian" msgstr "Bosnisch" #: ..\..\radiant\settings\LanguageManager.cpp:239 msgid "Catalan" msgstr "Katalanisch" #: ..\..\radiant\settings\LanguageManager.cpp:240 msgid "Chechen" msgstr "Tschetschenisch" #: ..\..\radiant\settings\LanguageManager.cpp:241 msgid "Chamorro" msgstr "Chamorro" #: ..\..\radiant\settings\LanguageManager.cpp:242 msgid "Corsican" msgstr "Korsisch" #: ..\..\radiant\settings\LanguageManager.cpp:243 msgid "Cree" msgstr "Cree" #: ..\..\radiant\settings\LanguageManager.cpp:244 msgid "Czech" msgstr "Tschechisch" #: ..\..\radiant\settings\LanguageManager.cpp:245 msgid "Chuvash" msgstr "Tschuwaschisch" #: ..\..\radiant\settings\LanguageManager.cpp:246 #: ..\..\radiant\settings\LanguageManager.cpp:247 msgid "Welsh" msgstr "Walisisch" #: ..\..\radiant\settings\LanguageManager.cpp:248 msgid "Danish" msgstr "Dänisch" #: ..\..\radiant\settings\LanguageManager.cpp:249 msgid "German" msgstr "Deutsch" #: ..\..\radiant\settings\LanguageManager.cpp:250 msgid "Divehi" msgstr "Dhivehi" #: ..\..\radiant\settings\LanguageManager.cpp:251 msgid "Dzongkha" msgstr "Dzongkha" #: ..\..\radiant\settings\LanguageManager.cpp:252 msgid "Ewe" msgstr "Ewe" #: ..\..\radiant\settings\LanguageManager.cpp:253 msgid "Greek" msgstr "Griechisch" #: ..\..\radiant\settings\LanguageManager.cpp:255 msgid "Esperanto" msgstr "Esperanto" #: ..\..\radiant\settings\LanguageManager.cpp:256 msgid "Spanish" msgstr "Spanisch" #: ..\..\radiant\settings\LanguageManager.cpp:257 msgid "Estonian" msgstr "Estnisch" #: ..\..\radiant\settings\LanguageManager.cpp:258 msgid "Basque" msgstr "Baskisch" #: ..\..\radiant\settings\LanguageManager.cpp:259 msgid "Persian" msgstr "Persisch" #: ..\..\radiant\settings\LanguageManager.cpp:260 msgid "Fulah" msgstr "Fulah" #: ..\..\radiant\settings\LanguageManager.cpp:261 msgid "Finnish" msgstr "Finnisch" #: ..\..\radiant\settings\LanguageManager.cpp:262 msgid "Fijian" msgstr "Fidschi" #: ..\..\radiant\settings\LanguageManager.cpp:263 msgid "Faroese" msgstr "Färöisch" #: ..\..\radiant\settings\LanguageManager.cpp:264 msgid "French" msgstr "Französisch" #: ..\..\radiant\settings\LanguageManager.cpp:265 msgid "Western Frisian" msgstr "Westfriesisch" #: ..\..\radiant\settings\LanguageManager.cpp:266 msgid "Irish" msgstr "Irisch" #: ..\..\radiant\settings\LanguageManager.cpp:267 msgid "Gaelic; Scottish Gaelic" msgstr "Gälisch" #: ..\..\radiant\settings\LanguageManager.cpp:268 msgid "Galician" msgstr "Galicische" #: ..\..\radiant\settings\LanguageManager.cpp:269 msgid "Guarani" msgstr "Guaraní" #: ..\..\radiant\settings\LanguageManager.cpp:270 msgid "Gujarati" msgstr "Gujarati" #: ..\..\radiant\settings\LanguageManager.cpp:271 msgid "Manx" msgstr "Manx-Gälisch" #: ..\..\radiant\settings\LanguageManager.cpp:272 msgid "Hausa" msgstr "Hausa" #: ..\..\radiant\settings\LanguageManager.cpp:273 msgid "Hebrew" msgstr "Hebräisch" #: ..\..\radiant\settings\LanguageManager.cpp:274 msgid "Hindi" msgstr "Hindi" #: ..\..\radiant\settings\LanguageManager.cpp:275 msgid "Hiri Motu" msgstr "Hiri Motu" #: ..\..\radiant\settings\LanguageManager.cpp:276 msgid "Croatian" msgstr "Kroatisch" #: ..\..\radiant\settings\LanguageManager.cpp:277 msgid "Haitian" msgstr "Haitianisch" #: ..\..\radiant\settings\LanguageManager.cpp:278 msgid "Hungarian" msgstr "Ungarisch" #: ..\..\radiant\settings\LanguageManager.cpp:279 msgid "Armenian" msgstr "Armenisch" #: ..\..\radiant\settings\LanguageManager.cpp:280 msgid "Herero" msgstr "Herero" #: ..\..\radiant\settings\LanguageManager.cpp:281 msgid "Interlingua" msgstr "Interlingua" #: ..\..\radiant\settings\LanguageManager.cpp:282 msgid "Indonesian" msgstr "Indonesisch" #: ..\..\radiant\settings\LanguageManager.cpp:283 msgid "Interlingue; Occidental" msgstr "Occidental-Interlingue" #: ..\..\radiant\settings\LanguageManager.cpp:284 msgid "Igbo" msgstr "Igbo" #: ..\..\radiant\settings\LanguageManager.cpp:285 msgid "Sichuan Yi; Nuosu" msgstr "Yi" #: ..\..\radiant\settings\LanguageManager.cpp:286 msgid "Inupiaq" msgstr "Inupiaq" #: ..\..\radiant\settings\LanguageManager.cpp:287 msgid "Ido" msgstr "Ido" #: ..\..\radiant\settings\LanguageManager.cpp:288 msgid "Icelandic" msgstr "Isländisch" #: ..\..\radiant\settings\LanguageManager.cpp:289 msgid "Italian" msgstr "Italienisch" #: ..\..\radiant\settings\LanguageManager.cpp:290 msgid "Inuktitut" msgstr "Inuktitut" #: ..\..\radiant\settings\LanguageManager.cpp:291 msgid "Japanese" msgstr "Japanisch" #: ..\..\radiant\settings\LanguageManager.cpp:292 msgid "Javanese" msgstr "Javanisch" #: ..\..\radiant\settings\LanguageManager.cpp:293 msgid "Georgian" msgstr "Georgisch" #: ..\..\radiant\settings\LanguageManager.cpp:294 msgid "Kongo" msgstr "Kongo" #: ..\..\radiant\settings\LanguageManager.cpp:295 msgid "Kikuyu" msgstr "Kikuyu" #: ..\..\radiant\settings\LanguageManager.cpp:296 msgid "Kuanyama" msgstr "Kwanyama" #: ..\..\radiant\settings\LanguageManager.cpp:297 msgid "Kazakh" msgstr "Kasachisch" #: ..\..\radiant\settings\LanguageManager.cpp:298 msgid "Kalaallisut; Greenlandic" msgstr "Grönländisch" #: ..\..\radiant\settings\LanguageManager.cpp:299 msgid "Central Khmer" msgstr "Khmer" #: ..\..\radiant\settings\LanguageManager.cpp:300 msgid "Kannada" msgstr "Kanaresisch" #: ..\..\radiant\settings\LanguageManager.cpp:301 msgid "Korean" msgstr "Koreanisch" #: ..\..\radiant\settings\LanguageManager.cpp:302 msgid "Kanuri" msgstr "Kanuri" #: ..\..\radiant\settings\LanguageManager.cpp:303 msgid "Kashmiri" msgstr "Kashmiri" #: ..\..\radiant\settings\LanguageManager.cpp:304 msgid "Kurdish" msgstr "Kurdisch" #: ..\..\radiant\settings\LanguageManager.cpp:305 msgid "Komi" msgstr "Komi" #: ..\..\radiant\settings\LanguageManager.cpp:306 msgid "Cornish" msgstr "Kornisch" #: ..\..\radiant\settings\LanguageManager.cpp:307 msgid "Kirghiz" msgstr "Kirgisisch" #: ..\..\radiant\settings\LanguageManager.cpp:308 msgid "Latin" msgstr "Lateinisch" #: ..\..\radiant\settings\LanguageManager.cpp:309 msgid "Luxembourgish" msgstr "Luxemburgisch" #: ..\..\radiant\settings\LanguageManager.cpp:310 msgid "Ganda" msgstr "Luganda" #: ..\..\radiant\settings\LanguageManager.cpp:311 msgid "Limburgan" msgstr "Limburgisch" #: ..\..\radiant\settings\LanguageManager.cpp:312 msgid "Lingala" msgstr "Lingála" #: ..\..\radiant\settings\LanguageManager.cpp:313 msgid "Lao" msgstr "Lao" #: ..\..\radiant\settings\LanguageManager.cpp:314 msgid "Lithuanian" msgstr "Litauisch" #: ..\..\radiant\settings\LanguageManager.cpp:315 msgid "Luba-Katanga" msgstr "Luba-Katanga" #: ..\..\radiant\settings\LanguageManager.cpp:316 msgid "Latvian" msgstr "Lettisch" #: ..\..\radiant\settings\LanguageManager.cpp:317 msgid "Malagasy" msgstr "Malagasy" #: ..\..\radiant\settings\LanguageManager.cpp:318 msgid "Marshallese" msgstr "Marshallesisch" #: ..\..\radiant\settings\LanguageManager.cpp:319 msgid "Maori" msgstr "Maori" #: ..\..\radiant\settings\LanguageManager.cpp:320 msgid "Macedonian" msgstr "Mazedonisch" #: ..\..\radiant\settings\LanguageManager.cpp:321 msgid "Malayalam" msgstr "Malayalam" #: ..\..\radiant\settings\LanguageManager.cpp:322 msgid "Mongolian" msgstr "Mongolisch" #: ..\..\radiant\settings\LanguageManager.cpp:323 msgid "Marathi" msgstr "Marathi" #: ..\..\radiant\settings\LanguageManager.cpp:324 msgid "Malay" msgstr "Malaiisch" #: ..\..\radiant\settings\LanguageManager.cpp:325 msgid "Maltese" msgstr "Maltesisch" #: ..\..\radiant\settings\LanguageManager.cpp:326 msgid "Burmese" msgstr "Burmesisch" #: ..\..\radiant\settings\LanguageManager.cpp:327 msgid "Nauru" msgstr "Nauruisch" #: ..\..\radiant\settings\LanguageManager.cpp:328 msgid "Ndebele, North" msgstr "IsiNdebele" #: ..\..\radiant\settings\LanguageManager.cpp:329 msgid "Nepali" msgstr "Nepalesisch" #: ..\..\radiant\settings\LanguageManager.cpp:330 msgid "Ndonga" msgstr "Ndonga" #: ..\..\radiant\settings\LanguageManager.cpp:331 msgid "Dutch" msgstr "Dänisch" #: ..\..\radiant\settings\LanguageManager.cpp:332 msgid "Norwegian" msgstr "Norwegisch" #: ..\..\radiant\settings\LanguageManager.cpp:333 msgid "Ndebele, South" msgstr "Süd-Ndebele" #: ..\..\radiant\settings\LanguageManager.cpp:334 msgid "Navajo" msgstr "Navajo" #: ..\..\radiant\settings\LanguageManager.cpp:335 msgid "Chichewa" msgstr "Chichewa" #: ..\..\radiant\settings\LanguageManager.cpp:336 msgid "Occitan" msgstr "Okzitanisch" #: ..\..\radiant\settings\LanguageManager.cpp:337 msgid "Ojibwa" msgstr "Ojibwe" #: ..\..\radiant\settings\LanguageManager.cpp:338 msgid "Oromo" msgstr "Oromo" #: ..\..\radiant\settings\LanguageManager.cpp:339 msgid "Oriya" msgstr "Oriya" #: ..\..\radiant\settings\LanguageManager.cpp:340 msgid "Ossetian" msgstr "Ossetisch" #: ..\..\radiant\settings\LanguageManager.cpp:341 msgid "Panjabi" msgstr "Panjabi" #: ..\..\radiant\settings\LanguageManager.cpp:342 msgid "Pali" msgstr "Pali" #: ..\..\radiant\settings\LanguageManager.cpp:343 msgid "Polish" msgstr "Polnisch" #: ..\..\radiant\settings\LanguageManager.cpp:344 msgid "Pushto" msgstr "Paschtunisch" #: ..\..\radiant\settings\LanguageManager.cpp:345 msgid "Portuguese" msgstr "Portugiesisch" #: ..\..\radiant\settings\LanguageManager.cpp:346 msgid "Quechua" msgstr "Quechua" #: ..\..\radiant\settings\LanguageManager.cpp:347 msgid "Romansh" msgstr "Rätoromanisch" #: ..\..\radiant\settings\LanguageManager.cpp:348 msgid "Rundi" msgstr "Kirundi" #: ..\..\radiant\settings\LanguageManager.cpp:349 msgid "Romanian" msgstr "Rumänisch" #: ..\..\radiant\settings\LanguageManager.cpp:350 msgid "Russian" msgstr "Russisch" #: ..\..\radiant\settings\LanguageManager.cpp:351 msgid "Kinyarwanda" msgstr "Kinyarwanda" #: ..\..\radiant\settings\LanguageManager.cpp:352 msgid "Sanskrit" msgstr "Sanskrit" #: ..\..\radiant\settings\LanguageManager.cpp:353 msgid "Sardinian" msgstr "Sardisch" #: ..\..\radiant\settings\LanguageManager.cpp:354 msgid "Sindhi" msgstr "Sindhi" #: ..\..\radiant\settings\LanguageManager.cpp:355 msgid "Northern Sami" msgstr "Nordsamisch" #: ..\..\radiant\settings\LanguageManager.cpp:356 msgid "Sango" msgstr "Sango" #: ..\..\radiant\settings\LanguageManager.cpp:357 msgid "Sinhala" msgstr "Singhalesisch" #: ..\..\radiant\settings\LanguageManager.cpp:358 msgid "Slovak" msgstr "Slowakisch" #: ..\..\radiant\settings\LanguageManager.cpp:359 msgid "Slovenian" msgstr "Slowenisch" #: ..\..\radiant\settings\LanguageManager.cpp:360 msgid "Samoan" msgstr "Samoisch" #: ..\..\radiant\settings\LanguageManager.cpp:361 msgid "Shona" msgstr "Shona" #: ..\..\radiant\settings\LanguageManager.cpp:362 msgid "Somali" msgstr "Somali" #: ..\..\radiant\settings\LanguageManager.cpp:363 msgid "Albanian" msgstr "Albanisch" #: ..\..\radiant\settings\LanguageManager.cpp:364 msgid "Serbian" msgstr "Serbisch" #: ..\..\radiant\settings\LanguageManager.cpp:365 msgid "Swati" msgstr "Siswati" #: ..\..\radiant\settings\LanguageManager.cpp:366 msgid "Sotho, Southern" msgstr "Süd-Sotho" #: ..\..\radiant\settings\LanguageManager.cpp:367 msgid "Sundanese" msgstr "Sundanesisch" #: ..\..\radiant\settings\LanguageManager.cpp:368 msgid "Swedish" msgstr "Schwedisch" #: ..\..\radiant\settings\LanguageManager.cpp:369 msgid "Swahili" msgstr "Swahili" #: ..\..\radiant\settings\LanguageManager.cpp:370 msgid "Tamil" msgstr "Tamilisch" #: ..\..\radiant\settings\LanguageManager.cpp:371 msgid "Telugu" msgstr "Telugu" #: ..\..\radiant\settings\LanguageManager.cpp:372 msgid "Tajik" msgstr "Tadschikisch" #: ..\..\radiant\settings\LanguageManager.cpp:373 msgid "Thai" msgstr "Thailändisch" #: ..\..\radiant\settings\LanguageManager.cpp:374 msgid "Tigrinya" msgstr "Tigrinya" #: ..\..\radiant\settings\LanguageManager.cpp:375 msgid "Turkmen" msgstr "Turkmenisch" #: ..\..\radiant\settings\LanguageManager.cpp:376 msgid "Tagalog" msgstr "Tagalog" #: ..\..\radiant\settings\LanguageManager.cpp:377 msgid "Tswana" msgstr "Tswana" #: ..\..\radiant\settings\LanguageManager.cpp:378 msgid "Tonga" msgstr "Tonga" #: ..\..\radiant\settings\LanguageManager.cpp:379 msgid "Turkish" msgstr "Türkisch" #: ..\..\radiant\settings\LanguageManager.cpp:380 msgid "Tsonga" msgstr "Tsonga" #: ..\..\radiant\settings\LanguageManager.cpp:381 msgid "Tatar" msgstr "Tatarisch" #: ..\..\radiant\settings\LanguageManager.cpp:382 msgid "Twi" msgstr "Twi" #: ..\..\radiant\settings\LanguageManager.cpp:383 msgid "Tahitian" msgstr "Tahitianisch" #: ..\..\radiant\settings\LanguageManager.cpp:384 msgid "Uighur" msgstr "Uigurisch" #: ..\..\radiant\settings\LanguageManager.cpp:385 msgid "Ukrainian" msgstr "Ukrainisch" #: ..\..\radiant\settings\LanguageManager.cpp:386 msgid "Urdu" msgstr "Urdu" #: ..\..\radiant\settings\LanguageManager.cpp:387 msgid "Uzbek" msgstr "Usbekisch" #: ..\..\radiant\settings\LanguageManager.cpp:388 msgid "Venda" msgstr "Venda" #: ..\..\radiant\settings\LanguageManager.cpp:389 msgid "Vietnamese" msgstr "Vietnamesisch" #: ..\..\radiant\settings\LanguageManager.cpp:390 msgid "Volapuek" msgstr "Volapük" #: ..\..\radiant\settings\LanguageManager.cpp:391 msgid "Walloon" msgstr "Wallonisch" #: ..\..\radiant\settings\LanguageManager.cpp:392 msgid "Wolof" msgstr "Wolof" #: ..\..\radiant\settings\LanguageManager.cpp:393 msgid "Xhosa" msgstr "Xhosa" #: ..\..\radiant\settings\LanguageManager.cpp:394 msgid "Yiddish" msgstr "Yiddisch" #: ..\..\radiant\settings\LanguageManager.cpp:395 msgid "Yoruba" msgstr "Yoruba" #: ..\..\radiant\settings\LanguageManager.cpp:396 msgid "Zhuang" msgstr "Zhuang" #: ..\..\radiant\settings\LanguageManager.cpp:397 msgid "Chinese" msgstr "Chinesisch" #: ..\..\radiant\settings\LanguageManager.cpp:398 msgid "Zulu" msgstr "Zulu" #: ..\..\radiant\textool\TexTool.cpp:38 msgid "Texture Tool" msgstr "Textur-Werkzeug" #: ..\..\radiant\ui\about\AboutDialog.cpp:24 msgid "About DarkRadiant" msgstr "Über DarkRadiant" #: ..\..\radiant\ui\about\AboutDialog.cpp:57 #, c-format msgid "Build date: %s" msgstr "Kompilierungsdatum: %s" #: ..\..\radiant\ui\about\AboutDialog.cpp:61 #, c-format msgid "Version: %d.%d.%d" msgstr "Version: %d.%d.%d" #: ..\..\radiant\ui\about\AboutDialog.cpp:73 #, c-format msgid "Vendor: %s" msgstr "Hersteller: %s" #: ..\..\radiant\ui\about\AboutDialog.cpp:74 #, c-format msgid "Version: %s" msgstr "Version: %s" #: ..\..\radiant\ui\about\AboutDialog.cpp:75 #, c-format msgid "Renderer: %s" msgstr "Renderer: %s" #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:16 #: xml_file_content.cpp:138 msgid "MD5 Animation Viewer" msgstr "MD5-Animationsvorschau" #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:58 #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:78 msgid "Model Definition" msgstr "Model-Definition" #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:61 msgid "Available Animations" msgstr "Verfügbare Animationen" #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:100 msgid "Animation" msgstr "Animation" #: ..\..\radiant\ui\animationpreview\MD5AnimationViewer.cpp:102 #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:104 msgid "File" msgstr "Datei" #: ..\..\radiant\ui\brush\QuerySidesDialog.cpp:15 msgid "Enter Number of Sides" msgstr "Anzahl der Seiten festlegen" #: ..\..\radiant\ui\brush\QuerySidesDialog.cpp:50 msgid "Number of sides: " msgstr "Anzahl der Seitenflächen:" #: ..\..\radiant\ui\commandlist\CommandList.cpp:18 msgid "Shortcut List" msgstr "Liste der Tastenkombinationen" #: ..\..\radiant\ui\commandlist\CommandList.cpp:53 #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:94 #: xml_file_content.cpp:2 msgid "Command" msgstr "Befehl" #: ..\..\radiant\ui\commandlist\CommandList.cpp:55 #: ..\..\libs\wxutil\KeyValueTable.cpp:41 msgid "Key" msgstr "Schlüssel" #: ..\..\radiant\ui\commandlist\CommandList.cpp:126 msgid "Enter new Shortcut" msgstr "Neue Tastenkombination festlegen" #: ..\..\radiant\ui\commandlist\ShortcutChooser.cpp:39 msgid "Note: This shortcut is already assigned to:" msgstr "Hinweis: diese Kombination ist bereits zugeordnet:" #: ..\..\radiant\ui\commandlist\ShortcutChooser.cpp:49 #: ..\..\plugins\script\ScriptWindow.cpp:85 #: xml_file_content.cpp:12 #: xml_file_content.cpp:3 #: xml_file_content.cpp:7 #: xml_file_content.cpp:10 #: xml_file_content.cpp:17 #: xml_file_content.cpp:8 #: xml_file_content.cpp:4 #: xml_file_content.cpp:14 #: xml_file_content.cpp:15 msgid "OK" msgstr "OK" #: ..\..\radiant\ui\commandlist\ShortcutChooser.cpp:52 #: xml_file_content.cpp:2 #: xml_file_content.cpp:6 #: xml_file_content.cpp:9 #: xml_file_content.cpp:16 #: xml_file_content.cpp:1 #: xml_file_content.cpp:3 #: xml_file_content.cpp:13 #: xml_file_content.cpp:14 #: xml_file_content.cpp:20 msgid "Cancel" msgstr "Abbrechen" #: ..\..\radiant\ui\commandlist\ShortcutChooser.cpp:136 #, c-format msgid "" "The specified shortcut is already assigned to %s\n" "Overwrite the current setting and assign this shortcut to %s instead?" msgstr "" "Diese Tastenkombination ist bereits %s zugeordnet.\n" "Soll diese Assoziation aufgehoben werden und die Tastenkombination\n" "stattdessen %s zugeordnet werden?" #: ..\..\radiant\ui\commandlist\ShortcutChooser.cpp:142 msgid "Overwrite existing shortcut?" msgstr "Bestehende Tastenkombination überschreiben?" #: ..\..\radiant\ui\common\CommandEntry.cpp:26 msgid "Go" msgstr "Los" #: ..\..\radiant\ui\common\EntityChooser.cpp:16 msgid "Select Entity" msgstr "Entity auswählen" #: ..\..\radiant\ui\common\ShaderChooser.cpp:15 msgid "Choose Shader" msgstr "Shader auswählen" #: ..\..\radiant\ui\common\ShaderDefinitionView.cpp:23 msgid "Material:" msgstr "Material:" #: ..\..\radiant\ui\common\ShaderDefinitionView.cpp:24 msgid "Defined in:" msgstr "Definiert in:" #: ..\..\radiant\ui\common\ShaderDefinitionView.cpp:41 msgid "Definition:" msgstr "Definition:" #: ..\..\radiant\ui\common\ShaderDefinitionView.cpp:88 msgid "View Shader Definition" msgstr "Shaderdefinition ansehen" #: ..\..\radiant\ui\common\ShaderSelector.cpp:195 #: ..\..\radiant\ui\common\ShaderSelector.cpp:225 #: ..\..\radiant\ui\einspector\EntityInspector.cpp:433 #: ..\..\plugins\eclasstree\EClassTree.cpp:143 #: ..\..\libs\wxutil\KeyValueTable.cpp:44 msgid "Value" msgstr "Wert" #: ..\..\radiant\ui\common\ShaderSelector.cpp:223 msgid "Attribute" msgstr "Attribut" #: ..\..\radiant\ui\common\ShaderSelector.cpp:360 #: ..\..\radiant\ui\common\ShaderSelector.cpp:378 #: ..\..\radiant\ui\common\TexturePreviewCombo.cpp:74 msgid "Defined in" msgstr "Definiert in" #: ..\..\radiant\ui\common\ShaderSelector.cpp:361 #: ..\..\radiant\ui\common\ShaderSelector.cpp:394 #: ..\..\radiant\ui\common\TexturePreviewCombo.cpp:75 #: ..\..\plugins\dm.editing\AIVocalSetChooserDialog.cpp:53 #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:136 #: xml_file_content.cpp:1 msgid "Description" msgstr "Beschreibung" #: ..\..\radiant\ui\common\ShaderSelector.cpp:369 #: ..\..\plugins\dm.conversation\CommandEditor.cpp:212 msgid "None" msgstr "Keine" #: ..\..\radiant\ui\common\ShaderSelector.cpp:377 msgid "Image map" msgstr "Bild" #: ..\..\radiant\ui\common\ShaderSelector.cpp:391 msgid "Light flags" msgstr "Licht-Flags" #: ..\..\radiant\ui\common\SoundChooser.cpp:156 msgid "Choose sound" msgstr "Sound auswählen" #: ..\..\radiant\ui\common\SoundChooser.cpp:186 msgid "Soundshader" msgstr "Soundshader" #: ..\..\radiant\ui\common\SoundChooser.cpp:205 #: ..\..\radiant\ui\entitychooser\EntityClassChooser.cpp:288 #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:301 msgid "Loading..." msgstr "Lade..." #: ..\..\radiant\ui\common\SoundShaderPreview.cpp:26 msgid "Sound Files" msgstr "Sounddateien" #: ..\..\radiant\ui\common\SoundShaderPreview.cpp:45 msgid "Play" msgstr "Abspielen" #: ..\..\radiant\ui\common\SoundShaderPreview.cpp:48 msgid "Stop" msgstr "Stop" #: ..\..\radiant\ui\common\SoundShaderPreview.cpp:150 msgid "Error: File not found." msgstr "Fehler: Datei nicht gefunden." #: ..\..\radiant\ui\common\TexturePreviewCombo.cpp:44 msgid "Copy shader name" msgstr "Kopiere Shadernamen" #: ..\..\radiant\ui\einspector\AddPropertyDialog.cpp:27 msgid "Add property" msgstr "Eigenschaft hinzufügen" #: ..\..\radiant\ui\einspector\AddPropertyDialog.cpp:31 msgid "Custom properties defined for this entity class, if any" msgstr "Benutzerdefinierte Eigenschaften dieser Entityklasse, falls definiert" #: ..\..\radiant\ui\einspector\AddPropertyDialog.cpp:76 #: ..\..\radiant\ui\einspector\EntityInspector.cpp:428 #: ..\..\plugins\eclasstree\EClassTree.cpp:140 msgid "Property" msgstr "Eigenschaft" #: ..\..\radiant\ui\einspector\ClassnamePropertyEditor.cpp:25 msgid "Choose entity class..." msgstr "Entityklasse auswählen" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:104 msgid "Show inherited properties" msgstr "Zeige vererbte Eigenschaften" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:108 msgid "Show help" msgstr "Zeige Hilfe" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:291 msgid "Add property..." msgstr "Eigenschaft hinzufügen..." #: ..\..\radiant\ui\einspector\EntityInspector.cpp:295 msgid "Delete property" msgstr "Eigenschaft entfernen" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:303 msgid "Copy Spawnarg" msgstr "Wertepaar kopieren" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:308 msgid "Cut Spawnarg" msgstr "Wertepaar ausschneiden" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:313 msgid "Paste Spawnarg" msgstr "Wertepaar einfügen" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:438 msgid "?" msgstr "?" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:650 #, c-format msgid "The name %s already exists in this map!" msgstr "Der Name %s existiert bereits in dieser Map!" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:1060 #, c-format msgid "Entity %d" msgstr "Entity %d" #: ..\..\radiant\ui\einspector\EntityInspector.cpp:1072 #, c-format msgid "Entity %d, Primitive %d" msgstr "Entity %d, Primitiv %d" #: ..\..\radiant\ui\einspector\EntityPropertyEditor.cpp:31 msgid "Choose target entity..." msgstr "Ziel-Entity auswählen..." #: ..\..\radiant\ui\einspector\FloatPropertyEditor.cpp:78 #: ..\..\radiant\ui\einspector\Vector3PropertyEditor.cpp:62 msgid "Apply..." msgstr "Anwenden..." #: ..\..\radiant\ui\einspector\LightTextureChooser.cpp:48 msgid "Choose texture" msgstr "Textur auswählen" #: ..\..\radiant\ui\einspector\ModelPropertyEditor.cpp:37 msgid "Choose model..." msgstr "Modell auswählen..." #: ..\..\radiant\ui\einspector\ModelPropertyEditor.cpp:42 msgid "Choose particle..." msgstr "Partikel auswählen..." #: ..\..\radiant\ui\einspector\SkinChooser.cpp:26 msgid "Choose Skin" msgstr "Skin auswählen" #: ..\..\radiant\ui\einspector\SkinChooser.cpp:84 msgid "Skin" msgstr "Skin" #: ..\..\radiant\ui\einspector\SkinChooser.cpp:196 msgid "Matching skins" msgstr "Passende Skins" #: ..\..\radiant\ui\einspector\SkinChooser.cpp:219 msgid "All skins" msgstr "Alle Skins" #: ..\..\radiant\ui\einspector\SkinPropertyEditor.cpp:23 #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:108 msgid "Choose skin..." msgstr "Skin auswählen..." #: ..\..\radiant\ui\einspector\SoundPropertyEditor.cpp:22 msgid "Choose sound..." msgstr "Sound auswählen..." #: ..\..\radiant\ui\einspector\TexturePropertyEditor.cpp:27 msgid "Choose texture..." msgstr "Textur auswählen..." #: ..\..\radiant\ui\einspector\Vector3PropertyEditor.cpp:54 msgid "X: " msgstr "X:" #: ..\..\radiant\ui\einspector\Vector3PropertyEditor.cpp:56 msgid " Y: " msgstr "Y:" #: ..\..\radiant\ui\einspector\Vector3PropertyEditor.cpp:58 msgid " Z: " msgstr "Z:" #: ..\..\radiant\ui\entitychooser\EntityClassChooser.cpp:25 msgid "Create entity" msgstr "Neue Entity" #: ..\..\radiant\ui\entitychooser\EntityClassChooser.cpp:299 #: ..\..\plugins\eclasstree\EClassTree.cpp:127 msgid "Classname" msgstr "Klassenname" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:21 msgid "Filter Settings" msgstr "Filtereinstellungen" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:138 msgid "enabled" msgstr "aktiviert" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:138 msgid "disabled" msgstr "deaktiviert" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:182 #: ..\..\plugins\dm.conversation\ConversationDialog.cpp:78 #: ..\..\plugins\entitylist\EntityList.cpp:54 #: xml_file_content.cpp:1 msgid "Name" msgstr "Name" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:185 msgid "State" msgstr "Zustand" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:265 msgid "NewFilter" msgstr "NeuerFilter" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:283 #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:353 msgid "Empty Filter" msgstr "Leerer Filter" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:284 msgid "No rules defined for this filter, cannot insert." msgstr "Kann diesen Filter nicht einfügen, keine Regeln definiert." #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:297 msgid "Name Conflict" msgstr "Namenskonflikt" #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:298 msgid "Cannot add, filter with same name already exists." msgstr "Kann diesen Filter nicht hinzufügen, ein weiterer Filter mit demselben Namen existiert bereits." #: ..\..\radiant\ui\filterdialog\FilterDialog.cpp:354 msgid "No rules defined for this filter. Delete it?" msgstr "Für diesen Filter sind keine Regeln definiert, soll der Filter gelöscht werden?" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:16 msgid "Edit Filter" msgstr "Filter bearbeiten" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:17 msgid "View Filter" msgstr "Filter anzeigen" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:111 #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:161 #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:306 msgid "show" msgstr "zeige" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:111 #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:162 msgid "hide" msgstr "verstecke" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:132 msgid "Index" msgstr "Index" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:145 #: ..\..\plugins\dm.objectives\ComponentsDialog.cpp:121 #: ..\..\plugins\dm.stimresponse\ClassEditor.cpp:66 #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:91 #: xml_file_content.cpp:19 msgid "Type" msgstr "Typ" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:152 msgid "Entity Key" msgstr "Entity Key" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:156 msgid "Match" msgstr "Ausdruck" #: ..\..\radiant\ui\filterdialog\FilterEditor.cpp:167 msgid "Action" msgstr "Aktion" #: ..\..\radiant\ui\findshader\FindShader.cpp:19 msgid "Find & Replace Shader" msgstr "Shader Suchen & Ersetzen" #: ..\..\radiant\ui\findshader\FindShader.cpp:20 #, c-format msgid "%d shader(s) replaced." msgstr "%d Shader ersetzt." #: ..\..\radiant\ui\layers\LayerControl.cpp:57 msgid "Click to select all in layer, hold SHIFT to deselect, hold CTRL to set as active layer." msgstr "Klicken um alles in der Ebene auszuwählen, UMSCHALT beim Klicken gedrückt halten um Auswahl aufzuheben, STRG halten um die Ebene als aktive Ebene festzulegen." #: ..\..\radiant\ui\layers\LayerControl.cpp:58 msgid "Rename this layer" msgstr "Diese Ebene umbenennen" #: ..\..\radiant\ui\layers\LayerControl.cpp:59 msgid "Delete this layer" msgstr "Diese Ebene löschen" #: ..\..\radiant\ui\layers\LayerControl.cpp:60 msgid "Toggle layer visibility" msgstr "Ebenensichtbarkeit umkehren" #: ..\..\radiant\ui\layers\LayerControl.cpp:127 msgid "Do you really want to delete this layer?" msgstr "Willst Du diese Ebene wirklich löschen?" #: ..\..\radiant\ui\layers\LayerControl.cpp:131 msgid "Confirm Layer Deletion" msgstr "Ebenenlöschung bestätigen" #: ..\..\radiant\ui\layers\LayerControl.cpp:153 msgid "Rename Layer" msgstr "Ebene umbenennen" #: ..\..\radiant\ui\layers\LayerControl.cpp:154 msgid "Enter new Layer Name" msgstr "Neuen Ebenennamen eingeben" #: ..\..\radiant\ui\layers\LayerControl.cpp:176 msgid "Could not rename layer, please try again." msgstr "Konnte Ebene nicht umbenennen, bitte nochmals versuchen." #: ..\..\radiant\ui\layers\LayerControlDialog.cpp:31 #: xml_file_content.cpp:50 msgid "Layers" msgstr "Ebenen" #: ..\..\radiant\ui\layers\LayerControlDialog.cpp:68 msgid "Show all" msgstr "Alle anzeigen" #: ..\..\radiant\ui\layers\LayerControlDialog.cpp:69 msgid "Hide all" msgstr "Alle ausblenden" #: ..\..\radiant\ui\layers\LayerControlDialog.cpp:75 #: xml_file_content.cpp:2 msgid "New" msgstr "Neu" #: ..\..\radiant\ui\lightinspector\LightInspector.cpp:29 msgid "Light properties" msgstr "Lichteigenschaften" #: ..\..\radiant\ui\mainframe\EmbeddedLayout.cpp:76 #: ..\..\radiant\ui\mainframe\FloatingLayout.cpp:59 #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:111 #: xml_file_content.cpp:52 msgid "Texture Browser" msgstr "Texturbrowser" #: ..\..\radiant\ui\mainframe\EmbeddedLayout.cpp:79 #: ..\..\radiant\ui\mainframe\FloatingLayout.cpp:62 #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:114 msgid "Textures" msgstr "Texturen" #: ..\..\radiant\ui\mainframe\LayoutCommand.h:54 msgid "Window Layout" msgstr "Fensterlayout" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:93 msgid "Settings/Multi Monitor" msgstr "Einstellungen/Multimonitor" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:112 msgid "Start DarkRadiant on monitor" msgstr "Starte DarkRadiant auf Monitor" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:131 msgid "Settings/Compatibility" msgstr "Einstellungen/Kompatibilität" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:133 msgid "Disable Windows Desktop Composition" msgstr "Desktopgestaltung deaktivieren" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:270 msgid "Exit DarkRadiant" msgstr "DarkRadiant beenden" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:383 #: ..\..\radiant\ui\mainframe\MainFrame.cpp:386 #: ..\..\plugins\uimanager\GroupDialog.cpp:28 msgid "Entity" msgstr "Entity" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:394 #: ..\..\radiant\ui\mainframe\MainFrame.cpp:397 msgid "Media" msgstr "Media" #: ..\..\radiant\ui\mainframe\MainFrame.cpp:405 #: ..\..\radiant\ui\mainframe\MainFrame.cpp:408 msgid "Console" msgstr "Konsole" #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:144 msgid "Camera Position" msgstr "Kamera-Position" #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:147 msgid "Top Left" msgstr "Oben links" #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:149 msgid "Top Right" msgstr "Oben rechts" #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:151 msgid "Bottom Left" msgstr "Unten links" #: ..\..\radiant\ui\mainframe\SplitPaneLayout.cpp:153 msgid "Bottom Right" msgstr "Unten rechts" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:17 msgid "Entities" msgstr "Entities" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:48 msgid "Entity Class" msgstr "Entityklasse" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:51 #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:51 msgid "Count" msgstr "Anzahl" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:70 msgid "Brushes:" msgstr "Brushes:" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:71 msgid "Patches:" msgstr "Patches:" #: ..\..\radiant\ui\mapinfo\EntityInfoTab.cpp:72 msgid "Entities:" msgstr "Entities:" #: ..\..\radiant\ui\mapinfo\MapInfoDialog.cpp:22 msgid "Map Info" msgstr "Map-Information" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:14 msgid "Models" msgstr "Modelle" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:45 msgid "Model" msgstr "Modell" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:48 msgid "Polys" msgstr "Polygone" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:54 msgid "Skins" msgstr "Skins" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:75 msgid "Models used:" msgstr "Benutzte Modelle:" #: ..\..\radiant\ui\mapinfo\ModelInfoTab.cpp:76 msgid "Named Skins used:" msgstr "Benutzte Skins:" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:18 msgid "Shaders" msgstr "Shader" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:20 msgid "Select elements using this shader" msgstr "Alle Elemente mit diesem Shader auswählen" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:21 msgid "Deselect elements using this shader" msgstr "Alle Elemente mit diesem Shader deselektieren" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:63 msgid "Faces" msgstr "Faces" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:66 msgid "Patches" msgstr "Patches" #: ..\..\radiant\ui\mapinfo\ShaderInfoTab.cpp:86 msgid "Shaders used:" msgstr "Benutzte Shader:" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:52 msgid "Load in Textures view" msgstr "In Texturbrowser laden" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:55 msgid "Apply to selection" msgstr "Auf Auswahl anwenden" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:58 msgid "Show Shader Definition" msgstr "Zeige Shaderdefinition" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:62 msgid "Other Materials" msgstr "Andere Shader" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:555 #: ..\..\plugins\eclasstree\EClassTree.cpp:43 msgid "Loading, please wait..." msgstr "Lade, bitte warten..." #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:671 msgid "Settings/Media Browser" msgstr "Einstellungen/Mediabrowser" #: ..\..\radiant\ui\mediabrowser\MediaBrowser.cpp:672 msgid "Load media tree at startup" msgstr "Lade Medienbaum während des Startvorgangs" #: ..\..\radiant\ui\mediabrowser\TextureDirectoryLoader.h:35 msgid "Loading textures" msgstr "Lade Texturen" #: ..\..\radiant\ui\menu\FiltersMenu.cpp:64 msgid "Activate &all Filters" msgstr "Aktiviere &alle Filter" #: ..\..\radiant\ui\menu\FiltersMenu.cpp:65 msgid "&Deactivate all Filters" msgstr "&Deaktiviere alle Filter" #: ..\..\radiant\ui\menu\FiltersMenu.cpp:68 msgid "Edit Filters..." msgstr "Filter bearbeiten..." #: ..\..\radiant\ui\modelselector\MaterialsList.cpp:45 msgid "Material" msgstr "Material" #: ..\..\radiant\ui\modelselector\MaterialsList.cpp:47 #: xml_file_content.cpp:8 msgid "Visible" msgstr "Sichtbar" #: ..\..\radiant\ui\modelselector\ModelFileFunctor.h:48 msgid "Loading models" msgstr "Lade Modelle" #: ..\..\radiant\ui\modelselector\ModelFileFunctor.h:52 msgid "Searching" msgstr "Durchsuchen" #: ..\..\radiant\ui\modelselector\ModelFileFunctor.h:77 #, c-format msgid "%d models loaded" msgstr "%d Modelle geladen" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:36 msgid "Choose Model" msgstr "Modell auswählen" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:251 msgid "Model Path" msgstr "Modell-Pfad" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:357 msgid "Model name" msgstr "Modellname" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:358 msgid "Skin name" msgstr "Skinname" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:359 msgid "Total vertices" msgstr "Gesamte Vertices" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:360 msgid "Total polys" msgstr "Gesamte Polygone" #: ..\..\radiant\ui\modelselector\ModelSelector.cpp:361 msgid "Material surfaces" msgstr "Anzahl Oberflächen" #: ..\..\radiant\ui\mousetool\BindToolDialog.cpp:18 #, c-format msgid "Select new Binding: %s" msgstr "Neue Tastenbelegung wählen: %s" #: ..\..\radiant\ui\mousetool\BindToolDialog.cpp:46 msgid "" "Please select a new button/modifier combination\n" "by clicking on the area below." msgstr "" "Bitte eine neue Maus-/Tastenkombination\n" "durch Klick auf die Fläche unten wählen." #: ..\..\radiant\ui\mousetool\BindToolDialog.cpp:53 msgid "Click here to assign" msgstr "" "Hier klicken um neue\n" "Belegung zuzuweisen" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:23 msgid "Edit Mouse Bindings" msgstr "Maustastenbelegungen ändern" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:50 msgid "Reset all mappings to default" msgstr "Alle Belegungen zurücksetzen" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:72 msgid "Double click row to edit a binding" msgstr "Doppelklicken um eine Belegung zu ändern" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:122 msgid "Tool" msgstr "Werkzeug" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:125 msgid "Modifier" msgstr "Hilfstasten" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:128 msgid "Button" msgstr "Schaltfläche" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:185 msgid "Reset to default?" msgstr "Auf Standard zurücksetzen?" #: ..\..\radiant\ui\mousetool\ToolMappingDialog.cpp:186 msgid "" "Really clear all bindings and reload\n" "them from the default settings?" msgstr "" "Wirklich alle Belegungen auf die\n" "Standardeinstellungen zurücksetzen?" #: ..\..\radiant\ui\mru\MRU.cpp:26 msgid "Recently used Maps" msgstr "Zuletzt geöffnete Maps" #: ..\..\radiant\ui\mru\MRU.cpp:109 #, c-format msgid "Could not read map file: %s" msgstr "Konnte die Mapdatei nicht öffnen: %s" #: ..\..\radiant\ui\mru\MRU.cpp:125 msgid "Settings/Map Files" msgstr "Einstellungen/Map" #: ..\..\radiant\ui\mru\MRU.cpp:127 msgid "Number of most recently used files" msgstr "Anzahl der zuletzt geöffneten Dateien" #: ..\..\radiant\ui\mru\MRU.cpp:128 msgid "Open last map on startup" msgstr "Lade zuletzt geöffnete Map beim Start" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:50 msgid "Create entity..." msgstr "Neue Entity..." #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:52 msgid "Create player start here" msgstr "Erzeuge Spielerstartpunkt hier" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:54 msgid "Move player start here" msgstr "Verschiebe Spielerstartpunkt hier" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:56 msgid "Create model..." msgstr "Neues Modell..." #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:58 msgid "Surround with monsterclip" msgstr "Mit Monsterclip einhüllen" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:60 msgid "Create light..." msgstr "Neues Licht..." #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:62 msgid "Insert prefab..." msgstr "Prefab einfügen..." #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:64 msgid "Create speaker..." msgstr "Neuer Speaker..." #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:66 msgid "Convert to func_static" msgstr "In func_static umwandeln" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:68 msgid "Reparent primitives" msgstr "Primitive neu zuordnen" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:69 msgid "Revert to worldspawn" msgstr "Zu Worldspawn umwandeln" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:70 msgid "Revert part to worldspawn" msgstr "Teil zu Worldspawn umwandeln" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:73 msgid "Merge Entities" msgstr "Entities zusammenführen" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:74 #: xml_file_content.cpp:154 msgid "Make Visportal" msgstr "Erzeuge Visportal" #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:323 msgid "Unable to create light, classname not found." msgstr "Kann Licht nicht erzeugen, Klassenname nicht gefunden." #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:352 msgid "Unable to create speaker, classname not found." msgstr "Kann Speaker nicht erzeugen, Klassenname nicht gefunden." #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:422 msgid "Unable to create model, classname not found." msgstr "Kann Modell nicht erzeugen, Klassenname nicht gefunden." #: ..\..\radiant\ui\ortho\OrthoContextMenu.cpp:430 msgid "Nothing must be selected for model creation" msgstr "Für diese Operation darf nichts ausgewählt sein." #: ..\..\radiant\ui\overlay\OverlayDialog.cpp:25 msgid "Background image" msgstr "Hintergrundbild" #: ..\..\radiant\ui\particles\ParticlesChooser.cpp:37 msgid "Choose particles" msgstr "Partikel auswählen" #: ..\..\radiant\ui\particles\ParticlesChooser.cpp:66 #: ..\..\plugins\particles\editor\ParticleEditor.cpp:158 msgid "Particle" msgstr "Partikel" #: ..\..\radiant\ui\patch\BulgePatchDialog.cpp:9 msgid "Bulge Patch" msgstr "Patch auswölben" #: ..\..\radiant\ui\patch\BulgePatchDialog.cpp:10 msgid "Noise:" msgstr "Amplitude:" #: ..\..\radiant\ui\patch\CapDialog.cpp:16 msgid "Create Cap Patch" msgstr "Patch-Cap erzeugen" #: ..\..\radiant\ui\patch\CapDialog.cpp:20 msgid "Bevel" msgstr "Bogen" #: ..\..\radiant\ui\patch\CapDialog.cpp:21 msgid "End Cap" msgstr "Doppelbogen" #: ..\..\radiant\ui\patch\CapDialog.cpp:22 msgid "Inverted Bevel" msgstr "Invertierter Bogen" #: ..\..\radiant\ui\patch\CapDialog.cpp:23 msgid "Inverted Endcap" msgstr "Invertierter Doppelbogen" #: ..\..\radiant\ui\patch\CapDialog.cpp:24 msgid "Cylinder" msgstr "Zylinder" #: ..\..\radiant\ui\patch\PatchCreateDialog.cpp:13 msgid "Create Flat Patch Mesh" msgstr "Neuer flacher Patch" #: ..\..\radiant\ui\patch\PatchInspector.cpp:28 msgid "Patch Inspector" msgstr "Patch Inspector" #: ..\..\radiant\ui\patch\PatchInspector.cpp:29 #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:55 #: ..\..\radiant\ui\transform\TransformDialog.cpp:38 msgid "Step:" msgstr "Schritt:" #: ..\..\radiant\ui\patch\PatchThickenDialog.cpp:14 msgid "Patch Thicken" msgstr "Patch-Extrusion" #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:39 msgid "Choose Prefab" msgstr "Prefab wählen" #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:90 msgid "Rescan Prefab Folders" msgstr "Prefab-Ordner neu durchsuchen" #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:121 msgid "Browse mod resources" msgstr "Mod-Ressourcen durchsuchen" #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:123 msgid "Browse custom path:" msgstr "Pfad durchsuchen:" #: ..\..\radiant\ui\prefabselector\PrefabSelector.cpp:453 msgid "" msgstr "" #: ..\..\radiant\ui\prefdialog\PrefDialog.cpp:37 msgid "DarkRadiant Preferences" msgstr "DarkRadiant Einstellungen" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:38 msgid "Surface Inspector" msgstr "Surface Inspector" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:39 msgid "Texture Properties" msgstr "Textureigenschaften" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:40 msgid "Texture Operations" msgstr "Texturoperationen" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:48 msgid "Horiz. Shift:" msgstr "Horiz. Verschiebung:" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:49 msgid "Vert. Shift:" msgstr "Vert. Verschiebung:" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:50 msgid "Horiz. Scale:" msgstr "Horiz. Skalierung:" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:51 msgid "Vert. Scale:" msgstr "Vert. Skalierung:" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:52 msgid "Rotation:" msgstr "Rotation:" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:53 #: xml_file_content.cpp:15 msgid "Shader:" msgstr "Shader:" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:57 msgid "Fit Texture:" msgstr "Texture einpassen:" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:58 msgid "Fit" msgstr "Einpassen" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:60 msgid "Align Texture:" msgstr "Textur ausrichten:" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:61 msgid "Top" msgstr "Oben" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:62 msgid "Bottom" msgstr "Unten" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:63 #: xml_file_content.cpp:16 msgid "Right" msgstr "Rechts" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:64 #: xml_file_content.cpp:15 msgid "Left" msgstr "Links" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:66 msgid "Flip Texture:" msgstr "Textur kippen:" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:67 msgid "Flip Horizontal" msgstr "Horizonal kippen" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:68 msgid "Flip Vertical" msgstr "Vertikal kippen" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:70 msgid "Modify Texture:" msgstr "Texturierung bearbeiten:" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:71 msgid "Natural" msgstr "Natürliche Skala" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:72 msgid "Normalise" msgstr "Normalisieren" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:74 msgid "Default Scale:" msgstr "Standardskalierung:" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:75 #: xml_file_content.cpp:9 msgid "Texture Lock" msgstr "Textur-Lock" #: ..\..\radiant\ui\surfaceinspector\SurfaceInspector.cpp:634 msgid "Both fit values must be > 0." msgstr "Beide Fit-Werte müssen größer als 0 sein." #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:48 msgid "Seek in Media Browser" msgstr "In Media Browser zeigen" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:97 #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:851 msgid "No shader" msgstr "Kein Shader" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1041 msgid "Settings/Texture Browser" msgstr "Einstellungen/Texturbrowser" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1052 msgid "Texture Thumbnail Scale" msgstr "Skalierung der Texturvorschaubilder" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1054 msgid "Uniform texture thumbnail size (pixels)" msgstr "Einheitliche Größe der Texturvorschaubilder (in Pixel)" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1055 msgid "Texture scrollbar" msgstr "Texturbrowser-Scrollbalken" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1056 msgid "Mousewheel Increment" msgstr "Bildlaufgeschwindgkeit beim Scrollen" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1057 msgid "Max shadername length" msgstr "Maximal dargestellte Länge für Shadernamen" #: ..\..\radiant\ui\texturebrowser\TextureBrowser.cpp:1059 msgid "Show Texture Filter" msgstr "Zeige Textur-Filter" #: ..\..\radiant\ui\transform\TransformDialog.cpp:26 msgid "Arbitrary Transformation" msgstr "Freie Transformation" #: ..\..\radiant\ui\transform\TransformDialog.cpp:27 msgid "Rotation" msgstr "Rotation" #: ..\..\radiant\ui\transform\TransformDialog.cpp:28 msgid "Scale" msgstr "Skalierung" #: ..\..\radiant\ui\transform\TransformDialog.cpp:30 msgid "X-Axis Rotate:" msgstr "Rotation um X-Achse" #: ..\..\radiant\ui\transform\TransformDialog.cpp:31 msgid "Y-Axis Rotate:" msgstr "Rotation um Y-Achse" #: ..\..\radiant\ui\transform\TransformDialog.cpp:32 msgid "Z-Axis Rotate:" msgstr "Rotation um Z-Achse" #: ..\..\radiant\ui\transform\TransformDialog.cpp:34 msgid "X-Axis Scale:" msgstr "Skalierung X-Achse" #: ..\..\radiant\ui\transform\TransformDialog.cpp:35 msgid "Y-Axis Scale:" msgstr "Skalierung Y-Achse" #: ..\..\radiant\ui\transform\TransformDialog.cpp:36 msgid "Z-Axis Scale:" msgstr "Skalierung Z-Achse" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:195 msgid "Settings/Orthoview" msgstr "Einstellungen/2D-Ansicht" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:197 msgid "View chases Mouse Cursor during Drags" msgstr "Ansicht folgt Mauszeiger bei Verschiebe-Operationen" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:198 msgid "Maximum Chase Mouse Speed" msgstr "Maximale Folgegeschwindigkeit" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:199 msgid "Update Views on Camera Movement" msgstr "Aktualisiere 2D-Ansichten bei Kamerabewegungen" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:200 msgid "Show Crosshairs" msgstr "Zeige Fadenkreuz" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:201 msgid "Show Grid" msgstr "Zeige Raster" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:202 msgid "Show Size Info" msgstr "Zeige Größeninformation" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:203 msgid "Show Entity Angle Arrow" msgstr "Zeige Richtungspfeile der Entities" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:204 msgid "Show Entity Names" msgstr "Zeige Namen der Entities" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:205 #: xml_file_content.cpp:79 msgid "Show Blocks" msgstr "Zeige Blöcke" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:206 msgid "Show Coordinates" msgstr "Zeige Koordinaten" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:207 #: xml_file_content.cpp:82 msgid "Show Axes" msgstr "Zeige Achsen" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:208 #: xml_file_content.cpp:81 msgid "Show Window Outline" msgstr "Zeige Fensterumrandung" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:209 #: xml_file_content.cpp:83 msgid "Show Workzone" msgstr "Zeige Arbeitsbereich" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:210 msgid "Translate Manipulator always constrained to Axis" msgstr "Translationen sind immer achsengebunden" #: ..\..\radiant\xyview\GlobalXYWnd.cpp:211 msgid "Higher Selection Priority for Entities" msgstr "Höhere Auswahlpriorität für Entities" #: ..\..\radiant\xyview\tools\BrushCreatorTool.cpp:25 msgid "Drag-create Brush" msgstr "Erzeuge neue Brush" #: ..\..\radiant\xyview\tools\CameraAngleTool.h:28 msgid "Point Camera" msgstr "Kamera ausrichten" #: ..\..\radiant\xyview\tools\CameraMoveTool.h:27 msgid "Drag Camera" msgstr "Kamera verschieben" #: ..\..\radiant\xyview\tools\ClipperTool.cpp:21 #: xml_file_content.cpp:148 #: xml_file_content.cpp:12 #: xml_file_content.cpp:17 msgid "Clipper" msgstr "Clipper" #: ..\..\radiant\xyview\tools\MoveViewTool.h:27 msgid "Drag View" msgstr "Ansicht verschieben" #: ..\..\radiant\xyview\tools\ZoomTool.h:30 msgid "Zoom View" msgstr "Ansicht zoomen" #: ..\..\radiant\xyview\XYWnd.cpp:231 msgid "XY Top" msgstr "XY Oben" #: ..\..\radiant\xyview\XYWnd.cpp:234 msgid "XZ Front" msgstr "XZ Vorne" #: ..\..\radiant\xyview\XYWnd.cpp:237 msgid "YZ Side" msgstr "YZ Seite" #: ..\..\radiant\xyview\XYWnd.cpp:637 #, c-format msgid "x: %6.1lf y: %6.1lf z: %6.1lf" msgstr "x: %6.1lf y: %6.1lf z: %6.1lf" #: ..\..\plugins\dm.conversation\CommandArgumentItem.cpp:100 #: ..\..\plugins\dm.conversation\CommandEditor.cpp:40 #, c-format msgid "Actor %d (%s)" msgstr "Akteur %d (%s)" #: ..\..\plugins\dm.conversation\CommandEditor.cpp:24 msgid "Edit Command" msgstr "Befehl bearbeiten" #: ..\..\plugins\dm.conversation\ConversationDialog.cpp:30 msgid "Conversation Editor" msgstr "Konversations-Editor" #: ..\..\plugins\dm.conversation\ConversationDialog.cpp:278 #, c-format msgid "Unable to create conversation Entity: class '%s' not found." msgstr "Kann Konversationsentity nicht anlegen, Klasse '%s' nicht gefunden." #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:24 msgid "Edit Conversation" msgstr "Konversation bearbeiten" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:67 msgid "Actor (click to edit)" msgstr "Akteur (zum Bearbeiten klicken)" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:92 #: xml_file_content.cpp:1 msgid "Actor" msgstr "Akteur" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:96 msgid "Wait" msgstr "Warten" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:201 #, c-format msgid "Actor %d" msgstr "Akteur %d" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:203 #: ..\..\plugins\dm.stimresponse\ResponseEffect.cpp:206 msgid "yes" msgstr "Ja" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:203 #: ..\..\plugins\dm.stimresponse\ResponseEffect.cpp:206 msgid "no" msgstr "Nein" #: ..\..\plugins\dm.conversation\ConversationEditor.cpp:369 msgid "New Actor" msgstr "Neuer Akteur" #: ..\..\plugins\dm.conversation\ConversationEntity.cpp:48 msgid "New Conversation" msgstr "Neue Konversation" #: ..\..\plugins\dm.conversation\ConversationEntityFinder.h:79 #: ..\..\plugins\dm.objectives\ObjectiveEntityFinder.cpp:36 #, c-format msgid "%s at [ %s ]" msgstr "%s bei [ %s ]" #: ..\..\plugins\dm.conversation\plugin.cpp:50 msgid "Conversations..." msgstr "Konversationen..." #: ..\..\plugins\dm.difficulty\DifficultyDialog.cpp:26 msgid "Difficulty Editor" msgstr "Schwierigkeitsstufen-Editor" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:76 #: xml_file_content.cpp:4 msgid "Setting" msgstr "Einstellung" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:91 msgid "Assign" msgstr "Zuweisen" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:92 #: ..\..\plugins\dm.stimresponse\ClassEditor.cpp:81 #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:51 #: xml_file_content.cpp:2 #: xml_file_content.cpp:5 #: xml_file_content.cpp:8 #: xml_file_content.cpp:11 #: xml_file_content.cpp:1 #: xml_file_content.cpp:3 #: xml_file_content.cpp:17 #: xml_file_content.cpp:6 msgid "Add" msgstr "Addieren" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:93 msgid "Multiply" msgstr "Multiplizieren" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:94 msgid "Ignore" msgstr "Ignorieren" #: ..\..\plugins\dm.difficulty\DifficultyEditor.cpp:152 msgid "This default setting is overridden, cannot edit." msgstr "Diese Standardeinstellung wurde außer Kraft gesetzt, Editieren nicht möglich." #: ..\..\plugins\dm.difficulty\DifficultySettings.cpp:168 msgid " (overridden)" msgstr "(außer Kraft)" #: ..\..\plugins\dm.difficulty\plugin.cpp:58 msgid "Difficulty..." msgstr "Schwierigkeitsstufe..." #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:59 msgid "Can operate Doors" msgstr "Kann Türen bedienen" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:60 msgid "Can light Torches" msgstr "Kann Fackeln anzünden" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:61 msgid "Can operate Switch Lights" msgstr "Kann Lichtschalter betätigen" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:62 msgid "Can operate Elevators" msgstr "Kann Lifte bedienen" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:63 msgid "Can greet others" msgstr "Kann andere grüßen" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:64 msgid "Can search" msgstr "Kann suchen" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:65 msgid "AI is civilian" msgstr "AI ist Zivilist" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:66 msgid "Start sleeping" msgstr "Schläft von anfang an" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:67 msgid "Lay down to the left" msgstr "Nach links hinlegen" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:68 msgid "Start sitting" msgstr "Sitzt von anfang an" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:69 msgid "Patrol" msgstr "Patroullieren" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:70 msgid "Animal Patrol Mode" msgstr "Patrol-Modus für Tiere" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:71 msgid "Start in Alert Idle State" msgstr "Starte im \"alarmierten\" Idle-Zustand" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:72 msgid "Disable Alert Idle State" msgstr "\"Alarmierter\" Idle-Zustand nicht erlaubt" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:73 msgid "Drunk" msgstr "Betrunken" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:74 msgid "Body is shoulderable" msgstr "Kann geschultert werden" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:75 msgid "AI doesn't think outside the player PVS" msgstr "AI außerhalb des Spieler-PVS denkt nicht" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:77 msgid "AI can drown" msgstr "AI kann ertrinken" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:80 msgid "AI can be flatfooted" msgstr "AI kann kalt erwischt werden" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:81 msgid "AI is immune to KOs at high alert levels" msgstr "AI ist gegen KOs immun (auf hohem Alert-Level)" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:82 msgid "AI is immune to KOs" msgstr "AI ist immun gegen KOs" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:83 msgid "AI is immune to Gas" msgstr "AI ist immun gegen Gas" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:85 msgid "Team" msgstr "Team" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:86 msgid "Sitting Angle" msgstr "Sitz-Winkel" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:87 msgid "Drunk Acuity Factor" msgstr "Sinnesschärfen-Faktor bei Trunkenheit" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:88 msgid "Visual Acuity" msgstr "Sehschärfe" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:89 msgid "Audio Acuity" msgstr "Hörschärfe" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:91 msgid "Horizontal FOV" msgstr "Horizontaler FOV" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:92 msgid "Vertical FOV" msgstr "Vertikaler FOV" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:94 msgid "Min. Interleave Distance" msgstr "Min. Interleaving Distanz" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:95 msgid "Max. Interleave Distance" msgstr "Max. Interleaving Distanz" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:97 msgid "Health" msgstr "Gesundheit" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:98 msgid "Critical Health" msgstr "Kritischer Gesundheitswert" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:99 msgid "Melee Range" msgstr "Reichweite für Handwaffen" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:103 msgid "Appearance" msgstr "Erscheinungsbild" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:108 msgid "Skin: " msgstr "Skin:" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:109 msgid "Head: " msgstr "Kopf:" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:109 #: ..\..\plugins\dm.editing\AIHeadPropertyEditor.cpp:31 msgid "Choose AI head..." msgstr "Kopf für AI auswählen..." #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:110 msgid "Vocal Set: " msgstr "Sprachsatz:" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:110 msgid "Choose Vocal Set..." msgstr "Sprachsatz für AI auswählen" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:115 msgid "Behaviour" msgstr "Verhalten" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:157 msgid "Abilities" msgstr "Fähigkeiten" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:172 msgid "Optimization" msgstr "Optimierung" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:184 msgid "Health / Combat" msgstr "Gesundheit / Kampf" #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:266 #: ..\..\plugins\dm.editing\AIEditingPanel.cpp:269 msgid "AI" msgstr "AI" #: ..\..\plugins\dm.editing\AIHeadChooserDialog.cpp:18 msgid "Choose AI Head" msgstr "Kopf für AI auswählen" #: ..\..\plugins\dm.editing\AIVocalSetChooserDialog.cpp:19 msgid "Choose AI Vocal Set" msgstr "Sprachsatz für AI auswählen" #: ..\..\plugins\dm.editing\AIVocalSetChooserDialog.cpp:44 msgid "Available Sets" msgstr "Verfügbare Sätze:" #: ..\..\plugins\dm.editing\AIVocalSetPreview.cpp:114 msgid "Error: File not found." msgstr "Fehler: Datei nicht gefunden." #: ..\..\plugins\dm.editing\AIVocalSetPropertyEditor.cpp:31 msgid "Select Vocal Set..." msgstr "Sprachsatz auswählen..." #: ..\..\plugins\dm.editing\FixupMap.cpp:26 msgid "Fixup in progress" msgstr "Fixup läuft" #: ..\..\plugins\dm.editing\FixupMap.cpp:60 #, c-format msgid "Processing line %d..." msgstr "Verarbeite Zeile %d..." #: ..\..\plugins\dm.editing\FixupMap.cpp:65 msgid "Fixup cancelled" msgstr "Fixup abgebrochen" #: ..\..\plugins\dm.editing\FixupMap.cpp:71 msgid "Completed" msgstr "Fertig" #: ..\..\plugins\dm.editing\FixupMap.cpp:155 #: ..\..\plugins\dm.editing\FixupMap.cpp:166 msgid "File not readable" msgstr "Datei nicht lesbar" #: ..\..\plugins\dm.editing\FixupMap.cpp:156 msgid "The specified file doesn't exist." msgstr "Die angegebene Datei existiert nicht." #: ..\..\plugins\dm.editing\FixupMap.cpp:167 msgid "The specified file can't be opened." msgstr "Die angegebene Datei kann nicht geöffnet werden." #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:15 msgid "Fixup Map" msgstr "Map-Fixup" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:16 msgid "Fixup File" msgstr "Fixup-Datei" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:47 #, c-format msgid "%d shaders replaced." msgstr "%d Shader ersetzt." #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:48 #, c-format msgid "%d entities replaced." msgstr "%d Entities ersetzt." #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:49 #, c-format msgid "%d models replaced." msgstr "%d Modelle ersetzt." #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:50 #, c-format msgid "%d spawnargs replaced." msgstr "%d Wertepaare ersetzt." #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:55 msgid "Errors occurred:" msgstr "Aufgetretene Fehler:" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:61 #, c-format msgid "(Line %d): %s" msgstr "(Zeile %d): %s" #: ..\..\plugins\dm.editing\FixupMapDialog.cpp:66 msgid "Fixup Results" msgstr "Fixup Ergebnisse" #: ..\..\plugins\dm.editing\plugin.cpp:64 msgid "Fixup Map..." msgstr "Map-Fixup..." #: ..\..\plugins\dm.gui\GuiSelector.cpp:22 msgid "Choose a Gui Definition..." msgstr "GUI-Definition auswählen..." #: ..\..\plugins\dm.gui\GuiSelector.cpp:130 #: ..\..\plugins\dm.gui\GuiSelector.cpp:139 msgid "Gui Path" msgstr "GUI Pfad" #: ..\..\plugins\dm.gui\GuiSelector.cpp:135 msgid "One-Sided Readable Guis" msgstr "Einseitige Schriftstück-GUIs" #: ..\..\plugins\dm.gui\GuiSelector.cpp:144 msgid "Two-Sided Readable Guis" msgstr "Zweiseitige Schriftstück-GUIs" #: ..\..\plugins\dm.gui\plugin.cpp:93 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:42 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:533 msgid "Readable Editor" msgstr "Schriftstück-Editor" #: ..\..\plugins\dm.gui\plugin.cpp:100 msgid "Reload Readable Guis" msgstr "Schriftstück-GUIs neu laden" #: ..\..\plugins\dm.gui\plugin.cpp:110 msgid "Settings/Readable Editor" msgstr "Einstellungen/Schriftstück-Editor" #: ..\..\plugins\dm.gui\plugin.cpp:114 msgid "Mod/xdata" msgstr "Mod/xdata" #: ..\..\plugins\dm.gui\plugin.cpp:115 msgid "Mod Base/xdata" msgstr "Mod Base/xdata" #: ..\..\plugins\dm.gui\plugin.cpp:116 #: ..\..\plugins\dm.gui\plugin.cpp:120 msgid "Custom Folder" msgstr "Benutzerdefinierter Ordner" #: ..\..\plugins\dm.gui\plugin.cpp:118 msgid "XData Storage Folder" msgstr "Ordner zum Ablegen der XData-Dateien" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:44 msgid "" "Cannot run Readable Editor on this selection.\n" "Please select a single XData entity." msgstr "" "Schriftstück-Editor kann für diese Auswahl nicht ausgeführt werden.\n" "Bitte eine einzelne XData-Entity auswählen." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:47 msgid "Page Editing:" msgstr "Textbearbeitung" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:48 msgid "General Properties:" msgstr "Allgemeine Eigenschaften:" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:229 msgid "Insert whole Page" msgstr "Ganze Seite einfügen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:230 msgid "Insert on left Side" msgstr "Links einfügen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:231 msgid "Insert on right Side" msgstr "Rechts einfügen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:237 msgid "Delete whole Page" msgstr "Ganze Seite löschen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:238 msgid "Delete on left Side" msgstr "Links löschen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:239 msgid "Delete on right Side" msgstr "Rechts löschen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:245 msgid "Append Page" msgstr "Seite anfügen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:250 msgid "Prepend Page" msgstr "Seite voranstellen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:255 msgid "Show last XData import summary" msgstr "Zeige Zusammenfassung des letzten XData-Imports" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:256 msgid "Show duplicated definitions" msgstr "Zeige doppelte Definitionen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:257 msgid "Show Gui import summary" msgstr "Zeige Zusammenfassung des letzten GUI-Imports" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:294 msgid "" msgstr "" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:319 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:635 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1374 #, c-format msgid "Failed to import %s." msgstr "Import von %s fehlgeschlagen." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:321 msgid "Creating a new XData definition..." msgstr "Erzeuge eine neue XData-Definition..." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:323 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:637 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:656 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:711 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1376 #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:62 msgid "Do you want to open the import summary?" msgstr "Willst Du die Import-Zusammenfassung anzeigen?" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:325 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:639 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:658 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:713 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1378 #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:79 msgid "Import failed" msgstr "Import fehlgeschlagen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:379 msgid "You have imported an XData definition that is contained in a PK4, which can't be accessed for saving." msgstr "Du hast eine XData-Definition importiert, die in einem PK4-File gespeichert ist." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:381 msgid "Please rename your XData definition, so that it is stored under a different filename." msgstr "Bitte benenne Deine XData-Definition um, so dass sie unter einem neuen Namen gespeichert wird." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:398 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:419 #, c-format msgid "Failed to open %s for saving." msgstr "Konnte %s nicht zum Speichern öffnen." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:405 msgid "Merging failed, because the length of the definition to be overwritten could not be retrieved." msgstr "Fehler beim Zusammenführen. Die Länge der zu überschreibenden Definition konnte nicht abgerufen werden." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:443 msgid "Mod path not defined. Using Base path..." msgstr "Mod-Pfad nicht definiert, verwende Base-Pfad..." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:456 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:474 msgid "Mod Base path not defined, neither is Mod path. Using Engine path..." msgstr "Mod-Base-Pfad nicht definiert, Mod-Pfad auch nicht, verwende Base-Pfad..." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:461 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:479 msgid "Mod Base path not defined. Using Mod path..." msgstr "Mod-Base-Pfad nicht definiert, verwende Mod-Pfad..." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:505 #, c-format msgid "" "%s%s already exists in another path.\n" "\n" "XData will be stored in %s%s!" msgstr "" "%s%s existiert bereits unter anderem Pfad.\n" "\n" "XData wird in %s%s gespeichert!" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:654 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:709 #, c-format msgid "Failed to load gui definition %s." msgstr "Laden der GUI-Definition %s fehlgeschlagen." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:810 msgid "Import definition?" msgstr "Definition importieren?" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:811 #, c-format msgid "The definition %s already exists. Should it be imported?" msgstr "Die Definition %s existiert bereits, soll sie importiert werden?" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:835 msgid "Import failed:" msgstr "Import fehlgeschlagen:" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:838 msgid "Consult the import summary for further information." msgstr "Bitte sieh in der Import-Zusammenfassung nach, um weitere Informationen zu erhalten." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:861 #, c-format msgid "To avoid duplicated XData definitions the current definition has been renamed to %s." msgstr "Die aktuelle Definition wurde in %s umbenannt, um doppelte XData-Definitionen zu vermeiden." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:865 msgid "XData has been renamed." msgstr "XData wurde umbenannt." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1133 msgid "The specified gui definition is not a readable." msgstr "Die angegebene GUI-Definition ist kein Schriftstück." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1138 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1150 msgid "The specified gui definition is not suitable for the currently chosen page-layout." msgstr "Die angegebene GUI-Definition ist für das momentan gewählte Seitenlayout nicht geeignet." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1160 msgid "Failure during import." msgstr "Fehler beim Import." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1163 msgid "The specified Definition does not exist." msgstr "Die angegebene Definition existiert nicht." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1171 msgid "Not a suitable Gui Definition!" msgstr "Keine geeignete GUI-Definition!" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1172 msgid "Start the Gui Browser?" msgstr "GUI-Browser öffnen?" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1206 msgid "Switching to default Gui..." msgstr "Schalte zu Standard-GUI um..." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1207 msgid "You didn't choose a Gui. Using the default Gui now." msgstr "Du hast keine GUI ausgewählt. Es wird die Standard-GUI verwendet." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1224 msgid "No import summary available. An XData definition has to be imported first..." msgstr "Die Importzusammenfassung ist erst nach dem Import einer XData-Definition verfügbar." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1236 msgid "XData import summary" msgstr "XData Importzusammenfassung" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1244 msgid "No import summary available. Browse Gui Definitions first." msgstr "Die Importzusammenfassung ist erst nach dem Öffnen des GUI-Browsers verfügbar." #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1255 msgid "Gui import summary" msgstr "GUI Importzusammenfassung" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1321 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1339 msgid "Please specify an XData name first!" msgstr "Bitte zuerst einen XData-Namen angeben!" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1528 #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1554 msgid "Duplicated XData definitions" msgstr "Mehrfach vorkommende XData-Definitionen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1529 msgid "There are no duplicated definitions!" msgstr "Es gibt keine mehrfachen XData-Definitionen" #: ..\..\plugins\dm.gui\ReadableEditorDialog.cpp:1548 #, c-format msgid "%s has been defined in:" msgstr "%s ist definiert in:" #: ..\..\plugins\dm.gui\ReadablePopulator.h:35 msgid "Analysing Guis" msgstr "Analysiere GUIs" #: ..\..\plugins\dm.gui\ReadableReloader.h:31 msgid "Reloading Guis" msgstr "Neuladen der GUIs" #: ..\..\plugins\dm.gui\XData.cpp:254 #: ..\..\plugins\dm.gui\XData.cpp:282 #: ..\..\plugins\dm.gui\XData.cpp:364 #: ..\..\plugins\dm.gui\XData.cpp:379 msgid "Page Index out of bounds." msgstr "Seitenindex ungültig." #: ..\..\plugins\dm.gui\XData.h:120 #: ..\..\plugins\dm.gui\XData.h:127 msgid "GUI Page Index out of bounds." msgstr "GUI-Seitenindex ungültig" #: ..\..\plugins\dm.gui\XDataSelector.cpp:17 msgid "Choose an XData Definition..." msgstr "XData-Definition auswählen..." #: ..\..\plugins\dm.gui\XDataSelector.cpp:48 msgid "Xdata Path" msgstr "Xdata-Pfad" #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:20 msgid "Choose a file..." msgstr "Datei auswählen..." #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:60 #, c-format msgid "%s successfully imported." msgstr "%s erfolgreich importiert" #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:64 msgid "Problems during import" msgstr "Fehler beim Import." #: ..\..\plugins\dm.gui\XdFileChooserDialog.cpp:99 msgid "The requested definition has been found in multiple Files. Choose the file:" msgstr "Die angeforderte Definition wurde in mehreren Dateien gefunden, bitte die genaue Datei auswählen:" #: ..\..\plugins\dm.objectives\ce\AIFindBodyComponentEditor.cpp:31 msgid "Body:" msgstr "Text:" #: ..\..\plugins\dm.objectives\ce\AIFindBodyComponentEditor.cpp:36 #: ..\..\plugins\dm.objectives\ce\AlertComponentEditor.cpp:43 #: ..\..\plugins\dm.objectives\ce\DestroyComponentEditor.cpp:37 #: ..\..\plugins\dm.objectives\ce\ItemComponentEditor.cpp:37 #: ..\..\plugins\dm.objectives\ce\KillComponentEditor.cpp:38 #: ..\..\plugins\dm.objectives\ce\KnockoutComponentEditor.cpp:38 #: ..\..\plugins\dm.objectives\ce\PickpocketComponentEditor.cpp:37 msgid "Amount:" msgstr "Anzahl:" #: ..\..\plugins\dm.objectives\ce\AIFindItemComponentEditor.cpp:23 #: ..\..\plugins\dm.objectives\ce\DestroyComponentEditor.cpp:31 #: ..\..\plugins\dm.objectives\ce\ItemComponentEditor.cpp:31 #: ..\..\plugins\dm.objectives\ce\PickpocketComponentEditor.cpp:31 msgid "Item:" msgstr "Gegenstand:" #: ..\..\plugins\dm.objectives\ce\AlertComponentEditor.cpp:37 msgid "AI:" msgstr "AI:" #: ..\..\plugins\dm.objectives\ce\AlertComponentEditor.cpp:46 msgid "Minimum Alert Level:" msgstr "Minimale Alarmierungs-Stufe" #: ..\..\plugins\dm.objectives\ce\CustomClockedComponentEditor.cpp:36 msgid "Script Function:" msgstr "Skriptfunktion:" #: ..\..\plugins\dm.objectives\ce\CustomClockedComponentEditor.cpp:42 #: ..\..\plugins\dm.objectives\ce\DistanceComponentEditor.cpp:68 msgid "Clock interval:" msgstr "Zeitintervall:" #: ..\..\plugins\dm.objectives\ce\CustomClockedComponentEditor.cpp:48 #: ..\..\plugins\dm.objectives\ce\DistanceComponentEditor.cpp:70 msgid "seconds:" msgstr "Sekunden:" #: ..\..\plugins\dm.objectives\ce\CustomComponentEditor.cpp:17 msgid "" "A custom component requires no specifiers,\n" "the state of this component is manually controlled \n" "(i.e. by scripts or triggers)." msgstr "" "Eine benutzerdefinierte Komponente benötigt keine Spezifikatoren,\n" "der Zustand der Komponente wird anderweitig gesteuert\n" "(z.B. durch Skript oder einen Trigger)." #: ..\..\plugins\dm.objectives\ce\DistanceComponentEditor.cpp:50 #: ..\..\plugins\dm.objectives\ce\InfoLocationComponentEditor.cpp:24 #: ..\..\plugins\dm.objectives\ce\LocationComponentEditor.cpp:24 msgid "Entity:" msgstr "Entity:" #: ..\..\plugins\dm.objectives\ce\DistanceComponentEditor.cpp:56 msgid "Location Entity:" msgstr "Orts-Entity:" #: ..\..\plugins\dm.objectives\ce\DistanceComponentEditor.cpp:62 msgid "Distance:" msgstr "Distanz:" #: ..\..\plugins\dm.objectives\ce\InfoLocationComponentEditor.cpp:30 #: ..\..\plugins\dm.objectives\ce\LocationComponentEditor.cpp:30 msgid "Location:" msgstr "Ort:" #: ..\..\plugins\dm.objectives\ce\KillComponentEditor.cpp:32 msgid "Kill target:" msgstr "Tötungs-Ziel:" #: ..\..\plugins\dm.objectives\ce\KnockoutComponentEditor.cpp:32 msgid "Knockout target:" msgstr "KO-Ziel:" #: ..\..\plugins\dm.objectives\ce\ReadableClosedComponentEditor.cpp:22 #: ..\..\plugins\dm.objectives\ce\ReadableOpenedComponentEditor.cpp:22 #: ..\..\plugins\dm.objectives\ce\ReadablePageReachedComponentEditor.cpp:31 msgid "Readable:" msgstr "Schriftstück:" #: ..\..\plugins\dm.objectives\ce\ReadablePageReachedComponentEditor.cpp:37 msgid "Page Number:" msgstr "Seite:" #: ..\..\plugins\dm.objectives\ComponentsDialog.cpp:30 msgid "Edit Objective" msgstr "Ziel editieren:" #: ..\..\plugins\dm.objectives\ComponentType.cpp:21 msgid "AI is killed" msgstr "AI wird getötet" #: ..\..\plugins\dm.objectives\ComponentType.cpp:26 msgid "AI is knocked out" msgstr "AI wird KO geschlagen" #: ..\..\plugins\dm.objectives\ComponentType.cpp:31 msgid "AI finds an item" msgstr "AI findet einen Gegenstand" #: ..\..\plugins\dm.objectives\ComponentType.cpp:36 msgid "AI finds a body" msgstr "AI findet einen Körper" #: ..\..\plugins\dm.objectives\ComponentType.cpp:41 msgid "AI is alerted" msgstr "AI wird alarmiert" #: ..\..\plugins\dm.objectives\ComponentType.cpp:46 msgid "Object is destroyed" msgstr "Objekt wird zerstört" #: ..\..\plugins\dm.objectives\ComponentType.cpp:51 msgid "Player possesses item" msgstr "Spieler besitzt Gegenstand" #: ..\..\plugins\dm.objectives\ComponentType.cpp:56 msgid "Player pickpockets AI" msgstr "Spieler bestiehlt AI" #: ..\..\plugins\dm.objectives\ComponentType.cpp:61 msgid "Item is in location" msgstr "Gegenstand ist am/im Ort" #: ..\..\plugins\dm.objectives\ComponentType.cpp:66 msgid "Item is in info_location" msgstr "Gegenstand ist am/im Ort (info_location)" #: ..\..\plugins\dm.objectives\ComponentType.cpp:71 msgid "Custom script" msgstr "Benutzerdefiniertes Skript" #: ..\..\plugins\dm.objectives\ComponentType.cpp:77 msgid "Custom script queried periodically" msgstr "Benutzerdefiniertes Skript wird periodisch abgefragt" #: ..\..\plugins\dm.objectives\ComponentType.cpp:84 msgid "Two entities are within a radius of each other" msgstr "Zwei Entities befinden sich innerhalb eines bestimmten Radius" #: ..\..\plugins\dm.objectives\ComponentType.cpp:92 msgid "Readable is opened." msgstr "Ein Schriftstück wird geöffnet" #: ..\..\plugins\dm.objectives\ComponentType.cpp:100 msgid "Readable is closed." msgstr "Ein Schriftstück wird geschlossen" #: ..\..\plugins\dm.objectives\ComponentType.cpp:108 msgid "A certain page of a readable is reached." msgstr "Eine bestimmte Seite eines Schriftstücks wird angezeigt." #: ..\..\plugins\dm.objectives\DifficultyPanel.cpp:22 msgid "All Levels" msgstr "All Stufen" #: ..\..\plugins\dm.objectives\DifficultyPanel.cpp:31 msgid "Level 1: Easy" msgstr "Level 1: Leicht" #: ..\..\plugins\dm.objectives\DifficultyPanel.cpp:32 msgid "Level 2: Hard" msgstr "Level 1: Hart" #: ..\..\plugins\dm.objectives\DifficultyPanel.cpp:33 msgid "Level 3: Expert" msgstr "Level 1: Experte" #: ..\..\plugins\dm.objectives\LogicEditor.cpp:24 msgid "Success Logic:" msgstr "Logik für Erfüllung:" #: ..\..\plugins\dm.objectives\LogicEditor.cpp:25 msgid "Failure Logic:" msgstr "Logik für Fehlschlag:" #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:18 msgid "Edit Mission Logic" msgstr "Missions-Logik bearbeiten" #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:21 msgid "This is the standard logic for all difficulty levels" msgstr "Das ist die Standard-Logik für alle Schwierigkeitsstufen." #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:24 msgid "" "These logics override the standard logic for the given difficulty level\n" "if the logic string is non-empty." msgstr "" "Diese Logik überschreibt die Standard-Logik für die angegebene Schwierigkeitsstufe\n" "wenn das Logik-Eingabefeld nicht leer ist." #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:45 msgid "Default Logic" msgstr "Standard-Logik" #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:57 msgid "Difficulty-specific Logic" msgstr "Logik für bestimmte Schwierigkeitsstufe" #: ..\..\plugins\dm.objectives\MissionLogicDialog.cpp:66 #, c-format msgid "Logic for Difficulty Level %d" msgstr "Logik für Schwierigkeitsstufe %d" #: ..\..\plugins\dm.objectives\Objective.h:73 msgid "INCOMPLETE" msgstr "NICHT ERFÜLLT" #: ..\..\plugins\dm.objectives\Objective.h:74 msgid "COMPLETE" msgstr "ERFÜLLT" #: ..\..\plugins\dm.objectives\Objective.h:75 msgid "FAILED" msgstr "FEHLGESCHLAGEN" #: ..\..\plugins\dm.objectives\Objective.h:76 msgid "INVALID" msgstr "UNGÜLTIG" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:24 #: xml_file_content.cpp:13 msgid "Edit Objective Conditions" msgstr "Missionsziel-Bedingungen bearbeiten" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:145 msgid "Change Objective State" msgstr "Setze Status eines Missionsziels" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:147 msgid "Change Visibility" msgstr "Setze Misionsziel auf sichtbar/unsichtbar" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:149 msgid "Change Mandatory Flag" msgstr "Setze die 'obligatorisch'-Eigenschaft" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:211 #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:212 #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:213 #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:214 #, c-format msgid "Set state to %s" msgstr "Setze Status auf %s" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:225 msgid "Set Invisible" msgstr "Unsichtbar machen" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:226 msgid "Set Visible" msgstr "Sichtbar machen" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:237 msgid "Clear mandatory flag" msgstr "Nicht obligatorisch machen" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:238 msgid "Set mandatory flag" msgstr "Obligatorisch machen" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:463 #, c-format msgid "Condition affecting objective %d" msgstr "Bedingung betreffend Missionsziel %d" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:493 #, c-format msgid "If Objective %d in Mission %d is in state '%s' do the following: " msgstr "Wenn das Missionsziel %d in Mission Nr. %d den Status '%s' hat:" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:504 #, c-format msgid "Set State on Objective %d to %s" msgstr "Setze den Status von Missionsziel %d auf %s" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:511 #, c-format msgid "Make Objective %d visible" msgstr "Missionsziel %d sichtbar machen" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:515 #, c-format msgid "Make Objective %d invisible" msgstr "Missionsziel %d unsichtbar machen" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:522 #, c-format msgid "Make Objective %d mandatory" msgstr "Missionsziel %d obligatorisch machen" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:526 #, c-format msgid "Make Objective %d not mandatory" msgstr "Missionsziel %d nicht obligatorisch machen" #: ..\..\plugins\dm.objectives\ObjectiveConditionsDialog.cpp:535 msgid "This condition is not valid or complete yet." msgstr "Diese Bedingung ist noch nicht gültig oder vollständig." #: ..\..\plugins\dm.objectives\ObjectiveEntity.cpp:280 #, c-format msgid "New objective %d" msgstr "Neues Ziel %d" #: ..\..\plugins\dm.objectives\objectives.cpp:68 msgid "Objectives..." msgstr "Missionsziele..." #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:34 msgid "Mission Objectives" msgstr "Missionsziele" #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:100 msgid "Start" msgstr "Start" #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:138 msgid "Diff." msgstr "Schw." #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:263 msgid "Exception occurred: " msgstr "Ausnahmefehler:" #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:440 msgid "Unable to create Objective Entity: classes not defined in registry." msgstr "Kann Ziel-Entity nicht erzeugen: die Entityklassen sind nicht in der Registierung definiert." #: ..\..\plugins\dm.objectives\ObjectivesEditor.cpp:469 #, c-format msgid "Unable to create Objective Entity: class '%s' not found." msgstr "Kann Ziel-Entity nicht erzeugen: EntityKlasse '%s' nicht gefunden." #: ..\..\plugins\dm.objectives\Specifier.cpp:20 msgid "entity" msgstr "Entity" #: ..\..\plugins\dm.objectives\Specifier.cpp:20 msgid "entities" msgstr "Entities" #: ..\..\plugins\dm.objectives\Specifier.cpp:43 msgid "" msgstr "" #: ..\..\plugins\dm.objectives\Specifier.cpp:46 msgid "entity " msgstr "entity" #: ..\..\plugins\dm.objectives\Specifier.cpp:54 #, c-format msgid "%d loot in gold" msgstr "%d Loot in Gold" #: ..\..\plugins\dm.objectives\Specifier.cpp:57 #, c-format msgid "%d loot in goods" msgstr "%d Loot in Waren" #: ..\..\plugins\dm.objectives\Specifier.cpp:60 #, c-format msgid "%d loot in jewels" msgstr "%d Loot in Edelsteinen" #: ..\..\plugins\dm.objectives\Specifier.cpp:63 #, c-format msgid "%d loot" msgstr "%d Loot" #: ..\..\plugins\dm.objectives\Specifier.cpp:66 #, c-format msgid "%d of \"%s\"" msgstr "%d \"%s\"" #: ..\..\plugins\dm.objectives\Specifier.cpp:70 #, c-format msgid "%s of type %s" msgstr "%s vom Typ %s" #: ..\..\plugins\dm.objectives\Specifier.cpp:73 #, c-format msgid "%s of spawnclass %s" msgstr "%s der Spawnklasse %s" #: ..\..\plugins\dm.objectives\Specifier.cpp:76 #, c-format msgid "%s AI of type %s" msgstr "%s AI vom Typ %s" #: ..\..\plugins\dm.objectives\Specifier.cpp:79 #, c-format msgid "%s AI of team %s" msgstr "%s AI vom Team %s" #: ..\..\plugins\dm.objectives\Specifier.cpp:82 #, c-format msgid "%s AI of %s" msgstr "%s AI von %s" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:16 msgid "No specifier" msgstr "Kein Spezifikator" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:20 msgid "Name of single entity" msgstr "Name der Entity" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:24 msgid "Overall (component-specific)" msgstr "Insgesamt (komponentenspezifisch)" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:29 msgid "Group identifier (component-specific)" msgstr "Gruppenidentifizierer (komponentenspezifisch)" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:34 msgid "Any entity of specified class" msgstr "Irgendeine Entity der angegebenen Klasse" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:39 msgid "Any entity with SDK-level spawnclass" msgstr "Irgendeine Entity der angegebenen SDK Klasse" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:44 msgid "Any AI of specified type" msgstr "Irgendeine AI des angegebenen Typs" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:48 msgid "Any AI on specified team" msgstr "Irgendeine AI des angegebenen Teams" #: ..\..\plugins\dm.objectives\SpecifierType.cpp:53 msgid "Any AI with specified combat status" msgstr "Irgendeine AI mit dem angegebenen Kampfzustand" #: ..\..\plugins\dm.stimresponse\ClassEditor.cpp:62 msgid "S/R" msgstr "S/R" #: ..\..\plugins\dm.stimresponse\ClassEditor.cpp:82 #: xml_file_content.cpp:7 msgid "Remove" msgstr "Entfernen" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:53 #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:397 #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:412 #: ..\..\plugins\dm.stimresponse\StimEditor.cpp:403 #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:95 #: xml_file_content.cpp:178 #: xml_file_content.cpp:3 #: xml_file_content.cpp:7 #: xml_file_content.cpp:9 #: xml_file_content.cpp:15 #: xml_file_content.cpp:2 #: xml_file_content.cpp:5 #: xml_file_content.cpp:6 #: xml_file_content.cpp:18 msgid "Delete" msgstr "Löschen" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:106 #: xml_file_content.cpp:2 msgid "Name:" msgstr "Name:" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:117 msgid "" "Note: Please beware that deleting custom stims may\n" "affect other entities as well. So check before you delete." msgstr "" "Hinweis: Bitte beachte, dass sich das Löschen benutzerdefinierter Stims auf\n" "andere Entities auswirken kann. Gehe deshalb sorgfältig vor." #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:129 msgid "Add Stim Type" msgstr "Stimtyp hinzufügen" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:130 msgid "Remove Stim Type" msgstr "Stimtyp entfernen" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:185 #: ..\..\plugins\dm.stimresponse\StimTypes.cpp:290 msgid "Custom Stim" msgstr "Benutzerdefinierter Stim" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:209 msgid "Delete Custom Stim" msgstr "Benutzerdefinierten Stim entfernen" #: ..\..\plugins\dm.stimresponse\CustomStimEditor.cpp:210 msgid "" "Beware that other entities might still be using this stim type.\n" "Do you really want to delete this custom stim?" msgstr "" "Beachte, dass andere Entities diesen Stimtyp noch verwenden könnten.\n" "Möchtest du diesen benutzerdefinierten Stim wirklich löschen?" #: ..\..\plugins\dm.stimresponse\EffectEditor.cpp:22 msgid "Edit Response Effect" msgstr "Response-Effekt editieren" #: ..\..\plugins\dm.stimresponse\EffectEditor.cpp:111 msgid "Effect:" msgstr "Effekt:" #: ..\..\plugins\dm.stimresponse\EffectEditor.cpp:118 #: xml_file_content.cpp:2 msgid "Active" msgstr "Aktiv" #: ..\..\plugins\dm.stimresponse\EffectEditor.cpp:123 msgid "Arguments" msgstr "Argumente" #: ..\..\plugins\dm.stimresponse\plugin.cpp:55 msgid "Stim/Response..." msgstr "Stim/Response..." #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:24 #: xml_file_content.cpp:5 msgid "Response Effects" msgstr "Response-Effekte" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:231 msgid "Effect" msgstr "Effekt" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:234 msgid "Details (double-click to edit)" msgstr "Details (doppelklicken zum Editieren)" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:391 #: ..\..\plugins\dm.stimresponse\StimEditor.cpp:397 msgid "Activate" msgstr "Aktivieren" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:393 #: ..\..\plugins\dm.stimresponse\StimEditor.cpp:399 msgid "Deactivate" msgstr "Deaktivieren" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:395 #: ..\..\plugins\dm.stimresponse\StimEditor.cpp:401 #: xml_file_content.cpp:11 msgid "Duplicate" msgstr "Duplizieren" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:402 msgid "Add new Effect" msgstr "Neuen Effekt hinzufügen" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:404 #: xml_file_content.cpp:6 #: xml_file_content.cpp:12 #: xml_file_content.cpp:4 #: xml_file_content.cpp:8 msgid "Edit" msgstr "Bearbeiten" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:407 #: xml_file_content.cpp:4 msgid "Move Up" msgstr "Nach oben" #: ..\..\plugins\dm.stimresponse\ResponseEditor.cpp:409 #: xml_file_content.cpp:5 msgid "Move Down" msgstr "Nach unten" #: ..\..\plugins\dm.stimresponse\ResponseEffect.cpp:195 msgid "Error: eclass pointer invalid." msgstr "Fehler: Entityklassenzeiger ungültig." #: ..\..\plugins\dm.stimresponse\StimResponseEditor.cpp:26 msgid "Stim/Response Editor" msgstr "Stim/Response-Editor" #: ..\..\plugins\dm.stimresponse\StimResponseEditor.cpp:31 msgid "A single entity must be selected to edit Stim/Response properties." msgstr "Um Stim/Response-Eigenschaften zu editieren muss genau eine Entity ausgewählt sein." #: ..\..\plugins\dm.stimresponse\StimResponseEditor.cpp:97 msgid "Stims" msgstr "Stims" #: ..\..\plugins\dm.stimresponse\StimResponseEditor.cpp:104 msgid "Responses" msgstr "Responses" #: ..\..\plugins\dm.stimresponse\StimResponseEditor.cpp:111 msgid "Custom Stims" msgstr "Benutzerdefinierte Stims" #: ..\..\plugins\eclassmgr\EClassManager.cpp:311 msgid "Reloading Defs" msgstr "Neuladen der Definitionen" #: ..\..\plugins\eclasstree\EClassTree.cpp:23 msgid "Entity Class Tree" msgstr "Entity-Klassenbaum" #: ..\..\plugins\eclasstree\plugin.cpp:51 msgid "Entity Class Tree..." msgstr "Entity-Klassenbaum..." #: ..\..\plugins\entity\EntityCreator.cpp:38 msgid "createNodeForEntity(): cannot create entity for NULL entityclass." msgstr "createNodeForEntity: Entity für Entity-Klasse NULL kann nicht erstellt werden." #: ..\..\plugins\entitylist\EntityList.cpp:23 #: xml_file_content.cpp:59 msgid "Entity List" msgstr "Entity-Liste" #: ..\..\plugins\entitylist\EntityList.cpp:68 msgid "Focus camera on selected entity" msgstr "Kamera auf ausgewählte Entity richten" #: ..\..\plugins\entitylist\EntityList.cpp:69 msgid "List visible nodes only" msgstr "Nur sichtbare Elemente anzeigen" #: ..\..\plugins\eventmanager\MouseToolGroup.cpp:23 msgid "XY View" msgstr "XY-Ansicht" #: ..\..\plugins\eventmanager\MouseToolGroup.cpp:25 #: xml_file_content.cpp:49 msgid "Camera View" msgstr "Kamera" #: ..\..\plugins\eventmanager\MouseToolGroup.cpp:27 msgid "Unknown" msgstr "Unbekannt" #: ..\..\plugins\filetypes\FileTypeRegistry.cpp:13 msgid "All Files" msgstr "Alle Dateien" #: ..\..\plugins\grid\Grid.cpp:151 msgid "Settings/Grid" msgstr "Einstellungen/Raster" #: ..\..\plugins\grid\Grid.cpp:153 msgid "Default Grid Size" msgstr "Standard-Rastergröße" #: ..\..\plugins\grid\Grid.cpp:157 msgid "Lines" msgstr "Linien" #: ..\..\plugins\grid\Grid.cpp:158 msgid "Dotted Lines" msgstr "Gepunktete Linien" #: ..\..\plugins\grid\Grid.cpp:159 msgid "More Dotted Lines" msgstr "Stärker gepunktete Linien" #: ..\..\plugins\grid\Grid.cpp:160 msgid "Crosses" msgstr "Kreuze" #: ..\..\plugins\grid\Grid.cpp:161 msgid "Dots" msgstr "Punkte" #: ..\..\plugins\grid\Grid.cpp:162 msgid "Big Dots" msgstr "Große Punkte" #: ..\..\plugins\grid\Grid.cpp:163 msgid "Squares" msgstr "Quadrate" #: ..\..\plugins\grid\Grid.cpp:165 msgid "Major Grid Style" msgstr "Hauptgitter-Stil" #: ..\..\plugins\grid\Grid.cpp:166 msgid "Minor Grid Style" msgstr "Nebengitter-Stil" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:50 #: ..\..\plugins\mapdoom3\Quake3MapReader.cpp:45 #, c-format msgid "" "Failed parsing entity %d:\n" "%s" msgstr "" "Fehler beim Parsen der Entity %d\n" "%s" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:95 #: ..\..\plugins\mapdoom3\Quake4MapReader.cpp:49 msgid "Unable to parse map version (parse exception)." msgstr "Konnte Map-Version nicht parsen (Parse-Exception)" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:103 #: ..\..\plugins\mapdoom3\Quake4MapReader.cpp:57 msgid "Could not recognise map version number format." msgstr "Nicht erkennbares Versionsnummernformat" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:111 #: ..\..\plugins\mapdoom3\Quake4MapReader.cpp:65 #, c-format msgid "Incorrect map version: required %f, found %f" msgstr "Ungültige Map-Version: erwartet: %f, gefunden: %f" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:144 #: ..\..\plugins\mapdoom3\Quake3MapReader.cpp:94 #, c-format msgid "Primitive #%d: parse error" msgstr "Primitiv #%d: Parserfehler" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:154 #: ..\..\plugins\mapdoom3\Quake3MapReader.cpp:104 #, c-format msgid "Primitive #%d: parse exception %s" msgstr "Primitiv #%d: Parserfehler %s" #: ..\..\plugins\mapdoom3\Doom3MapReader.cpp:245 #: ..\..\plugins\mapdoom3\Quake3MapReader.cpp:195 #, c-format msgid "Parsed invalid value '%s' for key '%s'" msgstr "Ungültigen Wert '%s' für Schlüssel '%s' eingelesen" #: ..\..\plugins\mapdoom3\primitiveparsers\BrushDef.cpp:125 #, c-format msgid "BrushDefParser: invalid token '%s'" msgstr "BrushDefParser: Ungültiges Token '%s'" #: ..\..\plugins\mapdoom3\primitiveparsers\BrushDef3.cpp:115 #, c-format msgid "BrushDef3Parser: invalid token '%s'" msgstr "BrushDef3Parser: ungültiges Token '%s'" #: ..\..\plugins\mapdoom3\primitiveparsers\BrushDef3.cpp:186 #, c-format msgid "BrushDef3ParserQuake4: invalid token '%s'" msgstr "BrushDef3ParserQuake4: ungültiges Token '%s'" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:43 msgid "Particle Editor" msgstr "Partikeleditor" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:207 msgid "Stage" msgstr "Stufe" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1033 #, c-format msgid "Note: changes will be written to the file %s" msgstr "Hinweis: alle Änderungen werden in den File %s geschrieben" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1340 msgid "Save Changes" msgstr "Änderungen Speichern" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1341 #, c-format msgid "" "Do you want to save the changes\n" "you made to the particle %s?" msgstr "Änderungen am Partikel %s speichern?" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1374 #, c-format msgid "" "Error saving particle definition:\n" "%s" msgstr "" "Fehler beim Speichern der Partikeldefinition:\n" "%s" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1504 msgid "Select .prt file" msgstr "Eine .prt-Datei auswählen" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1538 msgid "Enter Particle Name" msgstr "Partikelnamen eingeben" #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1552 msgid "Cannot create particle with an empty name." msgstr "Es ist nicht möglich einen Partikel ohne Namen zu erstellen." #: ..\..\plugins\particles\editor\ParticleEditor.cpp:1567 msgid "This name is already in use." msgstr "Dieser Name ist bereits in Verwendung." #: ..\..\plugins\particles\editor\ParticleEditorModule.h:56 msgid "Particle Editor..." msgstr "Partikeleditor..." #: ..\..\plugins\particles\ParticlesManager.cpp:256 msgid "Cannot save particle, it has not been registered yet." msgstr "Kann Partikeldefinition nicht speichern, sie wurde nicht registriert." #: ..\..\plugins\particles\ParticlesManager.cpp:286 #: ..\..\plugins\particles\ParticlesManager.cpp:314 #, c-format msgid "Cannot open file for writing: %s" msgstr "Kann die Datei nicht im Schreibmodus öffnen: %s" #: ..\..\plugins\particles\ParticlesManager.cpp:327 #, c-format msgid "Cannot open file for reading: %s" msgstr "Kann die Datei nicht im Lesemodus öffnen: %s" #: ..\..\plugins\particles\ParticlesManager.cpp:374 #, c-format msgid "Could not remove the file %s" msgstr "Kann die Datei nicht entfernen: %s" #: ..\..\plugins\particles\ParticlesManager.cpp:388 #, c-format msgid "Could not rename the temporary file %s" msgstr "Konnte die temporäre Datei nicht entfernen: %s" #: ..\..\plugins\script\ScriptingSystem.cpp:180 #: ..\..\plugins\script\ScriptingSystem.cpp:183 msgid "Script" msgstr "Skript" #: ..\..\plugins\script\ScriptingSystem.cpp:459 msgid "Reload Scripts" msgstr "Skripts neu laden" #: ..\..\plugins\script\ScriptMenu.cpp:51 msgid "No scripts available" msgstr "Keine Skripts verfügbar" #: ..\..\plugins\script\ScriptWindow.cpp:37 msgid "Python Script Input" msgstr "Python Skripteingabe" #: ..\..\plugins\script\ScriptWindow.cpp:39 msgid "Run Script" msgstr "Starte Skript" #: ..\..\plugins\shaders\Doom3ShaderSystem.cpp:301 msgid "Loading Shaders" msgstr "Lade Shader" #: ..\..\plugins\shaders\ShaderFileLoader.cpp:96 #, c-format msgid "Parsing material file %s" msgstr "Lade Material Datei %s" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:27 msgid "Edit Colour Schemes" msgstr "Farbschemas bearbeiten" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:84 #: xml_file_content.cpp:5 msgid "Colour" msgstr "Farbe" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:96 #: xml_file_content.cpp:4 msgid "Copy" msgstr "Kopieren" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:271 msgid "Copy Colour Scheme" msgstr "Farbschema kopieren" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:271 msgid "Enter a name for the new scheme:" msgstr "Namen für das neue Schema eingeben:" #: ..\..\plugins\uimanager\colourscheme\ColourSchemeEditor.cpp:281 msgid "A Scheme with that name already exists." msgstr "Es existiert bereits ein Schema mit diesem Namen." #: ..\..\plugins\uimanager\FilterMenu.cpp:16 msgid "_Filters" msgstr "_Filter" #: ..\..\plugins\undo\UndoSystem.cpp:378 msgid "Settings/Undo System" msgstr "Einstellungen/Undo" #: ..\..\plugins\undo\UndoSystem.cpp:379 msgid "Undo Queue Size" msgstr "Größe des Undo-Stapels" #: ..\..\plugins\wavefront\WaveFrontModule.cpp:31 msgid "Save as Obj" msgstr "Als OBJ speichern" #: ..\..\plugins\wavefront\WaveFrontModule.cpp:89 msgid "Export Selection as OBJ..." msgstr "Auswahl als OBJ exportieren..." #: ..\..\libs\wxutil\dialog\MessageBox.cpp:21 #: xml_file_content.cpp:8 #: xml_file_content.cpp:10 #: xml_file_content.cpp:3 #: xml_file_content.cpp:21 msgid "Save" msgstr "Speichern" #: ..\..\libs\wxutil\dialog\MessageBox.cpp:21 msgid "Close without saving" msgstr "Schließen ohne zu speichern" #: ..\..\libs\wxutil\FileChooser.cpp:65 msgid "Open File" msgstr "Datei öffnen" #: ..\..\libs\wxutil\FileChooser.cpp:65 msgid "Save File" msgstr "Datei speichern" #: ..\..\libs\wxutil\FileChooser.cpp:115 msgid "All Files (*.*)" msgstr "Alle Dateien (*.*)" #: ..\..\libs\wxutil\ModalProgressDialog.cpp:17 #: ..\..\libs\wxutil\ModalProgressDialog.cpp:27 msgid "Operation cancelled by user" msgstr "Abbruch durch Benutzer" #: ..\..\libs\wxutil\Modifier.h:147 msgid "Alt" msgstr "Alt" #: ..\..\libs\wxutil\Modifier.h:148 msgid "Ctrl" msgstr "Strg" #: ..\..\libs\wxutil\Modifier.h:149 msgid "Shift" msgstr "Umschalt" #: ..\..\libs\wxutil\PathEntry.cpp:72 msgid "Choose File" msgstr "Datei auswählen" #: ..\..\libs\wxutil\PathEntry.cpp:93 msgid "Choose Directory" msgstr "Verzeichnis auswählen" #: ..\..\libs\wxutil\preview\ModelPreview.cpp:146 #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:177 #, c-format msgid "" "Unable to setup the preview,\n" "could not find the entity class %s" msgstr "" "Vorschau nicht möglich,\n" "Entityklasse %s nicht vorhanden." #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:53 msgid "Show coordinate axes" msgstr "Zeige Koordinatenachsen" #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:59 msgid "Show wireframe" msgstr "Zeige Wireframe" #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:63 #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:65 msgid "Auto Loop" msgstr "Auto Loop" #: ..\..\libs\wxutil\preview\ParticlePreview.cpp:69 msgid "Reload Particle Defs" msgstr "Partikel-Definitionen neu laden" #: ..\..\libs\wxutil\preview\RenderPreview.cpp:75 #: ..\..\libs\wxutil\preview\RenderPreview.cpp:77 #: xml_file_content.cpp:1 msgid "Filters" msgstr "Filter" #: xml_file_content.cpp:1 msgid "&File" msgstr "&Datei" #: xml_file_content.cpp:2 msgid "&New Map" msgstr "&Neue Map" #: xml_file_content.cpp:3 msgid "&Open..." msgstr "&Öffnen" #: xml_file_content.cpp:4 msgid "&Import map..." msgstr "&Map importieren" #: xml_file_content.cpp:5 msgid "Import &prefab..." msgstr "&Prefab importieren" #: xml_file_content.cpp:6 msgid "&Save" msgstr "&Speichern" #: xml_file_content.cpp:7 msgid "Save &as..." msgstr "Speichern &als..." #: xml_file_content.cpp:8 msgid "Save © as..." msgstr "&Kopie speichern als..." #: xml_file_content.cpp:9 msgid "&Save selected as Map..." msgstr "&Auswahl als Map speichern..." #: xml_file_content.cpp:10 msgid "&Save selected as prefab..." msgstr "Auswahl als &Prefab speichern..." #: xml_file_content.cpp:11 msgid "Save selected as Collision Model..." msgstr "_Auswahl als Kollisionsmodell speichern..." #: xml_file_content.cpp:12 msgid "Save ®ion..." msgstr "&Region speichern" #: xml_file_content.cpp:13 msgid "&Reload Models" msgstr "&Modelle neu laden" #: xml_file_content.cpp:14 msgid "Reload Selected Models" msgstr "Ausgewählte Modelle neu laden" #: xml_file_content.cpp:15 msgid "Reload S&kins" msgstr "S&kins neu laden" #: xml_file_content.cpp:16 #: xml_file_content.cpp:26 msgid "Reload Materials" msgstr "Materials neu laden" #: xml_file_content.cpp:17 msgid "Reload Defs" msgstr "Defs neu laden" #: xml_file_content.cpp:18 msgid "Reload Particles" msgstr "Partikel neu laden" #: xml_file_content.cpp:19 msgid "Select &Game..." msgstr "Spiel auswählen..." #: xml_file_content.cpp:20 msgid "&Pointfile" msgstr "Pointfile" #: xml_file_content.cpp:21 msgid "E&xit" msgstr "B&eenden" #: xml_file_content.cpp:22 msgid "&Edit" msgstr "Bearbeiten" #: xml_file_content.cpp:23 msgid "&Undo" msgstr "Rückgängig" #: xml_file_content.cpp:24 msgid "&Redo" msgstr "Wiede&rherstellen" #: xml_file_content.cpp:25 msgid "&Copy" msgstr "&Kopieren" #: xml_file_content.cpp:26 msgid "&Paste" msgstr "&Einfügen" #: xml_file_content.cpp:27 msgid "Paste to Camera" msgstr "Bei Kameraposition einfügen" #: xml_file_content.cpp:28 msgid "&Duplicate" msgstr "&Duplizieren" #: xml_file_content.cpp:29 msgid "D&elete" msgstr "&Löschen" #: xml_file_content.cpp:30 msgid "Rep&arent Primitives" msgstr "Primitive neu zuordnen (Elternknoten ändern)" #: xml_file_content.cpp:31 msgid "Reparent Primitives to &Worldspawn" msgstr "Primitive Worldspawn zuordnen" #: xml_file_content.cpp:32 msgid "Merge selected Entities" msgstr "Ausgewählte Entities zusammenführen" #: xml_file_content.cpp:33 msgid "Copy Shader" msgstr "Shader kopieren" #: xml_file_content.cpp:34 msgid "Paste Shader" msgstr "Shader einfügen" #: xml_file_content.cpp:35 msgid "Paste Shader (Natural)" msgstr "Shader einfügen (Natürliche Skalierung)" #: xml_file_content.cpp:36 msgid "C&lear selection" msgstr "Auswahl aufheben" #: xml_file_content.cpp:37 msgid "&Invert selection" msgstr "Auswahl umkehren" #: xml_file_content.cpp:38 msgid "Select complete t&all" msgstr "Inneres auswählen (Projektion)" #: xml_file_content.cpp:39 msgid "Select i&nside" msgstr "Inneres auswählen" #: xml_file_content.cpp:40 msgid "Select &touching" msgstr "Berührtes auswählen" #: xml_file_content.cpp:41 msgid "Select Children" msgstr "Kinder auswählen" #: xml_file_content.cpp:42 msgid "Expand selection to all Siblings" msgstr "Auswahl auf Geschwister ausweiten" #: xml_file_content.cpp:43 msgid "Select all of type" msgstr "Alles vom selben Typ auswählen" #: xml_file_content.cpp:44 msgid "Keyboard Shortcuts..." msgstr "Tastenkombinationen..." #: xml_file_content.cpp:45 msgid "Mouse Bindings..." msgstr "Maustastenbelegungen..." #: xml_file_content.cpp:46 msgid "Pre&ferences..." msgstr "Einstellungen..." #: xml_file_content.cpp:47 msgid "V&iew" msgstr "Ansicht" #: xml_file_content.cpp:48 msgid "New XY view" msgstr "Neue XY-Ansicht" #: xml_file_content.cpp:51 msgid "Console View" msgstr "Konsole" #: xml_file_content.cpp:53 msgid "Media Browser" msgstr "Mediabrowser" #: xml_file_content.cpp:54 msgid "Entity Inspector" msgstr "Entity Inspector" #: xml_file_content.cpp:55 msgid "&Light Inspector" msgstr "Light Inspector" #: xml_file_content.cpp:56 msgid "&Surface Inspector" msgstr "Surface Inspector" #: xml_file_content.cpp:57 msgid "&Patch Inspector" msgstr "Patch Inspector" #: xml_file_content.cpp:58 msgid "&Texture Tool" msgstr "Textur-Werkzeug" #: xml_file_content.cpp:61 msgid "&Center" msgstr "Zentrieren" #: xml_file_content.cpp:62 msgid "&Up Floor" msgstr "Ein Stockwerk höher" #: xml_file_content.cpp:63 msgid "&Down Floor" msgstr "Ein Stockwerk tiefer" #: xml_file_content.cpp:64 msgid "Far Clip Plane In" msgstr "Entfernte Clip-Ebene heran" #: xml_file_content.cpp:65 msgid "Far Clip Plane Out" msgstr "Entfernte Clip-Ebene hinaus" #: xml_file_content.cpp:66 msgid "Next leak spot" msgstr "Nächster Leak-Spot" #: xml_file_content.cpp:67 msgid "Previous leak spot" msgstr "Vorheriger Leak-Spot" #: xml_file_content.cpp:68 msgid "Orthographic" msgstr "2D-Ansicht" #: xml_file_content.cpp:69 msgid "Next (XY, XZ, YZ)" msgstr "Nächste Ansicht (XY, XZ, YZ)" #: xml_file_content.cpp:70 msgid "XY (Top)" msgstr "XY (Oben)" #: xml_file_content.cpp:71 msgid "YZ" msgstr "YZ" #: xml_file_content.cpp:72 msgid "XZ" msgstr "XZ" #: xml_file_content.cpp:73 msgid "&XY 100%" msgstr "XY 100%" #: xml_file_content.cpp:74 msgid "&XY Zoom In" msgstr "XY Einzoomen" #: xml_file_content.cpp:75 msgid "&XY Zoom Out" msgstr "XY Auszoomen" #: xml_file_content.cpp:76 msgid "Show" msgstr "Zeigen" #: xml_file_content.cpp:77 msgid "Show &Angles" msgstr "Zeige Winkel" #: xml_file_content.cpp:78 msgid "Show &Names" msgstr "Zeige Namen" #: xml_file_content.cpp:80 msgid "Show C&oordinates" msgstr "Zeige Koordinaten" #: xml_file_content.cpp:84 msgid "Show size info" msgstr "Zeige Größeninformation" #: xml_file_content.cpp:85 msgid "Hide/Show" msgstr "Verbergen/Zeigen" #: xml_file_content.cpp:86 msgid "Hide Selected" msgstr "Auswahl verbergen" #: xml_file_content.cpp:87 msgid "Hide Deselected" msgstr "Nicht ausgewähltes verbergen" #: xml_file_content.cpp:88 msgid "Show hidden" msgstr "Zeige Verborgenes" #: xml_file_content.cpp:90 msgid "&Switch off" msgstr "Ausschalten" #: xml_file_content.cpp:91 msgid "Set from &XY view" msgstr "Über XY-Ansicht festlegen" #: xml_file_content.cpp:92 msgid "Set from &Brush" msgstr "Über Brush festlegen" #: xml_file_content.cpp:93 msgid "Set from Se&lection" msgstr "Über Auswahl festlegen" #: xml_file_content.cpp:94 msgid "Colours..." msgstr "Farben..." #: xml_file_content.cpp:95 msgid "Background Image..." msgstr "Hintergrundbild..." #: xml_file_content.cpp:96 msgid "Mo&dify" msgstr "Komponentenmodus" #: xml_file_content.cpp:97 #: xml_file_content.cpp:16 msgid "Components" msgstr "Komponenten" #: xml_file_content.cpp:98 msgid "&Edges" msgstr "Edges" #: xml_file_content.cpp:99 msgid "&Vertices" msgstr "Vertices" #: xml_file_content.cpp:100 msgid "&Faces" msgstr "Faces" #: xml_file_content.cpp:101 msgid "En&tities" msgstr "Entities" #: xml_file_content.cpp:102 msgid "Nudge" msgstr "Verschieben" #: xml_file_content.cpp:103 msgid "Nudge Left" msgstr "Verschiebe nach links" #: xml_file_content.cpp:104 msgid "Nudge Right" msgstr "Verschiebe nach rechts" #: xml_file_content.cpp:105 msgid "Nudge Up" msgstr "Verschiebe nach oben" #: xml_file_content.cpp:106 msgid "Nudge Down" msgstr "Verschiebe nach unten" #: xml_file_content.cpp:107 #: xml_file_content.cpp:15 msgid "Rotate" msgstr "Drehen" #: xml_file_content.cpp:108 msgid "Rotate X" msgstr "Drehe um X-Achse" #: xml_file_content.cpp:109 msgid "Rotate Y" msgstr "Drehe um Y-Achse" #: xml_file_content.cpp:110 msgid "Rotate Z" msgstr "Drehe um Z-Achse" #: xml_file_content.cpp:111 msgid "Mirror" msgstr "Spiegeln" #: xml_file_content.cpp:112 msgid "Mirror &X" msgstr "Spiegeln um X-Achse" #: xml_file_content.cpp:113 msgid "Mirror &Y" msgstr "Spiegeln um Y-Achse" #: xml_file_content.cpp:114 msgid "Mirror &Z" msgstr "Spiegeln um Z-Achse" #: xml_file_content.cpp:115 msgid "Free Model Rotation" msgstr "Freie Modelldrehung" #: xml_file_content.cpp:116 msgid "Rotate and scale..." msgstr "Drehen und skalieren..." #: xml_file_content.cpp:117 msgid "&Grid" msgstr "Raster" #: xml_file_content.cpp:118 msgid "Snap selected to grid" msgstr "Auswahl am Raster ausrichten" #: xml_file_content.cpp:119 msgid "Grid0.125" msgstr "Grid0.125" #: xml_file_content.cpp:120 msgid "Grid0.25" msgstr "Grid0.25" #: xml_file_content.cpp:121 msgid "Grid0.5" msgstr "Grid0.5" #: xml_file_content.cpp:122 msgid "Grid1" msgstr "Grid1" #: xml_file_content.cpp:123 msgid "Grid2" msgstr "Grid2" #: xml_file_content.cpp:124 msgid "Grid4" msgstr "Grid4" #: xml_file_content.cpp:125 msgid "Grid8" msgstr "Grid8" #: xml_file_content.cpp:126 msgid "Grid16" msgstr "Grid16" #: xml_file_content.cpp:127 msgid "Grid32" msgstr "Grid32" #: xml_file_content.cpp:128 msgid "Grid64" msgstr "Grid64" #: xml_file_content.cpp:129 msgid "Grid128" msgstr "Grid128" #: xml_file_content.cpp:130 msgid "Grid256" msgstr "Grid256" #: xml_file_content.cpp:131 msgid "M&ap" msgstr "Map" #: xml_file_content.cpp:132 msgid "Find brush..." msgstr "Brush suchen..." #: xml_file_content.cpp:133 msgid "Map info..." msgstr "Map-Information" #: xml_file_content.cpp:134 msgid "E&ntity" msgstr "Entity" #: xml_file_content.cpp:135 msgid "&Revert group to worldspawn" msgstr "Gruppe zu Worldspawn umwandeln" #: xml_file_content.cpp:136 msgid "&Connect selected entities" msgstr "Ausgewählte Entities verbinden" #: xml_file_content.cpp:137 msgid "&Bind selected entities" msgstr "Ausgewählte Entities verknüpfen" #: xml_file_content.cpp:139 msgid "B&rush" msgstr "Brush" #: xml_file_content.cpp:140 msgid "Prism..." msgstr "Prisma..." #: xml_file_content.cpp:141 msgid "Cone..." msgstr "Kegel..." #: xml_file_content.cpp:142 msgid "Sphere..." msgstr "Kugel..." #: xml_file_content.cpp:143 msgid "CSG" msgstr "CSG" #: xml_file_content.cpp:144 msgid "Make &Hollow" msgstr "Aushöhlen" #: xml_file_content.cpp:145 msgid "Make &Room" msgstr "Raum erstellen" #: xml_file_content.cpp:146 msgid "CSG &Subtract" msgstr "CSG Subtraktion" #: xml_file_content.cpp:147 msgid "CSG &Merge" msgstr "CSG Zusammenfügen" #: xml_file_content.cpp:149 msgid "Clip Selection" msgstr "Auswahl clippen" #: xml_file_content.cpp:150 msgid "Split Selection" msgstr "Auswahl splitten" #: xml_file_content.cpp:151 msgid "Flip Clip Orientation" msgstr "Clip-Orientierung umkehren" #: xml_file_content.cpp:152 msgid "Texture lock" msgstr "Textur-Lock" #: xml_file_content.cpp:153 msgid "Create Decal Patches" msgstr "Decal-Patches erstellen" #: xml_file_content.cpp:155 msgid "Make Detail" msgstr "Als Detail markieren" #: xml_file_content.cpp:156 msgid "Make Structural" msgstr "Als Struktur markieren" #: xml_file_content.cpp:157 msgid "&Patch" msgstr "Patch" #: xml_file_content.cpp:158 msgid "Create Simple Patch Mesh" msgstr "Neuer einfacher Patch" #: xml_file_content.cpp:159 msgid "Create End cap" msgstr "Endcap erstellen" #: xml_file_content.cpp:160 msgid "Create Bevel" msgstr "Bogen erstellen" #: xml_file_content.cpp:161 msgid "Create Cone" msgstr "Kegel erstellen" #: xml_file_content.cpp:162 msgid "Create Cylinder" msgstr "Zylinder erstellen" #: xml_file_content.cpp:163 msgid "Create Sphere" msgstr "Kugel erzeugen" #: xml_file_content.cpp:164 msgid "More cylinders" msgstr "Mehr Zylinderarten" #: xml_file_content.cpp:165 msgid "Create Dense Cylinder" msgstr "Erstelle \"dichten\" Zylinder" #: xml_file_content.cpp:166 msgid "Create Very Dense Cylinder" msgstr "Erstelle \"sehr dichten\" Zylinder" #: xml_file_content.cpp:167 msgid "Create Square Cylinder" msgstr "Erstelle quadratischen Zylinder" #: xml_file_content.cpp:168 msgid "Insert" msgstr "Einfügen" #: xml_file_content.cpp:169 msgid "Insert 2 Columns at the beginning" msgstr "Zwei Spalten am Anfang einfügen" #: xml_file_content.cpp:170 msgid "Insert 2 Columns at the end" msgstr "Zwei Spalten am Ende einfügen" #: xml_file_content.cpp:171 msgid "Insert 2 Rows at the beginning" msgstr "Zwei Zeilen am Anfang einfügen" #: xml_file_content.cpp:172 msgid "Insert 2 Rows at the end" msgstr "Zwei Zeilen am Ende einfügen" #: xml_file_content.cpp:173 msgid "Append" msgstr "Anfügen" #: xml_file_content.cpp:174 msgid "Append 2 columns at the beginning" msgstr "Zwei Spalten am Anfang anfügen" #: xml_file_content.cpp:175 msgid "Append 2 columns at the end" msgstr "Zwei Spalten am Ende anfügen" #: xml_file_content.cpp:176 msgid "Append 2 rows at the beginning" msgstr "Zwei Zeilen am Anfang anfügen" #: xml_file_content.cpp:177 msgid "Append 2 rows at the end" msgstr "Zwei Zeilen am Ende anfügen" #: xml_file_content.cpp:179 msgid "Delete 2 columns from the beginning" msgstr "Zwei Spalten am Anfang löschen" #: xml_file_content.cpp:180 msgid "Delete 2 columns from the end" msgstr "Zwei Spalten am Ende löschen" #: xml_file_content.cpp:181 msgid "Delete 2 rows from the beginning" msgstr "Zwei Zeilen am Anfang löschen" #: xml_file_content.cpp:182 msgid "Delete 2 rows from the end" msgstr "Zwei Spalten am Ende löschen" #: xml_file_content.cpp:183 msgid "Matrix" msgstr "Matrix" #: xml_file_content.cpp:184 msgid "Invert" msgstr "Invertieren" #: xml_file_content.cpp:185 msgid "Re-disperse" msgstr "Neu verteilen" #: xml_file_content.cpp:186 msgid "Rows" msgstr "Zeilen" #: xml_file_content.cpp:187 msgid "Columns" msgstr "Spalten" #: xml_file_content.cpp:188 msgid "Transpose" msgstr "Transponieren" #: xml_file_content.cpp:189 msgid "Thicken Selected Patches" msgstr "Ausgewählte Patches extrudieren" #: xml_file_content.cpp:190 msgid "Cap Selection" msgstr "Cap für Auswahl erstellen" #: xml_file_content.cpp:191 msgid "Cycle Cap Texture" msgstr "Cap-Textur durchrotieren" #: xml_file_content.cpp:192 msgid "Stitch Patch Textures" msgstr "Patch-Texturen zusammenfügen" #: xml_file_content.cpp:193 msgid "Bulge patch" msgstr "Patch auswölben" #: xml_file_content.cpp:194 msgid "&Curve" msgstr "Kurve" #: xml_file_content.cpp:195 msgid "Create NURBS Curve" msgstr "NURBS-Kurve erstellen" #: xml_file_content.cpp:196 msgid "Create CatmullRom Curve" msgstr "CatmullRom-Kurve erstellen" #: xml_file_content.cpp:197 msgid "Convert NURBS <-> CatmullRom" msgstr "Konversion NURBS <-> CatmullRom" #: xml_file_content.cpp:198 msgid "Append Curve Control Point" msgstr "Kurvenkontrollpunkt anfügen" #: xml_file_content.cpp:199 msgid "Insert Curve Control Points" msgstr "Kurvenkontrollpunkt einfügen" #: xml_file_content.cpp:200 msgid "Remove Curve Control Points" msgstr "Kurvenkontrollpunkt entfernen" #: xml_file_content.cpp:201 msgid "&Help" msgstr "Hilfe" #: xml_file_content.cpp:202 msgid "&About" msgstr "Über DarkRadiant" #: xml_file_content.cpp:1 msgid "Texture Background" msgstr "Texturbrowser-Hintergrund" #: xml_file_content.cpp:2 msgid "Grid Background" msgstr "Rasterhintergrund" #: xml_file_content.cpp:3 msgid "Grid Major" msgstr "Grobes Raster" #: xml_file_content.cpp:4 msgid "Grid Minor" msgstr "Feines Raster" #: xml_file_content.cpp:5 msgid "Grid Text" msgstr "Rastertext" #: xml_file_content.cpp:6 msgid "Grid Block" msgstr "Rasterblock" #: xml_file_content.cpp:7 msgid "Brushes" msgstr "Brushes" #: xml_file_content.cpp:8 msgid "Entities (default)" msgstr "Standard-Entities" #: xml_file_content.cpp:9 msgid "Camera Background" msgstr "Kamera-Hintergrund" #: xml_file_content.cpp:10 msgid "Selected Brush" msgstr "Ausgewählter Brush" #: xml_file_content.cpp:11 msgid "Selected Brush (Camera)" msgstr "Ausgewählter Brush (Kamera)" #: xml_file_content.cpp:13 msgid "Active View Name" msgstr "Name der aktiven Ansicht" #: xml_file_content.cpp:14 msgid "X-Axis" msgstr "X-Achse" #: xml_file_content.cpp:15 msgid "Y-Axis" msgstr "Y-Achse" #: xml_file_content.cpp:16 msgid "Z-Axis" msgstr "Z-Achse" #: xml_file_content.cpp:17 msgid "Workzone" msgstr "Arbeitsbereich" #: xml_file_content.cpp:18 msgid "Camera Icon" msgstr "Kamera-Symbol" #: xml_file_content.cpp:19 msgid "Brush Size Info" msgstr "Brush-Größeninformation" #: xml_file_content.cpp:20 msgid "Light Volumes" msgstr "Lichtvolumina" #: xml_file_content.cpp:21 msgid "Brush Vertices" msgstr "Brush-Vertices" #: xml_file_content.cpp:22 msgid "Patch Inner Vertex" msgstr "Patch-Vertices (innen)" #: xml_file_content.cpp:23 msgid "Patch Corner Vertex" msgstr "Patch-Vertices (Ecke)" #: xml_file_content.cpp:24 msgid "Light Vertices (deselected)" msgstr "Licht-Vertices (nicht ausgewählt)" #: xml_file_content.cpp:25 msgid "Light Vertices (selected)" msgstr "Licht-Vertices (ausgewählt)" #: xml_file_content.cpp:26 msgid "Light Vertices (normal)" msgstr "Licht-Vertices (normal)" #: xml_file_content.cpp:27 msgid "Light Start/End (selected)" msgstr "Licht-Anfangs- und End-Vertices (ausgewählt)" #: xml_file_content.cpp:28 msgid "Light Start/End (deselected)" msgstr "Licht-Anfangs- und End-Vertices (nicht ausgewählt)" #: xml_file_content.cpp:29 msgid "XYView Crosshairs" msgstr "Fadenkreuz (XY-Ansicht)" #: xml_file_content.cpp:30 msgid "Drag-Selection Box" msgstr "Auswahl-Rechteck" #: xml_file_content.cpp:1 msgid "Open a map file" msgstr "Map öffnen" #: xml_file_content.cpp:2 msgid "Save the current map" msgstr "Die aktuelle Map speichern" #: xml_file_content.cpp:3 msgid "Change views" msgstr "Ansicht wechseln" #: xml_file_content.cpp:4 msgid "Select complete tall" msgstr "Inneres auswählen (Projektion)" #: xml_file_content.cpp:5 msgid "Select touching" msgstr "Berührtes auswählen" #: xml_file_content.cpp:6 msgid "Select inside" msgstr "Inneres auswählen" #: xml_file_content.cpp:7 msgid "Create Decals for selected Faces" msgstr "Decal-Patches für ausgewählte Faces erstellen" #: xml_file_content.cpp:8 msgid "x-axis Mirror" msgstr "An X-Achse Spiegeln" #: xml_file_content.cpp:9 msgid "x-axis Rotate" msgstr "Um X-Achse rotieren" #: xml_file_content.cpp:10 msgid "y-axis Mirror" msgstr "An Y-Achse Spiegeln" #: xml_file_content.cpp:11 msgid "y-axis Rotate" msgstr "Um Y-Achse rotieren" #: xml_file_content.cpp:12 msgid "z-axis Mirror" msgstr "An Z-Achse Spiegeln" #: xml_file_content.cpp:13 msgid "z-axis Rotate" msgstr "Um Z-Achse rotieren" #: xml_file_content.cpp:14 msgid "Snap selection to grid" msgstr "Auswahl am Raster ausrichten" #: xml_file_content.cpp:15 msgid "Floor selection" msgstr "Auswahl auf den Boden setzen" #: xml_file_content.cpp:16 msgid "CSG Subtract" msgstr "CSG Subtraktion" #: xml_file_content.cpp:17 msgid "CSG Merge" msgstr "CSG Zusammenfügen" #: xml_file_content.cpp:18 msgid "Hollow" msgstr "Aushöhlen" #: xml_file_content.cpp:19 msgid "Make Room" msgstr "Raum erstellen" #: xml_file_content.cpp:20 msgid "Put caps on the current patch" msgstr "Cap-Patches für Auswahl erstellen" #: xml_file_content.cpp:21 msgid "Creates a NURBS curve" msgstr "NURBS-Kurve erstellen" #: xml_file_content.cpp:22 msgid "Convert the selected curve (NURBS <-> CatmullRom)" msgstr "Konvertiert die ausgewählte Kurve NURBS <-> CatmullRom" #: xml_file_content.cpp:23 msgid "Appends a control point to the selected curves" msgstr "Einen Kurvenkontrollpunkt zur ausgewählten Kurve hinzufügen" #: xml_file_content.cpp:24 msgid "Inserts a curve control point before the selected ones" msgstr "Fügt einen Kurvenkontrollpunkt vor dem ausgewählten Punkt ein" #: xml_file_content.cpp:25 msgid "Removes the selected curve control points" msgstr "Ausgewählte Kurvenkontrollpunkte entfernen" #: xml_file_content.cpp:27 msgid "Find & Replace" msgstr "Suchen & Ersetzen" #: xml_file_content.cpp:28 msgid "Decrease Grid Size" msgstr "Rastergröße verkleinern" #: xml_file_content.cpp:29 msgid "Increase Grid Size" msgstr "Rastergröße vergrößern" #: xml_file_content.cpp:30 msgid "Snap to Grid" msgstr "Am Raster ausrichten" #: xml_file_content.cpp:31 msgid "Merge Selection" msgstr "Auswahl zusammenführen" #: xml_file_content.cpp:32 msgid "Flip Selection Horiz (S-Axis)" msgstr "Auswahl Horizontal kippen (S-Achse)" #: xml_file_content.cpp:33 msgid "Flip Selection Vertical (T-Axis)" msgstr "Auswahl vertikal kippen (T-Achse)" #: xml_file_content.cpp:34 msgid "Select Related Items" msgstr "Verbundene Objekte auswählen" #: xml_file_content.cpp:1 msgid "Cubic clip the camera view" msgstr "Far-Clip-Ebene verwenden" #: xml_file_content.cpp:2 msgid "Select Vertices" msgstr "Vertices auswählen" #: xml_file_content.cpp:3 msgid "Select Edges" msgstr "Kanten auswählen" #: xml_file_content.cpp:5 msgid "Select Entities" msgstr "Entities auswählen" #: xml_file_content.cpp:6 msgid "Select Group Parts" msgstr "Teile einer Gruppe auswähen" #: xml_file_content.cpp:7 msgid "Show/hide all light volumes" msgstr "Zeige/verberge alle Lichtvolumina" #: xml_file_content.cpp:8 msgid "Show/hide all speaker volumes" msgstr "Zeige/verberge alle Speaker-Volumina" #: xml_file_content.cpp:10 msgid "Rotate Models independently" msgstr "Modelle unabhängig voneinander drehen" #: xml_file_content.cpp:11 msgid "Rotate func_* Entities around origin" msgstr "Drehe func_*-Entities um deren Ursprung" #: xml_file_content.cpp:12 msgid "Drag-resize entities symmetrically (leave origin unchanged)" msgstr "Symmetrisches Verändern von Entities beim Ziehen (Ursprung bleibt unverändert)" #: xml_file_content.cpp:13 msgid "Offset cloned objects by one grid unit to the right and downwards." msgstr "Duplizierte Objekte um eine Rastereinheit nach rechts unten verschieben" #: xml_file_content.cpp:14 msgid "Translate" msgstr "Translahieren" #: xml_file_content.cpp:16 msgid "Resize" msgstr "Größe ändern" #: xml_file_content.cpp:18 msgid "Hide Unused" msgstr "Nicht Benutztes verbergen" #: xml_file_content.cpp:19 msgid "Clamp texture thumbnails to constant size" msgstr "Textur-Vorschaubilder mit fixer Größe anzeigen" #: xml_file_content.cpp:20 msgid "Toggle Grid" msgstr "Raster anzeigen/verbergen" #: xml_file_content.cpp:21 msgid "Center Pivot when scaling faces" msgstr "Pivotpunkt beim Skalieren von Faces zentrieren" #: xml_file_content.cpp:1 msgid "DarkRadiant x.y.z" msgstr "DarkRadiant x.y.z" #: xml_file_content.cpp:2 msgid "Build date: 2014-08-04" msgstr "Kompilierungsdatum: %s" #: xml_file_content.cpp:3 msgid "" "The Dark Mod (www.thedarkmod.com)\n" "\n" "This product contains software technology\n" "from id Software, Inc. ('id Technology').\n" "id Technology 2000 id Software,Inc.\n" "DarkRadiant is based on the GPL version\n" "of GtkRadiant.\n" "\n" "http://darkradiant.sourceforge.net/" msgstr "" "The Dark Mod (www.thedarkmod.com)\n" "\n" "Dieses Produkt enthält teilweise Software \n" "der Firma id Software, Inc. ('id Technology').\n" "id Technology 2000 id Software,Inc.\n" "\n" "DarkRadiant basiert auf der GPL version\n" "von GtkRadiant (www.qeradiant.com)\n" "\n" "http://darkradiant.sourceforge.net/" #: xml_file_content.cpp:4 msgid "wxWidgets Properties" msgstr "wxWidgets Eigenschaften" #: xml_file_content.cpp:5 #: xml_file_content.cpp:8 msgid "Version:" msgstr "Version:" #: xml_file_content.cpp:6 msgid "OpenGL Properties" msgstr "OpenGL Eigenschaften" #: xml_file_content.cpp:7 msgid "Vendor:" msgstr "Hersteller:" #: xml_file_content.cpp:9 msgid "Renderer:" msgstr "Renderer:" #: xml_file_content.cpp:10 msgid "OpenGL Extensions" msgstr "OpenGL Erweiterungen" #: xml_file_content.cpp:11 msgid "DarkRadiant Modules" msgstr "DarkRadiant Module" #: xml_file_content.cpp:1 msgid "wireframeBtn" msgstr "wireframeBtn" #: xml_file_content.cpp:2 msgid "flatShadeBtn" msgstr "flatShadeBtn" #: xml_file_content.cpp:3 msgid "texturedBtn" msgstr "texturedBtn" #: xml_file_content.cpp:4 msgid "lightingBtn" msgstr "lightingBtn" #: xml_file_content.cpp:5 #: xml_file_content.cpp:1 msgid "startTimeButton" msgstr "startTimeButton" #: xml_file_content.cpp:6 #: xml_file_content.cpp:3 msgid "stopTimeButton" msgstr "stopTimeButton" #: xml_file_content.cpp:7 msgid "clipPlaneInButton" msgstr "clipPlaneInButton" #: xml_file_content.cpp:8 msgid "clipPlaneOutButton" msgstr "clipPlaneOutButton" #: xml_file_content.cpp:3 msgid "Command Arguments" msgstr "Befehlsargumente" #: xml_file_content.cpp:4 msgid "Command Properties" msgstr "Befehlseigenschaften" #: xml_file_content.cpp:5 msgid "Wait until finished" msgstr "Warten bis Befehl fertig ausgeführt wurde" #: xml_file_content.cpp:1 msgid "Conversation Entities" msgstr "Konversations-Entities" #: xml_file_content.cpp:4 msgid "Conversations" msgstr "Konversationen" #: xml_file_content.cpp:8 #: xml_file_content.cpp:7 msgid "Clear" msgstr "Löschen" #: xml_file_content.cpp:1 msgid "Properties" msgstr "Eigenschaften" #: xml_file_content.cpp:3 msgid "Actors must be within talk distance" msgstr "Akteur müssen in Sprechweite sein" #: xml_file_content.cpp:4 msgid "Actors always face each other while talking" msgstr "Akteure sehen sich beim Sprechen gegenseitig an" #: xml_file_content.cpp:5 msgid "Let this conversation play" msgstr "Diese Konversation wird maximal" #: xml_file_content.cpp:6 msgid "times at maximum" msgstr "Mal(e) abgespielt" #: xml_file_content.cpp:7 msgid "Actors" msgstr "Akteure" #: xml_file_content.cpp:10 msgid "Commands" msgstr "Befehle" #: xml_file_content.cpp:13 #: xml_file_content.cpp:9 msgid "Move up" msgstr "Nach oben" #: xml_file_content.cpp:14 #: xml_file_content.cpp:10 msgid "Move down" msgstr "Nach unten" #: xml_file_content.cpp:3 msgid "Refresh" msgstr "Neu laden" #: xml_file_content.cpp:5 msgid "Classname:" msgstr "Klassenname:" #: xml_file_content.cpp:6 msgid "Spawnarg:" msgstr "Wertepaar:" #: xml_file_content.cpp:7 msgid "Argument:" msgstr "Argument:" #: xml_file_content.cpp:3 #: xml_file_content.cpp:68 msgid "View" msgstr "Ansicht" #: xml_file_content.cpp:2 msgid "Rules" msgstr "Regeln" #: xml_file_content.cpp:7 msgid "" "Filter rules are applied in the shown order.\n" "\"Match\" is accepting regular expressions.\n" "\"Object\"-type filters can be used to match \"patch\" or \"brush\"." msgstr "" "Filterregeln werden in der angegebenen Reihenfolge angewandt.\n" "Das Ausdruck-Feld akzeptiert reguläre Ausdrücke (RegEx).\n" "Für Filter vom Typ Objekt können die Schlüsselwörter patch oder brush verwendet werden." #: xml_file_content.cpp:1 msgid "Find:" msgstr "Suchen:" #: xml_file_content.cpp:2 msgid "Replace:" msgstr "Ersetzen:" #: xml_file_content.cpp:3 msgid "Search current selection only" msgstr "Durchsuche nur die aktuelle Auswahl" #: xml_file_content.cpp:4 msgid "x shader(s) replaced." msgstr "x shader ersetzt." #: xml_file_content.cpp:5 msgid "Find and Replace" msgstr "Suchen & Ersetzen" #: xml_file_content.cpp:6 #: xml_file_content.cpp:13 #: xml_file_content.cpp:88 msgid "Close" msgstr "Schließen" #: xml_file_content.cpp:1 msgid "Light Volume" msgstr "Lichtvolumina" #: xml_file_content.cpp:2 msgid "Omni" msgstr "Omni" #: xml_file_content.cpp:3 msgid "Projected" msgstr "Projektion" #: xml_file_content.cpp:4 msgid "Use start/end" msgstr "Verwende Start/End" #: xml_file_content.cpp:6 #: xml_file_content.cpp:9 msgid "Options" msgstr "Optionen" #: xml_file_content.cpp:7 msgid "Parallel" msgstr "Parallel" #: xml_file_content.cpp:8 msgid "Do not cast shadows (fast)" msgstr "Wirft keine Schatten (schnell)." #: xml_file_content.cpp:9 msgid "Skip specular lighting" msgstr "Kein Specularmap-Rendering" #: xml_file_content.cpp:10 msgid "Skip diffuse lighting" msgstr "Kein Diffusemap-Rendering" #: xml_file_content.cpp:11 msgid "Light Texture" msgstr "Lichttextur" #: xml_file_content.cpp:1 msgid "Options:" msgstr "Optionen:" #: xml_file_content.cpp:2 msgid "Surround with monsterclip brush" msgstr "Mit Monsterclip einhüllen" #: xml_file_content.cpp:2 msgid "Difficulty" msgstr "Schwierigkeitsgrad" #: xml_file_content.cpp:3 msgid "Iniital State" msgstr "Anfangszustand" #: xml_file_content.cpp:4 #: xml_file_content.cpp:20 msgid "Flags" msgstr "Flags" #: xml_file_content.cpp:5 msgid "Mandatory" msgstr "Obgligatorisches Ziel" #: xml_file_content.cpp:6 msgid "Ongoing" msgstr "Laufend" #: xml_file_content.cpp:7 #: xml_file_content.cpp:22 msgid "Irreversible" msgstr "Irreversibel" #: xml_file_content.cpp:9 msgid "Enabling Objectives" msgstr "Vorausgesetzte Ziele" #: xml_file_content.cpp:10 msgid "Sucess Logic" msgstr "Logik für Erfüllung" #: xml_file_content.cpp:11 msgid "Failure Logic" msgstr "Logik für Fehlschlag" #: xml_file_content.cpp:12 msgid "Completion Script" msgstr "Skript bei Erfüllung" #: xml_file_content.cpp:13 msgid "Failure Script" msgstr "Skript bei Fehlschlag" #: xml_file_content.cpp:14 msgid "Completion Target" msgstr "Target bei Erfüllung" #: xml_file_content.cpp:15 msgid "Failure Target" msgstr "Target bei Fehlschlag" #: xml_file_content.cpp:21 msgid "Satisfied at start" msgstr "Bei Missionsstart erfüllt" #: xml_file_content.cpp:23 msgid "Boolean NOT" msgstr "Negieren" #: xml_file_content.cpp:24 msgid "Player responsible" msgstr "Spieler ist verantwortlich" #: xml_file_content.cpp:25 msgid "&OK" msgstr "OK" #: xml_file_content.cpp:26 msgid "&Cancel" msgstr "Abbrechen" #: xml_file_content.cpp:1 msgid "Objective Conditions" msgstr "Missionsziel-Bedingungen" #: xml_file_content.cpp:4 msgid "Condition" msgstr "Bedingung" #: xml_file_content.cpp:5 msgid "Source Mission:" msgstr "Quellmission:" #: xml_file_content.cpp:6 msgid "Source Objective:" msgstr "Quell-Missionsziel:" #: xml_file_content.cpp:7 msgid "Source Objective State:" msgstr "Status des Quell-Missionsziels:" #: xml_file_content.cpp:8 msgid "Target Objective:" msgstr "Missionsziel:" #: xml_file_content.cpp:9 msgid "Action:" msgstr "Aktion:" #: xml_file_content.cpp:10 msgid "Action Value:" msgstr "Wert:" #: xml_file_content.cpp:11 msgid "Sentence" msgstr "In Worten" #: xml_file_content.cpp:12 msgid "-" msgstr "-" #: xml_file_content.cpp:1 msgid "Objective Entities" msgstr "Missionsziel-Entities" #: xml_file_content.cpp:4 msgid "Objectives" msgstr "Missionsziele" #: xml_file_content.cpp:11 msgid "Success Logic" msgstr "Logik für Erfüllung:" #: xml_file_content.cpp:12 msgid "Edit Mission Success Logic" msgstr "Logik für Erfüllung bearbeiten" #: xml_file_content.cpp:1 msgid "Use background image" msgstr "Verwende Hintergrundbild" #: xml_file_content.cpp:2 msgid "Image file" msgstr "Bilddatei" #: xml_file_content.cpp:3 msgid "Transparency" msgstr "Transparenz" #: xml_file_content.cpp:4 msgid "transparent" msgstr "transparent" #: xml_file_content.cpp:5 msgid "opaque" msgstr "intransparent" #: xml_file_content.cpp:6 msgid "Image scale" msgstr "Bildskalierung" #: xml_file_content.cpp:7 msgid "Horizontal offset" msgstr "Horizontale Verschiebung" #: xml_file_content.cpp:8 msgid "Vertical offset" msgstr "Vertikale Verschiebung" #: xml_file_content.cpp:10 msgid "Keep aspect ratio" msgstr "Seitenverhältnis beibehalten" #: xml_file_content.cpp:11 msgid "Zoom image with viewport" msgstr "Bild zusammen mit 2D-Ansicht zoomen" #: xml_file_content.cpp:12 msgid "Pan image with viewport" msgstr "Bild zusammen mit 2D-Ansicht verschieben" #: xml_file_content.cpp:1 msgid "Particle Definitions" msgstr "Partikeldefinitionen" #: xml_file_content.cpp:5 msgid "Particle Stages" msgstr "Partikelstufen" #: xml_file_content.cpp:8 msgid "Toggle Visibility" msgstr "Anzeigen/Verstecken" #: xml_file_content.cpp:9 msgid "Up" msgstr "Nach oben" #: xml_file_content.cpp:10 msgid "Down" msgstr "Nach unten" #: xml_file_content.cpp:12 msgid "Depth Hack:" msgstr "Depth Hack:" #: xml_file_content.cpp:13 msgid "Stage Settings" msgstr "Stufeneinstellungen" #: xml_file_content.cpp:16 msgid "Colour:" msgstr "Farbe:" #: xml_file_content.cpp:17 msgid "Fade Colour:" msgstr "Fade-Farbe" #: xml_file_content.cpp:18 msgid "Use Entity Colour" msgstr "Entity-Farbe verwenden" #: xml_file_content.cpp:19 msgid "Fade In Fraction:" msgstr "Fade In Fraction:" #: xml_file_content.cpp:20 msgid "Fade Out Fraction:" msgstr "Fade Out Fraction:" #: xml_file_content.cpp:21 msgid "Fade Index Fraction:" msgstr "Fade Index Fraction:" #: xml_file_content.cpp:22 msgid "Animation:" msgstr "Animation:" #: xml_file_content.cpp:23 msgid "Frames:" msgstr "Frames:" #: xml_file_content.cpp:24 msgid "Rate:" msgstr "Abspielrate:" #: xml_file_content.cpp:25 msgid "FPS" msgstr "FPS" #: xml_file_content.cpp:26 msgid "Count / Time" msgstr "Anzahl / Zeit" #: xml_file_content.cpp:27 msgid "Count:" msgstr "Anzahl:" #: xml_file_content.cpp:28 msgid "Duration / sec:" msgstr "Dauer / Sek.:" #: xml_file_content.cpp:29 msgid "Bunching:" msgstr "Häufung:" #: xml_file_content.cpp:30 msgid "Cycles:" msgstr "Durchläufe:" #: xml_file_content.cpp:31 msgid "Time Offset / sec:" msgstr "Zeitversatz / Sek." #: xml_file_content.cpp:32 msgid "Dead Time / sec:" msgstr "Totzeit / Sek.:" #: xml_file_content.cpp:33 msgid "Size / Speed" msgstr "Größe / Geschw." #: xml_file_content.cpp:34 msgid "Speed:" msgstr "Geschw.:" #: xml_file_content.cpp:35 #: xml_file_content.cpp:38 #: xml_file_content.cpp:41 #: xml_file_content.cpp:44 msgid "From:" msgstr "Von:" #: xml_file_content.cpp:36 #: xml_file_content.cpp:39 #: xml_file_content.cpp:42 #: xml_file_content.cpp:45 msgid "To:" msgstr "Bis:" #: xml_file_content.cpp:37 msgid "Size:" msgstr "Größe:" #: xml_file_content.cpp:40 msgid "Rotation Speed:" msgstr "Rotationsgeschwindigkeit:" #: xml_file_content.cpp:43 msgid "Aspect Ratio:" msgstr "Seitenverhältnis:" #: xml_file_content.cpp:46 msgid "Gravity:" msgstr "Schwerkraft:" #: xml_file_content.cpp:47 msgid "Use World Gravity" msgstr "Welt-Schwerkraftrichtung verwenden" #: xml_file_content.cpp:48 msgid "Bounds Expansion:" msgstr "Bounds Expansion:" #: xml_file_content.cpp:49 msgid "Distribution" msgstr "Verteilung" #: xml_file_content.cpp:50 msgid "Shape:" msgstr "Form:" #: xml_file_content.cpp:51 msgid "Rectangular" msgstr "Rechteckig" #: xml_file_content.cpp:52 msgid "Cylindric" msgstr "Zylindrisch" #: xml_file_content.cpp:53 msgid "Spherical" msgstr "Sphärisch" #: xml_file_content.cpp:54 msgid "X Size:" msgstr "X-Größe:" #: xml_file_content.cpp:55 msgid "Y Size:" msgstr "Y-Größe:" #: xml_file_content.cpp:56 msgid "Z Size:" msgstr "Z-Größe:" #: xml_file_content.cpp:57 msgid "Ring Size:" msgstr "Ringgröße:" #: xml_file_content.cpp:58 msgid "Offset:" msgstr "Abstand:" #: xml_file_content.cpp:59 msgid "Randomness:" msgstr "Zufälligkeit:" #: xml_file_content.cpp:60 msgid "Distribute Particles randomly within Volume" msgstr "Verteile Polygone zufällig im angegebenen Volumen" #: xml_file_content.cpp:61 msgid "Direction / Orientation" msgstr "Richtung / Orientierung" #: xml_file_content.cpp:62 msgid "Direction:" msgstr "Richtung:" #: xml_file_content.cpp:63 msgid "Cone" msgstr "Kegel" #: xml_file_content.cpp:64 msgid "Outward" msgstr "Auswärts " #: xml_file_content.cpp:65 msgid "Cone Angle:" msgstr "Öffnungswinkel:" #: xml_file_content.cpp:66 msgid "Upward Bias:" msgstr "Aufwärtsdrift:" #: xml_file_content.cpp:67 msgid "Orientation:" msgstr "Orientierung:" #: xml_file_content.cpp:69 msgid "Aimed" msgstr "Ausgerichtet" #: xml_file_content.cpp:70 msgid "X" msgstr "X" #: xml_file_content.cpp:71 msgid "Y" msgstr "Y" #: xml_file_content.cpp:72 msgid "Z" msgstr "Z" #: xml_file_content.cpp:73 msgid "Trails:" msgstr "Spuren:" #: xml_file_content.cpp:74 msgid "Time:" msgstr "Zeit:" #: xml_file_content.cpp:75 msgid "Initial Angle:" msgstr "Anfangswinkel:" #: xml_file_content.cpp:76 msgid "Path" msgstr "Pfad" #: xml_file_content.cpp:77 msgid "Path Type:" msgstr "Pfad-Typ:" #: xml_file_content.cpp:78 msgid "Standard" msgstr "Standard" #: xml_file_content.cpp:79 msgid "Flies" msgstr "Fliegen" #: xml_file_content.cpp:80 msgid "Helix" msgstr "Helix" #: xml_file_content.cpp:81 msgid "Radial Speed:" msgstr "Radiale Geschwindigkeit:" #: xml_file_content.cpp:82 msgid "Axial Speed:" msgstr "Axiale Geschw.:" #: xml_file_content.cpp:83 msgid "Sphere Radius:" msgstr "Kugelradius:" #: xml_file_content.cpp:84 msgid "Cylinder Size X:" msgstr "Zylindergröße X:" #: xml_file_content.cpp:85 msgid "Cylinder Size Y:" msgstr "Zylindergröße Y:" #: xml_file_content.cpp:86 msgid "Cylinder Size Z:" msgstr "Zylindergröße Z:" #: xml_file_content.cpp:87 msgid "Note: changes will be written to the file ....." msgstr "Hinweis: alle Änderungen werden in den File ... geschrieben" #: xml_file_content.cpp:1 msgid "Create simple Patch Mesh" msgstr "Neuer einfacher Patch" #: xml_file_content.cpp:2 msgid "Width:" msgstr "Breite:" #: xml_file_content.cpp:3 msgid "Height:" msgstr "Höhe:" #: xml_file_content.cpp:4 msgid "Remove selected Brush" msgstr "Entferne die ausgewählte Brush" #: xml_file_content.cpp:1 msgid "Patch Control Vertices" msgstr "Patch-Kontrollpunkte" #: xml_file_content.cpp:2 msgid "Row:" msgstr "Reihe:" #: xml_file_content.cpp:3 msgid "Column:" msgstr "Spalte:" #: xml_file_content.cpp:4 msgid "Coordinates" msgstr "Koordinaten" #: xml_file_content.cpp:5 msgid "Patch Tesselation" msgstr "Patch-Tesselierung" #: xml_file_content.cpp:6 msgid "Fixed Subdivisions" msgstr "Fixe Tesselierung" #: xml_file_content.cpp:7 msgid "Horizontal:" msgstr "Horizontal:" #: xml_file_content.cpp:8 msgid "Vertical:" msgstr "Vertikal:" #: xml_file_content.cpp:1 msgid "Thicken selected Patches" msgstr "Ausgewählte Patches extrudieren" #: xml_file_content.cpp:2 msgid "Extrude along Vertex Normals" msgstr "Extrusion entlang der Vertex-Normalen" #: xml_file_content.cpp:3 msgid "Extrude along X-Axis" msgstr "Extrusion entlang der X-Achse" #: xml_file_content.cpp:4 msgid "Extrude along Y-Axis" msgstr "Extrusion entlang der Y-Achse" #: xml_file_content.cpp:5 msgid "Extrude along Z-Axis" msgstr "Extrusion entlang der Z-Achse" #: xml_file_content.cpp:6 msgid "Thickness (units):" msgstr "Tiefe (in Rastereinheiten):" #: xml_file_content.cpp:7 msgid "Create Seams (\"side walls\")" msgstr "Umschließen (erzeuge \"Seitenwände\")" #: xml_file_content.cpp:1 msgid "General Properties" msgstr "Allgemeine Eigenschaften" #: xml_file_content.cpp:2 msgid "Inventory Name:" msgstr "Name im Inventory:" #: xml_file_content.cpp:3 msgid "XData Name:" msgstr "XData-Name:" #: xml_file_content.cpp:4 msgid "Number of Pages:" msgstr "Anzahl der Seiten:" #: xml_file_content.cpp:5 msgid "Layout:" msgstr "Layout:" #: xml_file_content.cpp:6 msgid "One-sided" msgstr "Einseitig" #: xml_file_content.cpp:7 msgid "Two-sided" msgstr "Zweiseitig" #: xml_file_content.cpp:8 msgid "Pageturn Sound:" msgstr "Sound beim Umblättern:" #: xml_file_content.cpp:9 msgid "Page Editing" msgstr "Textbearbeitung" #: xml_file_content.cpp:10 msgid "Insert Page" msgstr "Seite einfügen" #: xml_file_content.cpp:11 msgid "Current Page:" msgstr "Aktuelle Seite:" #: xml_file_content.cpp:12 msgid "1" msgstr "1" #: xml_file_content.cpp:13 msgid "Remove Page" msgstr "Seite Entfernen" #: xml_file_content.cpp:14 msgid "GUI Definition:" msgstr "GUI-Definition:" #: xml_file_content.cpp:17 msgid "Title" msgstr "Titel:" #: xml_file_content.cpp:18 msgid "Body" msgstr "Text:" #: xml_file_content.cpp:19 msgid "Tools" msgstr "Werkzeuge" #: xml_file_content.cpp:22 msgid "Save and Close" msgstr "Speichern & Schließen" #: xml_file_content.cpp:2 msgid "pauseTimeButton" msgstr "pauseTimeButton" #: xml_file_content.cpp:4 msgid "prevButton" msgstr "prevButton" #: xml_file_content.cpp:5 msgid "nextButton" msgstr "nextButton" #: xml_file_content.cpp:1 msgid "Type:" msgstr "Typ:" #: xml_file_content.cpp:3 #: xml_file_content.cpp:22 msgid "Chance:" msgstr "Wahrscheinlichkeit:" #: xml_file_content.cpp:4 msgid "Random Effects:" msgstr "Zufällige Effekte:" #: xml_file_content.cpp:3 msgid "Activation Timer:" msgstr "Aktivierungs-Timer:" #: xml_file_content.cpp:4 msgid "h" msgstr "h" #: xml_file_content.cpp:5 msgid "m" msgstr "m" #: xml_file_content.cpp:6 msgid "s" msgstr "s" #: xml_file_content.cpp:7 #: xml_file_content.cpp:13 #: xml_file_content.cpp:15 msgid "ms" msgstr "ms" #: xml_file_content.cpp:8 msgid "Timer restarts after firing" msgstr "Timer startet neu nach Ablauf" #: xml_file_content.cpp:9 msgid "Timer reloads" msgstr "Timer-Neustarts" #: xml_file_content.cpp:10 msgid "times" msgstr "Mal(e)" #: xml_file_content.cpp:11 msgid "Timer waits for start (when disabled: starts at spawn time)" msgstr "Timer wartet auf Start (wenn Option deaktiviert: Timer startet zur Spawn-Zeit)" #: xml_file_content.cpp:12 msgid "Time interval:" msgstr "Zeitintervall:" #: xml_file_content.cpp:14 msgid "Duration:" msgstr "Dauer:" #: xml_file_content.cpp:16 msgid "Radius" msgstr "Radius" #: xml_file_content.cpp:17 msgid "Use bounds" msgstr "Boundingbox benutzen" #: xml_file_content.cpp:18 msgid "Radius changes over time to:" msgstr "Radius verändert sich über die Zeit zu:" #: xml_file_content.cpp:19 msgid "Magnitude:" msgstr "Stärke:" #: xml_file_content.cpp:20 msgid "Falloff Exponent:" msgstr "Falloff-Exponent:" #: xml_file_content.cpp:21 msgid "Max Fire Count:" msgstr "Max. Auslösevorgänge:" #: xml_file_content.cpp:23 msgid "Velocity:" msgstr "Geschwindigkeit:" #: xml_file_content.cpp:24 msgid "Bounds:" msgstr "Boundingbox:" #: xml_file_content.cpp:25 msgid "Min:" msgstr "Min:" #: xml_file_content.cpp:26 msgid "Max:" msgstr "Max:" #~ msgid "Nothing" #~ msgstr "Nichts" #~ msgid "Move View" #~ msgstr "Ansicht verschieben" #~ msgid "Toggle Selection" #~ msgstr "Auswählen/abwählen" #~ msgid "Toggle Face Selection" #~ msgstr "Face auswählen/abwählen" #~ msgid "Copy Texture" #~ msgstr "Textur kopieren" #~ msgid "PasteTexture Natural" #~ msgstr "Tetxur einfügen (Natürliche Skalierung)" #~ msgid "Paste Texture Name only" #~ msgstr "Nur Texturnamen einfügen" #~ msgid "Creating Preference Dialog" #~ msgstr "Erzeuge Einstellungsdialog" #~ msgid "Constructing Menu" #~ msgstr "Erzeuge Menü" #~ msgid "Initialising MediaBrowser" #~ msgstr "Initialisiere Medienbrowser" #~ msgid "Starting MainFrame" #~ msgstr "Starte Mainframe" #~ msgid "DarkRadiant Startup Complete" #~ msgstr "DarkRadiant Startphase abgeschlossen" #~ msgid "%d shaders found." #~ msgstr "%d Shader gefunden." #~ msgid "Settings/Source View" #~ msgstr "Einstellungen/Quellansicht" #~ msgid "%s" #~ msgstr "%s" #~ msgid "GTK+ Properties" #~ msgstr "GTK+ Eigenschaften" #~ msgid "gtkmm Version: %d.%d.%d" #~ msgstr "gtkmm Version: %d.%d.%d" #~ msgid "Light volume" #~ msgstr "Lichtvolumen" #~ msgid "Choose image" #~ msgstr "Bild auswählen" #~ msgid "Category" #~ msgstr "Kategorie" #~ msgid "Constant size" #~ msgstr "Fixe Größe" #~ msgid "Description:" #~ msgstr "Beschreibung:" #~ msgid "ID" #~ msgstr "ID" #~ msgid "Do you want to replace it?" #~ msgstr "Willst Du sie ersetzen?" #~ msgid "_File" #~ msgstr "_Datei" #~ msgid "_New Map" #~ msgstr "_Neue Map" #~ msgid "_Edit" #~ msgstr "_Bearbeiten" #~ msgid "_Duplicate" #~ msgstr "_Duplizieren" #~ msgid "D_elete" #~ msgstr "Lösch_en" #~ msgid "Select complete t_all" #~ msgstr "Inneres auswählen (Projektion)" #~ msgid "Select i_nside" #~ msgstr "Inneres auswählen" #~ msgid "Select _touching" #~ msgstr "Berührtes auswählen" #~ msgid "V_iew" #~ msgstr "Ans_icht" #~ msgid "_Surface Inspector" #~ msgstr "_Surface Inspector" #~ msgid "_Patch Inspector" #~ msgstr "_Patch Inspector" #~ msgid "_Texture Tool" #~ msgstr "_Textur-Werkzeug" #~ msgid "Show C_oordinates" #~ msgstr "Zeige Koordinaten" #~ msgid "_Faces" #~ msgstr "_Faces" #~ msgid "En_tities" #~ msgstr "En_tities" #~ msgid "M_ap" #~ msgstr "K_arte" #~ msgid "E_ntity" #~ msgstr "E_ntity" #~ msgid "Make _Room" #~ msgstr "Raum erstellen" #~ msgid "CSG _Subtract" #~ msgstr "CSG _Subtraktion" #~ msgid "CSG _Merge" #~ msgstr "CSG _Zusammenfügen" #~ msgid "_Patch" #~ msgstr "_Patch" #~ msgid "Populating MediaBrowser" #~ msgstr "Lade Medienbrowser" #~ msgid "Advanced" #~ msgstr "Erweitert" #~ msgid "Create MonsterClip Brush" #~ msgstr "Erzeuge Monsterclip-Brush" #~ msgid "Active materials" #~ msgstr "Aktive Shader" #~ msgid "Doom 3 map" #~ msgstr "Doom 3 Map" #~ msgid "Doom 3 region" #~ msgstr "Doom 3 Region" #~ msgid "Doom 3 prefab" #~ msgstr "Doom 3 Prefab" #~ msgid "Quake 4 map" #~ msgstr "Quake 4 Map" #~ msgid "Quake 4 region" #~ msgstr "Quake 4 Region" #~ msgid "Quake 4 prefab" #~ msgstr "Quake 4 Prefab" #~ msgid "Pause time" #~ msgstr "Zeit anhalten" #~ msgid "Stop time" #~ msgstr "Zeit stoppen" #~ msgid "Next frame" #~ msgstr "Nächster Frame" #~ msgid "Previous frame" #~ msgstr "Vorheriger Frame" #~ msgid "Reload Shaders" #~ msgstr "Shader neu laden" #~ msgid "Flush & Reload Shaders" #~ msgstr "Shader neu laden" #~ msgid "Start Render Time" #~ msgstr "Render-Zeit starten" #~ msgid "Stop Render Time" #~ msgstr "Render-Zeit stoppen" #~ msgid "Clip plane in" #~ msgstr "Entfernte Clip-Ebene heran" #~ msgid "Clip plane out" #~ msgstr "Entfernte Clip-Ebene hinaus" #~ msgid "Success logic" #~ msgstr "Logik für Erfüllung" #~ msgid "Edit objective conditions" #~ msgstr "Missionsziel-Bedingung bearbeiten" #~ msgid "Material to render onto each quad." #~ msgstr "Der Shader zum Rendern der Polygone dieses Partikels." #~ msgid "Render Colour" #~ msgstr "Renderfarbe" #~ msgid "Shader: " #~ msgstr "Shader:" #~ msgid "Either 0 0 0 0 for additive, or 1 1 1 0 for blended materials." #~ msgstr "Entweder 0 0 0 0 für additive, oder 1 1 1 0 für Blend-Shader." #~ msgid "Force colour from render entity (Fade Colour is still valid)" #~ msgstr "Farbe der Entity übernehmen (Die Fade-Farbe ist weiterhin gültig)" #~ msgid "In 0.0 to 1.0 range, causes later index smokes to be more faded." #~ msgstr "" #~ "Im Bereich 0.0 bis 1.0, bewirkt dass spätere Partikel-Polygone stärker " #~ "\"gefadet\" erscheinen." #~ msgid "If > 1, subdivide the texture S axis into frames and crossfade." #~ msgstr "" #~ "Wenn > 1, wird die Textur-Achse S je nach Anzahl der Frames zerteilt und " #~ "überblendet." #~ msgid "Frames per second" #~ msgstr "Frames pro Sekunde" #~ msgid "" #~ "Total number of particles, although some may be invisible at a given time." #~ msgstr "" #~ "Gesamtanzahl der Partikelpolygone, möglicherweise sind nicht alle zu " #~ "jedem Zeitpunkt sichtbar." #~ msgid "" #~ "Allows things to oneShot (1 cycle) or run for a set number of cycles on a " #~ "per stage basis." #~ msgstr "Gibt an wie oft die Stage abgespielt wird." #~ msgid "Time offset from system start for the first particle to spawn." #~ msgstr "" #~ "Zeitversatz, vom Start weg gerechnet, bevor das erste Polygon gerendert " #~ "wird." #~ msgid "" #~ "0.0 = all come out at first instant, 1.0 = evenly spaced over cycle time" #~ msgstr "" #~ "0.0 = alle Polygone werden auf einmal erzeugt, 1.0 = Polygone werden " #~ "zeitlich gleichmäßig über die Stage-Lebensdauer verteilt." #~ msgid "Time after particleLife before respawning." #~ msgstr "Pause nach einem Stage-Durchgang" #~ msgid "Values > 1 make the T axis longer." #~ msgstr "Werte > 1 verlängern die Textur-Achse T." #~ msgid "Can be negative to let particles float upwards." #~ msgstr "Kann negativ sein, um Polygone aufwärts driften zu lassen." #~ msgid "" #~ "Half the particles will have negative rotation speeds, this is measured " #~ "in degrees/sec." #~ msgstr "" #~ "Die halben Polygone drehen sich in negativer Drehrichtung, wird in Grad/" #~ "Sek.gemessen" #~ msgid "User tweak to fix poorly calculated bounds." #~ msgstr "User-Fix zur Behebung von schlecht berechneten Partikel-Bounds." #~ msgid "" #~ "Apply gravity in world space. If this flag is set use -z as gravity " #~ "direction as in the game world, otherwise use the reverse emitter " #~ "direction." #~ msgstr "" #~ "Wendet die Schwerkraft so an wie sie auch im Spiel wirkt. Wenn dieses " #~ "Flag gesetzt ist wird die Z-Achse des Partikelsystems nach unten zeigen, " #~ "ist es gelöscht wirkt es in der entgegengesetzten Richtung des Emitters." #~ msgid "" #~ "Offset from Origin to spawn all Particles, also applies to Custom Paths." #~ msgstr "" #~ "Abstand zur Entity, wird auch bei Speziellen Pfadoptionen angewandt. " #~ msgid "" #~ "Randomly orient the quad on emission. If random distribution is off, " #~ "particles get spawned at ." #~ msgstr "" #~ "Polygone werden mit zufälliger Orientierung erzeugt. Wenn diese " #~ "Einstellung abgeschaltet ist, erscheinen die Polygone bei ." #~ msgid "" #~ "Some tests showed that for the cylinder type the fourth parameter " #~ "(\"ringfraction\") is only effective if >1, it effectively scales the " #~ "elliptic shape by that factor.\n" #~ "Values < 1.0 didn't have any effect." #~ msgstr "" #~ "Tests haben gezeigt dass der 4. Parameter der \"Zylinder\"-Einstellung " #~ "(\"Ring Fraction\") nur bei Werten > 1 etwas Sichtbares bewirkt: die " #~ "elliptische Form wird dann um diesen Faktor skaliert.\n" #~ "Werte < 1 haben keinen sichtbaren Effekt." #~ msgid "In degrees, random angle is used if zero (default)." #~ msgstr "" #~ "Wird in Grad gemessen, bei einem Wert von 0 werden die Polygone zufällig " #~ "gedreht." #~ msgid "" #~ "\"Flies\" particles are moving on the surface of a sphere of the given " #~ "radius.\n" #~ "The radial and axial speeds are chosen at random (but never 0) and are " #~ "constant during the lifetime of a particle.\n" #~ "Starting position appears to be random, but different to the " #~ "\"distribution sphere\" type (i.e. it is not evenly distributed, instead " #~ "the particles seem to bunch themselves at the poles)." #~ msgstr "" #~ "\"Fliegen\"-Partikel bewegen sich auf einer Kugel mit dem angegebenen " #~ "Radius.\n" #~ "Die radialen und axialen Geschwindigkeiten werden zufällig gewählt (sind " #~ "aber immer ungleich 0) und bleiben konstant während der Lebensdauer eines " #~ "Polygons.\n" #~ "Die Startposition scheint zufällig gewählt zu werden, ist aber (im " #~ "Gegensatz zur Verteilung vom Typ \"Kugel\") nicht gleichmäßig über die " #~ "Kugeloberfläche verteilt (leichte Häufung an den Polen)." #~ msgid "" #~ "Helical movement is describing an elliptic cylinder, its shape is " #~ "determined by sizeX, sizeY and sizeZ.\n" #~ "Particles are spawned randomly on that cylinder surface, their velocities " #~ "(radial and axial) are also random (both negative and positive velocities " #~ "are allowed)." #~ msgstr "" #~ "Die helikale Bewegung beschreibt einen elliptischen Zylinder, die Form " #~ "wird durch die drei Größenparameter X, Y und Z bestimmt.\n" #~ "Die Polygone werden an einem zufälligen Ort auf der Zylinderoberfläche " #~ "erzeugt, ihre Geschwindigkeiten (sowohl radial als auch axial) sind " #~ "ebenfalls zufällig, positiv wie negativ." #~ msgid "" #~ "Error while creating backup:\n" #~ "%s" #~ msgstr "" #~ "Fehler beim Erstellen des Backups:\n" #~ "%s" DarkRadiant-2.0.2/install/input.xml000066400000000000000000000275011245424655700172510ustar00rootroot00000000000000 DarkRadiant-2.0.2/install/menu.xml000066400000000000000000000441761245424655700170650ustar00rootroot00000000000000

DarkRadiant-2.0.2/install/scripts/000077500000000000000000000000001245424655700170525ustar00rootroot00000000000000DarkRadiant-2.0.2/install/scripts/brushtest.py000066400000000000000000000013101245424655700214420ustar00rootroot00000000000000# Some interface tests # Test brush manipulation class BrushManipulator(SceneNodeVisitor) : def pre(self, node): # Try to get a brush from this node brush = node.getBrush() if not brush.isNull(): print('Brush information:') print('Number of faces: ' + str(brush.getNumFaces())) i = 0 while i < brush.getNumFaces(): face = brush.getFace(i) print('Face #' + str(i) +' has shader ' + face.getShader()) winding = face.getWinding() for w in winding: print('w.vertex=' + str(w.vertex.x()) + ',' + str(w.vertex.y()) + ',' + str(w.vertex.z())) face.fitTexture(1,1) i += 1 return 1 walker = BrushManipulator() GlobalSceneGraph.root().traverse(walker) print('') DarkRadiant-2.0.2/install/scripts/commands/000077500000000000000000000000001245424655700206535ustar00rootroot00000000000000DarkRadiant-2.0.2/install/scripts/commands/ase_export.py000066400000000000000000000361161245424655700234050ustar00rootroot00000000000000# ***** BEGIN GPL LICENSE BLOCK ***** # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # ***** END GPL LICENCE BLOCK ***** #TODO: # Set the command name so that DarkRadiant recognises this file __commandName__ = 'aseExport' __commandDisplayName__ = 'Export ASE...' # The actual algorithm called by DarkRadiant is contained in the execute() function def execute(): script = "Dark Radiant ASCII Scene Export (*.ase)" author = "Richard Bartlett, some additions by greebo and tels" version = "0.7" # Check if we have a valid selection selectionInfo = GlobalSelectionSystem.getSelectionInfo() # Don't allow empty selections or selected components only if selectionInfo.totalCount == 0 or selectionInfo.totalCount == selectionInfo.componentCount: errMsg = GlobalDialogManager.createMessageBox('No selection', 'Nothing selected, cannot run exporter.', Dialog.ERROR) errMsg.run() return shaderlist = [] geomlist = [] # simple linear triangulation of n-sided poly def triangulate(pointset): tris = [] for count in range(1, len(pointset) - 1): tris.append([pointset[0], pointset[count], pointset[count + 1]]) return tris # skin patch matrix with tris def skinmatrix(pointset, width, height): tris = [] for h in range(height-1): for w in range(width-1): tris.append([pointset[w+(h*width)], pointset[w+1+(h*width)], pointset[w+width+(h*width)]]) tris.append([pointset[w+1+(h*width)], pointset[w+1+width+(h*width)], pointset[w+width+(h*width)]]) return tris def processBrush(brushnode): verts = [] faces = [] numfaces = brushnode.getNumFaces() for index in range(numfaces): facenode = brushnode.getFace(index) shader = facenode.getShader() # Tels: skip if caulk and no caulk should be exported if (shader == 'textures/common/caulk') and (int(GlobalRegistry.get('user/scripts/aseExport/exportcaulk'))) == 0: continue if not shader in shaderlist: shaderlist.append(shader) winding = facenode.getWinding() tris = triangulate([x+len(verts) for x in range(len(winding))]) for x in tris: x.append(shaderlist.index(shader)) faces.append(x) for x in reversed(winding): verts.append([x.vertex.x(), x.vertex.y(), x.vertex.z(), x.texcoord.x(), x.texcoord.y() * -1, x.normal.x(), x.normal.y(), x.normal.z()]) geomlist.append([verts, faces]) return def processPatch(patchnode): verts = [] faces = [] shader = patchnode.getShader() # Tels: skip if caulk and no caulk should be exported if shader == 'textures/common/caulk' and int(GlobalRegistry.get('user/scripts/aseExport/exportcaulk')) == 0: return if not shader in shaderlist: shaderlist.append(shader) mesh = patchnode.getTesselatedPatchMesh() for x in mesh.vertices: verts.append([x.vertex.x(), x.vertex.y(), x.vertex.z(), x.texcoord.x(), x.texcoord.y() * -1, x.normal.x(), x.normal.y(), x.normal.z()]) tris = skinmatrix([x for x in range(len(verts))], mesh.width, mesh.height) for x in tris: x.append(shaderlist.index(shader)) faces.append(x) geomlist.append([verts, faces]) return # Branch on primitive nodes def processPrimitive(scenenode): if scenenode.isBrush(): processBrush(scenenode.getBrush()) elif scenenode.isPatch(): processPatch(scenenode.getPatch()) return # Traversor class to visit child primitives of entities class nodeVisitor(SceneNodeVisitor): def pre(self, scenenode): # Brush? if scenenode.isBrush(): processBrush(scenenode.getBrush()) # Patch? elif scenenode.isPatch(): processPatch(scenenode.getPatch()) # Traverse all child nodes, regardless of type return 1 class dataCollector(SelectionVisitor): def visit(self, scenenode): if scenenode.getNodeType() == 'primitive': processPrimitive(scenenode) elif scenenode.isEntity(): # greebo: Found an entity, this could be a func_static or similar # Traverse children of this entity using a new walker nodewalker = nodeVisitor() scenenode.traverse(nodewalker) else: print('WARNING: unsupported node type selected. Skipping: ' + scenenode.getNodeType()) # Dialog dialog = GlobalDialogManager.createDialog(script + 'v' + version) # Add an entry box and remember the handle fileHandle = dialog.addEntryBox("Filename:") dialog.setElementValue(fileHandle, GlobalRegistry.get('user/scripts/aseExport/recentFilename')) # Add an entry box and remember the handle pathHandle = dialog.addPathEntry("Save path:", True) dialog.setElementValue(pathHandle, GlobalRegistry.get('user/scripts/aseExport/recentPath')) # Add a checkbox centerObjectsHandle = dialog.addCheckbox("Center objects at 0,0,0 origin") dialog.setElementValue(centerObjectsHandle, GlobalRegistry.get('user/scripts/aseExport/centerObjects')) # Add another checkbox exportCaulkHandle = dialog.addCheckbox("Export caulked faces") dialog.setElementValue(exportCaulkHandle, GlobalRegistry.get('user/scripts/aseExport/exportcaulk')) if dialog.run() == Dialog.OK: fullpath = dialog.getElementValue(pathHandle) + '/' + dialog.getElementValue(fileHandle) if not fullpath.endswith('.ase'): fullpath = fullpath + '.ase' # Save the path for later use GlobalRegistry.set('user/scripts/aseExport/recentFilename', dialog.getElementValue(fileHandle)) GlobalRegistry.set('user/scripts/aseExport/recentPath', dialog.getElementValue(pathHandle)) GlobalRegistry.set('user/scripts/aseExport/centerObjects', dialog.getElementValue(centerObjectsHandle)) GlobalRegistry.set('user/scripts/aseExport/exportcaulk', dialog.getElementValue(exportCaulkHandle)) try: file = open(fullpath, 'r') file.close() prompt = GlobalDialogManager.createMessageBox('Warning', 'The file ' + fullpath + ' already exists. Do you wish to overwrite it?', Dialog.ASK) if prompt.run() == Dialog.YES: overwrite = True else: overwrite = False except IOError: overwrite = True if overwrite: # Tels: Only collect the data if we are going to export it walker = dataCollector() GlobalSelectionSystem.foreachSelected(walker) # greebo: Check if we should center objects at the 0,0,0 origin if int(dialog.getElementValue(centerObjectsHandle)) == 1: #center objects at 0,0,0 xlist = [] ylist = [] zlist = [] for item in geomlist: for vert in item[0]: xlist.append(vert[0]) ylist.append(vert[1]) zlist.append(vert[2]) xcenter=(max(xlist)+min(xlist))/2 ycenter=(max(ylist)+min(ylist))/2 zcenter=(max(zlist)+min(zlist))/2 for item in geomlist: for vert in item[0]: vert[0] = vert[0] - xcenter vert[1] = vert[1] - ycenter vert[2] = vert[2] - zcenter # split objects that do not share the same texture on all faces for x in geomlist: texlist = [] for data in x[1]: texlist.append(data[3]) if len(set(texlist)) > 1: temp = [] for texture in set(texlist): vertlist = [] facelist = [] for data in x[1]: if data[3] == texture: facelist.append(data) usedverts = [] for face in facelist: usedverts.extend(face[0:3]) usedverts = list(set(usedverts)) for index in usedverts: vertlist.append(x[0][index]) newfacelist = [] for face in facelist: newfacelist.append([vertlist.index(x[0][face[0]]),vertlist.index(x[0][face[1]]),vertlist.index(x[0][face[2]]),face[3]]) temp.append([vertlist, newfacelist]) del geomlist[geomlist.index(x)] geomlist.extend(temp) scene = '''\t*SCENE_FILENAME "{0}" \t*SCENE_FIRSTFRAME 0 \t*SCENE_LASTFRAME 100 \t*SCENE_FRAMESPEED 30 \t*SCENE_TICKSPERFRAME 160 \t*SCENE_BACKGROUND_STATIC 0.0000\t0.0000\t0.0000 \t*SCENE_AMBIENT_STATIC 0.0000\t0.0000\t0.0000'''.format(GlobalMap.getMapName()) materials = str() for x in shaderlist: materials = materials + '''\t*MATERIAL {0} {{ \t\t*MATERIAL_NAME "{1}" \t\t*MATERIAL_CLASS "Standard" \t\t*MATERIAL_AMBIENT 0.5882\t0.5882\t0.5882 \t\t*MATERIAL_DIFFUSE 0.5882\t0.5882\t0.5882 \t\t*MATERIAL_SPECULAR 0.9000\t0.9000\t0.9000 \t\t*MATERIAL_SHINE 0.1000 \t\t*MATERIAL_SHINESTRENGTH 0.0000 \t\t*MATERIAL_TRANSPARENCY 0.0000 \t\t*MATERIAL_WIRESIZE 1.0000 \t\t*MATERIAL_SHADING Blinn \t\t*MATERIAL_XP_FALLOFF 0.0000 \t\t*MATERIAL_SELFILLUM 0.0000 \t\t*MATERIAL_FALLOFF In \t\t*MATERIAL_XP_TYPE Filter \t\t*MAP_DIFFUSE {{ \t\t\t*MAP_NAME "{2}" \t\t\t*MAP_CLASS "Bitmap" \t\t\t*MAP_SUBNO 1 \t\t\t*MAP_AMOUNT 1.0000 \t\t\t*BITMAP "\\\\purgatory\\purgatory\\doom\\base\{2}" \t\t\t*MAP_TYPE Screen \t\t\t*UVW_U_OFFSET 0.0000 \t\t\t*UVW_V_OFFSET 0.0000 \t\t\t*UVW_U_TILING 1.0000 \t\t\t*UVW_V_TILING 1.0000 \t\t\t*UVW_ANGLE 0.0000 \t\t\t*UVW_BLUR 1.0000 \t\t\t*UVW_BLUR_OFFSET 0.0000 \t\t\t*UVW_NOUSE_AMT 1.0000 \t\t\t*UVW_NOISE_SIZE 1.0000 \t\t\t*UVW_NOISE_LEVEL 1 \t\t\t*UVW_NOISE_PHASE 0.0000 \t\t\t*BITMAP_FILTER Pyramidal \t\t}} \t}} '''.format(shaderlist.index(x), x, x.replace('/','\\')) geomobjects = str() for x in geomlist: # x[0] = vertices # vert[0] - vert[2] = vertex coords # vert[3] - vert[4] = texture coords # vert[5] - vert[7] = normal # x[1] = faces vertlist = str() for count, data in enumerate(x[0]): vertlist = vertlist + '''\t\t\t*MESH_VERTEX {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(count, data[0], data[1], data[2]) facelist = str() for count, data in enumerate(x[1]): facelist = facelist + '''\t\t\t*MESH_FACE {0}: A: {1} B: {2} C: {3} AB: 0 BC: 0 CA: 0\t *MESH_SMOOTHING 1 \t*MESH_MTLID {4}\n'''.format(count, data[0], data[1], data[2], data[3]) tvertlist = str() for count, data in enumerate(x[0]): tvertlist = tvertlist + '''\t\t\t*MESH_TVERT {0}\t{1: 10.4f}\t{2: 10.4f}\t0.0000\n'''.format(count, data[3], data[4]) tfacelist = str() for count, data in enumerate(x[1]): tfacelist = tfacelist + '''\t\t\t*MESH_TFACE {0}\t{1}\t{2}\t{3}\n'''.format(count, data[0], data[1], data[2]) cfacelist = str() for count, data in enumerate(x[1]): cfacelist = cfacelist + '''\t\t\t*MESH_CFACE {0}\t0\t0\t0\n'''.format(count) normals = str() for count, data in enumerate(x[1]): normals += '''\t\t\t*MESH_FACENORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(count, x[0][data[0]][5], x[0][data[0]][6], x[0][data[0]][7]) # greebo: use first vertex normal as face normal normals += '''\t\t\t\t*MESH_VERTEXNORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(data[0], x[0][data[0]][5], x[0][data[0]][6], x[0][data[0]][7]) normals += '''\t\t\t\t*MESH_VERTEXNORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(data[1], x[0][data[1]][5], x[0][data[1]][6], x[0][data[1]][7]) normals += '''\t\t\t\t*MESH_VERTEXNORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(data[2], x[0][data[2]][5], x[0][data[2]][6], x[0][data[2]][7]) if len(x[1]) == 0: continue geomobjects = geomobjects + '''*GEOMOBJECT {{ \t*NODE_NAME "{0}" \t*NODE_TM {{ \t\t*NODE_NAME "{0}" \t\t*INHERIT_POS 0 0 0 \t\t*INHERIT_ROT 0 0 0 \t\t*INHERIT_SCL 0 0 0 \t\t*TM_ROW0 1.0000\t0.0000\t0.0000 \t\t*TM_ROW1 0.0000\t1.0000\t0.0000 \t\t*TM_ROW2 0.0000\t0.0000\t1.0000 \t\t*TM_ROW3 0.0000\t0.0000\t0.0000 \t\t*TM_POS 0.0000\t0.0000\t0.0000 \t\t*TM_ROTAXIS 0.0000\t0.0000\t0.0000 \t\t*TM_ROTANGLE 0.0000 \t\t*TM_SCALE 1.0000\t1.0000\t1.0000 \t\t*TM_SCALEAXIS 0.0000\t0.0000\t0.0000 \t\t*TM_SCALEAXISANG 0.0000 \t}} \t*MESH {{ \t\t*TIMEVALUE 0 \t\t*MESH_NUMVERTEX {1} \t\t*MESH_NUMFACES {2} \t\t*MESH_VERTEX_LIST {{ {3}\t\t}} \t\t*MESH_FACE_LIST {{ {4}\t\t}} \t\t*MESH_NUMTVERTEX {5} \t\t*MESH_TVERTLIST {{ {6}\t\t}} \t\t*MESH_NUMTVFACES {7} \t\t*MESH_TFACELIST {{ {8}\t\t}} \t\t*MESH_NUMCVERTEX 1 \t\t*MESH_CVERTLIST {{ \t\t\t*MESH_VERTCOL 0\t1.0000\t1.0000\t1.0000 \t\t}} \t\t*MESH_NUMCVFACES {9} \t\t*MESH_CFACELIST {{ {10}\t\t}} \t\t*MESH_NORMALS {{ {11}\t\t}} \t}} \t*PROP_MOTIONBLUR 0 \t*PROP_CASTSHADOW 1 \t*PROP_RECVSHADOW 1 \t*MATERIAL_REF {12} }}\n'''.format('mesh' + str(geomlist.index(x)), \ len(x[0]), \ len(x[1]), \ vertlist, \ facelist, \ len(x[0]), \ tvertlist, \ len(x[1]), \ tfacelist, \ len(x[1]), \ cfacelist, \ normals, \ x[1][0][3]) # material reference from first face data = '''*3DSMAX_ASCIIEXPORT\t200 *COMMENT "{0} v{1}" *SCENE {{ {2} }} *MATERIAL_LIST {{ \t*MATERIAL_COUNT {3} {4}}} {5}'''.format(script, version, scene, len(shaderlist), materials, geomobjects) # Write the compiled data to the output file file = open(fullpath, 'w') file.write(data) file.close() # __executeCommand__ evaluates to true after DarkRadiant has successfully initialised if __executeCommand__: execute() DarkRadiant-2.0.2/install/scripts/commands/ase_export_blend.py000066400000000000000000000400311245424655700245400ustar00rootroot00000000000000# ***** BEGIN GPL LICENSE BLOCK ***** # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # ***** END GPL LICENCE BLOCK ***** #TODO: # Set the command name so that DarkRadiant recognises this file __commandName__ = 'aseExportBlend' __commandDisplayName__ = 'Export blended ASE...' # The actual algorithm called by DarkRadiant is contained in the execute() function def execute(): script = "Dark Radiant ASCII Scene Export (*.ase)" author = "Richard Bartlett, some additions by greebo and tels" version = "0.7" # Check if we have a valid selection selectionInfo = GlobalSelectionSystem.getSelectionInfo() # Don't allow empty selections or selected components only if selectionInfo.totalCount == 0 or selectionInfo.totalCount == selectionInfo.componentCount: errMsg = GlobalDialogManager.createMessageBox('No selection', 'Nothing selected, cannot run exporter.', Dialog.ERROR) errMsg.run() return shaderlist = [] geomlist = [] # used for getting the blend height def getBlendHeight(x,p,size): min = 0 max = 0 for i in range(size-1): y = x[i] if y[2]max: max=y[2] return max*float(p)+min*(1-float(p)) # which texture to choose def getColor(x,h): if x 1: temp = [] for texture in set(texlist): vertlist = [] facelist = [] for data in x[1]: if data[3] == texture: facelist.append(data) usedverts = [] for face in facelist: usedverts.extend(face[0:3]) usedverts = list(set(usedverts)) for index in usedverts: vertlist.append(x[0][index]) newfacelist = [] for face in facelist: newfacelist.append([vertlist.index(x[0][face[0]]),vertlist.index(x[0][face[1]]),vertlist.index(x[0][face[2]]),face[3]]) newgeomlist.append([vertlist, newfacelist]) #del geomlist[geomlist.index(x)] #geomlist.extend(temp) #newgeomlist.append(temp) else: newgeomlist.append(x) geomlist = newgeomlist scene = '''\t*SCENE_FILENAME "{0}" \t*SCENE_FIRSTFRAME 0 \t*SCENE_LASTFRAME 100 \t*SCENE_FRAMESPEED 30 \t*SCENE_TICKSPERFRAME 160 \t*SCENE_BACKGROUND_STATIC 0.0000\t0.0000\t0.0000 \t*SCENE_AMBIENT_STATIC 0.0000\t0.0000\t0.0000'''.format(GlobalMap.getMapName()) materials = str() for x in shaderlist: materials = materials + '''\t*MATERIAL {0} {{ \t\t*MATERIAL_NAME "{1}" \t\t*MATERIAL_CLASS "Standard" \t\t*MATERIAL_AMBIENT 0.5882\t0.5882\t0.5882 \t\t*MATERIAL_DIFFUSE 0.5882\t0.5882\t0.5882 \t\t*MATERIAL_SPECULAR 0.9000\t0.9000\t0.9000 \t\t*MATERIAL_SHINE 0.1000 \t\t*MATERIAL_SHINESTRENGTH 0.0000 \t\t*MATERIAL_TRANSPARENCY 0.0000 \t\t*MATERIAL_WIRESIZE 1.0000 \t\t*MATERIAL_SHADING Blinn \t\t*MATERIAL_XP_FALLOFF 0.0000 \t\t*MATERIAL_SELFILLUM 0.0000 \t\t*MATERIAL_FALLOFF In \t\t*MATERIAL_XP_TYPE Filter \t\t*MAP_DIFFUSE {{ \t\t\t*MAP_NAME "{2}" \t\t\t*MAP_CLASS "Bitmap" \t\t\t*MAP_SUBNO 1 \t\t\t*MAP_AMOUNT 1.0000 \t\t\t*BITMAP "\\\\purgatory\\purgatory\\doom\\base\{2}" \t\t\t*MAP_TYPE Screen \t\t\t*UVW_U_OFFSET 0.0000 \t\t\t*UVW_V_OFFSET 0.0000 \t\t\t*UVW_U_TILING 1.0000 \t\t\t*UVW_V_TILING 1.0000 \t\t\t*UVW_ANGLE 0.0000 \t\t\t*UVW_BLUR 1.0000 \t\t\t*UVW_BLUR_OFFSET 0.0000 \t\t\t*UVW_NOUSE_AMT 1.0000 \t\t\t*UVW_NOISE_SIZE 1.0000 \t\t\t*UVW_NOISE_LEVEL 1 \t\t\t*UVW_NOISE_PHASE 0.0000 \t\t\t*BITMAP_FILTER Pyramidal \t\t}} \t}} '''.format(shaderlist.index(x), x, x.replace('/','\\')) geomobjects = str() for x in geomlist: # x[0] = vertices # vert[0] - vert[2] = vertex coords # vert[3] - vert[4] = texture coords # vert[5] - vert[7] = normal # x[1] = faces vertlist = str() bh = getBlendHeight(x[0],dialog.getElementValue(blendHeightHandle),len(x[0])) for count, data in enumerate(x[0]): vertlist = vertlist + '''\t\t\t*MESH_VERTEX {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(count, data[0], data[1], data[2]) facelist = str() for count, data in enumerate(x[1]): facelist = facelist + '''\t\t\t*MESH_FACE {0}: A: {1} B: {2} C: {3} AB: 0 BC: 0 CA: 0\t *MESH_SMOOTHING 1 \t*MESH_MTLID {4}\n'''.format(count, data[0], data[1], data[2], data[3]) tvertlist = str() for count, data in enumerate(x[0]): tvertlist = tvertlist + '''\t\t\t*MESH_TVERT {0}\t{1: 10.4f}\t{2: 10.4f}\t0.0000\n'''.format(count, data[3], data[4]) tfacelist = str() for count, data in enumerate(x[1]): tfacelist = tfacelist + '''\t\t\t*MESH_TFACE {0}\t{1}\t{2}\t{3}\n'''.format(count, data[0], data[1], data[2]) cfacelist = str() for count, data in enumerate(x[1]): cfacelist = cfacelist + '''\t\t\t*MESH_CFACE {0}\t{1}\t{2}\t{3}\n'''.format(count,getColor(x[0][data[0]][2],bh),getColor(x[0][data[1]][2],bh),getColor(x[0][data[2]][2],bh)) normals = str() for count, data in enumerate(x[1]): normals += '''\t\t\t*MESH_FACENORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(count, x[0][data[0]][5], x[0][data[0]][6], x[0][data[0]][7]) # greebo: use first vertex normal as face normal normals += '''\t\t\t\t*MESH_VERTEXNORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(data[0], x[0][data[0]][5], x[0][data[0]][6], x[0][data[0]][7]) normals += '''\t\t\t\t*MESH_VERTEXNORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(data[1], x[0][data[1]][5], x[0][data[1]][6], x[0][data[1]][7]) normals += '''\t\t\t\t*MESH_VERTEXNORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(data[2], x[0][data[2]][5], x[0][data[2]][6], x[0][data[2]][7]) if len(x[1]) == 0: continue geomobjects = geomobjects + '''*GEOMOBJECT {{ \t*NODE_NAME "{0}" \t*NODE_TM {{ \t\t*NODE_NAME "{0}" \t\t*INHERIT_POS 0 0 0 \t\t*INHERIT_ROT 0 0 0 \t\t*INHERIT_SCL 0 0 0 \t\t*TM_ROW0 1.0000\t0.0000\t0.0000 \t\t*TM_ROW1 0.0000\t1.0000\t0.0000 \t\t*TM_ROW2 0.0000\t0.0000\t1.0000 \t\t*TM_ROW3 0.0000\t0.0000\t0.0000 \t\t*TM_POS 0.0000\t0.0000\t0.0000 \t\t*TM_ROTAXIS 0.0000\t0.0000\t0.0000 \t\t*TM_ROTANGLE 0.0000 \t\t*TM_SCALE 1.0000\t1.0000\t1.0000 \t\t*TM_SCALEAXIS 0.0000\t0.0000\t0.0000 \t\t*TM_SCALEAXISANG 0.0000 \t}} \t*MESH {{ \t\t*TIMEVALUE 0 \t\t*MESH_NUMVERTEX {1} \t\t*MESH_NUMFACES {2} \t\t*MESH_VERTEX_LIST {{ {3}\t\t}} \t\t*MESH_FACE_LIST {{ {4}\t\t}} \t\t*MESH_NUMTVERTEX {5} \t\t*MESH_TVERTLIST {{ {6}\t\t}} \t\t*MESH_NUMTVFACES {7} \t\t*MESH_TFACELIST {{ {8}\t\t}} \t\t*MESH_NUMCVERTEX 2 \t\t*MESH_CVERTLIST {{ \t\t\t*MESH_VERTCOL 0\t1.0000\t1.0000\t1.0000 \t\t\t*MESH_VERTCOL 1\t0.0000\t0.0000\t0.0000 \t\t}} \t\t*MESH_NUMCVFACES {9} \t\t*MESH_CFACELIST {{ {10}\t\t}} \t\t*MESH_NORMALS {{ {11}\t\t}} \t}} \t*PROP_MOTIONBLUR 0 \t*PROP_CASTSHADOW 1 \t*PROP_RECVSHADOW 1 \t*MATERIAL_REF {12} }}\n'''.format('mesh' + str(geomlist.index(x)), \ len(x[0]), \ len(x[1]), \ vertlist, \ facelist, \ len(x[0]), \ tvertlist, \ len(x[1]), \ tfacelist, \ len(x[1]), \ cfacelist, \ normals, \ x[1][0][3]) # material reference from first face data = '''*3DSMAX_ASCIIEXPORT\t200 *COMMENT "{0} v{1}" *SCENE {{ {2} }} *MATERIAL_LIST {{ \t*MATERIAL_COUNT {3} {4}}} {5}'''.format(script, version, scene, len(shaderlist), materials, geomobjects) # Write the compiled data to the output file file = open(fullpath, 'w') file.write(data) file.close() # __executeCommand__ evaluates to true after DarkRadiant has successfully initialised if __executeCommand__: execute() DarkRadiant-2.0.2/install/scripts/commands/convert_to_ase_and_replace.py000066400000000000000000000374361245424655700265710ustar00rootroot00000000000000# ***** BEGIN GPL LICENSE BLOCK ***** # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # ***** END GPL LICENCE BLOCK ***** #TODO: # Set the command name so that DarkRadiant recognises this file __commandName__ = 'aseConvertAndReplace' __commandDisplayName__ = 'Convert to ASE...' # The actual algorithm called by DarkRadiant is contained in the execute() function def execute(): script = "Dark Radiant ASCII Scene Export (*.ase)" author = "Richard Bartlett, some additions by greebo" version = "0.6" # Check if we have a valid selection selectionInfo = GlobalSelectionSystem.getSelectionInfo() # Don't allow empty selections or selected components only if selectionInfo.totalCount == 0 or selectionInfo.totalCount == selectionInfo.componentCount: errMsg = GlobalDialogManager.createMessageBox('No selection', 'Nothing selected, cannot run exporter.', Dialog.ERROR) errMsg.run() return if selectionInfo.entityCount != 1: errMsg = GlobalDialogManager.createMessageBox('Wrong selection', 'Please select exactly one func_static.', Dialog.ERROR) errMsg.run() return if not GlobalRegistry.get('user/scripts/aseExport/initialUserWarning') == '1': GlobalRegistry.set('user/scripts/aseExport/initialUserWarning', '1') warningMsg = GlobalDialogManager.createMessageBox('Careful', 'This option will export the selected func_static to ASE and replace your entity with the newly created model.\nThe currently selected func_static will be DELETED. You can undo this operation, but know what you''re doing!', Dialog.WARNING) warningMsg.run() shaderlist = [] geomlist = [] # simple linear triangulation of n-sided poly def triangulate(pointset): tris = [] for count in range(1, len(pointset) - 1): tris.append([pointset[0], pointset[count], pointset[count + 1]]) return tris # skin patch matrix with tris def skinmatrix(pointset, width, height): tris = [] for h in range(height-1): for w in range(width-1): tris.append([pointset[w+(h*width)], pointset[w+1+(h*width)], pointset[w+width+(h*width)]]) tris.append([pointset[w+1+(h*width)], pointset[w+1+width+(h*width)], pointset[w+width+(h*width)]]) return tris def processBrush(brushnode): verts = [] faces = [] numfaces = brushnode.getNumFaces() for index in range(numfaces): facenode = brushnode.getFace(index) shader = facenode.getShader() if not shader in shaderlist: shaderlist.append(shader) winding = facenode.getWinding() tris = triangulate([x+len(verts) for x in range(len(winding))]) for x in tris: x.append(shaderlist.index(shader)) faces.append(x) for x in reversed(winding): verts.append([x.vertex.x(), x.vertex.y(), x.vertex.z(), x.texcoord.x(), x.texcoord.y() * -1, x.normal.x(), x.normal.y(), x.normal.z()]) geomlist.append([verts, faces]) return def processPatch(patchnode): verts = [] faces = [] shader = patchnode.getShader() if not shader in shaderlist: shaderlist.append(shader) mesh = patchnode.getTesselatedPatchMesh() for x in mesh.vertices: verts.append([x.vertex.x(), x.vertex.y(), x.vertex.z(), x.texcoord.x(), x.texcoord.y() * -1, x.normal.x(), x.normal.y(), x.normal.z()]) tris = skinmatrix([x for x in range(len(verts))], mesh.width, mesh.height) for x in tris: x.append(shaderlist.index(shader)) faces.append(x) geomlist.append([verts, faces]) return # Branch on primitive nodes def processPrimitive(scenenode): if scenenode.isBrush(): processBrush(scenenode.getBrush()) elif scenenode.isPatch(): processPatch(scenenode.getPatch()) return # Traversor class to visit child primitives of entities class nodeVisitor(SceneNodeVisitor): def pre(self, scenenode): # Brush? if scenenode.isBrush(): processBrush(scenenode.getBrush()) # Patch? elif scenenode.isPatch(): processPatch(scenenode.getPatch()) # Traverse all child nodes, regardless of type return 1 class dataCollector(SelectionVisitor): fs_origin = Vector3(0,0,0) fs = 0 def visit(self, scenenode): if scenenode.getNodeType() == 'primitive': processPrimitive(scenenode) elif scenenode.isEntity(): import re # greebo: Found an entity, this could be a func_static or similar # Traverse children of this entity using a new walker nodewalker = nodeVisitor() scenenode.traverse(nodewalker) entitynode = scenenode.getEntity() if not entitynode.getKeyValue("origin") == '': origin = entitynode.getKeyValue("origin"); coords = re.findall(r'([\-\d.]+)', origin) self.fs_origin = Vector3(float(coords[0]), float(coords[1]), float(coords[2])) self.fs = scenenode else: print('WARNING: unsupported node type selected. Skipping: ' + scenenode.getNodeType()) walker = dataCollector() GlobalSelectionSystem.foreachSelected(walker) found_func_static_origin = walker.fs_origin found_func_static = walker.fs # Dialog dialog = GlobalDialogManager.createDialog(script + 'v' + version) # Add an entry box and remember the handle fileHandle = dialog.addEntryBox("Filename:") #dialog.setElementValue(fileHandle, GlobalRegistry.get('user/scripts/aseExport/recentFilename')) suggestedName = found_func_static.getEntity().getKeyValue("name") dialog.setElementValue(fileHandle, suggestedName + ".ase") # Add an entry box and remember the handle pathHandle = dialog.addPathEntry("Save path:", True) dialog.setElementValue(pathHandle, GlobalRegistry.get('user/scripts/aseExport/recentPath')) if dialog.run() == Dialog.OK: fullpath = dialog.getElementValue(pathHandle) + '/' + dialog.getElementValue(fileHandle) if not fullpath.endswith('.ase'): fullpath = fullpath + '.ase' # Save the path for later use GlobalRegistry.set('user/scripts/aseExport/recentFilename', dialog.getElementValue(fileHandle)) GlobalRegistry.set('user/scripts/aseExport/recentPath', dialog.getElementValue(pathHandle)) try: file = open(fullpath, 'r') file.close() prompt = GlobalDialogManager.createMessageBox('Warning', 'The file ' + fullpath + ' already exists. Do you wish to overwrite it?', Dialog.ASK) if prompt.run() == Dialog.YES: overwrite = True else: overwrite = False except IOError: overwrite = True if overwrite: xlist = [] ylist = [] zlist = [] # center objects at found func_static origin xcenter = found_func_static_origin.x() ycenter = found_func_static_origin.y() zcenter = found_func_static_origin.z() for item in geomlist: for vert in item[0]: vert[0] = vert[0] - xcenter vert[1] = vert[1] - ycenter vert[2] = vert[2] - zcenter # split objects that do not share the same texture on all faces for x in geomlist: texlist = [] for data in x[1]: texlist.append(data[3]) if len(set(texlist)) > 1: temp = [] for texture in set(texlist): vertlist = [] facelist = [] for data in x[1]: if data[3] == texture: facelist.append(data) usedverts = [] for face in facelist: usedverts.extend(face[0:3]) usedverts = list(set(usedverts)) for index in usedverts: vertlist.append(x[0][index]) newfacelist = [] for face in facelist: newfacelist.append([vertlist.index(x[0][face[0]]),vertlist.index(x[0][face[1]]),vertlist.index(x[0][face[2]]),face[3]]) temp.append([vertlist, newfacelist]) del geomlist[geomlist.index(x)] geomlist.extend(temp) scene = '''\t*SCENE_FILENAME "{0}" \t*SCENE_FIRSTFRAME 0 \t*SCENE_LASTFRAME 100 \t*SCENE_FRAMESPEED 30 \t*SCENE_TICKSPERFRAME 160 \t*SCENE_BACKGROUND_STATIC 0.0000\t0.0000\t0.0000 \t*SCENE_AMBIENT_STATIC 0.0000\t0.0000\t0.0000'''.format(GlobalMap.getMapName()) materials = str() for x in shaderlist: materials = materials + '''\t*MATERIAL {0} {{ \t\t*MATERIAL_NAME "{1}" \t\t*MATERIAL_CLASS "Standard" \t\t*MATERIAL_AMBIENT 0.5882\t0.5882\t0.5882 \t\t*MATERIAL_DIFFUSE 0.5882\t0.5882\t0.5882 \t\t*MATERIAL_SPECULAR 0.9000\t0.9000\t0.9000 \t\t*MATERIAL_SHINE 0.1000 \t\t*MATERIAL_SHINESTRENGTH 0.0000 \t\t*MATERIAL_TRANSPARENCY 0.0000 \t\t*MATERIAL_WIRESIZE 1.0000 \t\t*MATERIAL_SHADING Blinn \t\t*MATERIAL_XP_FALLOFF 0.0000 \t\t*MATERIAL_SELFILLUM 0.0000 \t\t*MATERIAL_FALLOFF In \t\t*MATERIAL_XP_TYPE Filter \t\t*MAP_DIFFUSE {{ \t\t\t*MAP_NAME "{2}" \t\t\t*MAP_CLASS "Bitmap" \t\t\t*MAP_SUBNO 1 \t\t\t*MAP_AMOUNT 1.0000 \t\t\t*BITMAP "\\\\purgatory\\purgatory\\doom\\base\{2}" \t\t\t*MAP_TYPE Screen \t\t\t*UVW_U_OFFSET 0.0000 \t\t\t*UVW_V_OFFSET 0.0000 \t\t\t*UVW_U_TILING 1.0000 \t\t\t*UVW_V_TILING 1.0000 \t\t\t*UVW_ANGLE 0.0000 \t\t\t*UVW_BLUR 1.0000 \t\t\t*UVW_BLUR_OFFSET 0.0000 \t\t\t*UVW_NOUSE_AMT 1.0000 \t\t\t*UVW_NOISE_SIZE 1.0000 \t\t\t*UVW_NOISE_LEVEL 1 \t\t\t*UVW_NOISE_PHASE 0.0000 \t\t\t*BITMAP_FILTER Pyramidal \t\t}} \t}} '''.format(shaderlist.index(x), x, x.replace('/','\\')) geomobjects = str() for x in geomlist: # x[0] = vertices # vert[0] - vert[2] = vertex coords # vert[3] - vert[4] = texture coords # vert[5] - vert[7] = normal # x[1] = faces vertlist = str() for count, data in enumerate(x[0]): vertlist = vertlist + '''\t\t\t*MESH_VERTEX {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(count, data[0], data[1], data[2]) facelist = str() for count, data in enumerate(x[1]): facelist = facelist + '''\t\t\t*MESH_FACE {0}: A: {1} B: {2} C: {3} AB: 0 BC: 0 CA: 0\t *MESH_SMOOTHING 1 \t*MESH_MTLID {4}\n'''.format(count, data[0], data[1], data[2], data[3]) tvertlist = str() for count, data in enumerate(x[0]): tvertlist = tvertlist + '''\t\t\t*MESH_TVERT {0}\t{1: 10.4f}\t{2: 10.4f}\t0.0000\n'''.format(count, data[3], data[4]) tfacelist = str() for count, data in enumerate(x[1]): tfacelist = tfacelist + '''\t\t\t*MESH_TFACE {0}\t{1}\t{2}\t{3}\n'''.format(count, data[0], data[1], data[2]) cfacelist = str() for count, data in enumerate(x[1]): cfacelist = cfacelist + '''\t\t\t*MESH_CFACE {0}\t0\t0\t0\n'''.format(count) normals = str() for count, data in enumerate(x[1]): normals += '''\t\t\t*MESH_FACENORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(count, x[0][data[0]][5], x[0][data[0]][6], x[0][data[0]][7]) # greebo: use first vertex normal as face normal normals += '''\t\t\t\t*MESH_VERTEXNORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(data[0], x[0][data[0]][5], x[0][data[0]][6], x[0][data[0]][7]) normals += '''\t\t\t\t*MESH_VERTEXNORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(data[1], x[0][data[1]][5], x[0][data[1]][6], x[0][data[1]][7]) normals += '''\t\t\t\t*MESH_VERTEXNORMAL {0}\t{1: 10.4f}\t{2: 10.4f}\t{3: 10.4f}\n'''.format(data[2], x[0][data[2]][5], x[0][data[2]][6], x[0][data[2]][7]) if len(x[1]) == 0: continue geomobjects = geomobjects + '''*GEOMOBJECT {{ \t*NODE_NAME "{0}" \t*NODE_TM {{ \t\t*NODE_NAME "{0}" \t\t*INHERIT_POS 0 0 0 \t\t*INHERIT_ROT 0 0 0 \t\t*INHERIT_SCL 0 0 0 \t\t*TM_ROW0 1.0000\t0.0000\t0.0000 \t\t*TM_ROW1 0.0000\t1.0000\t0.0000 \t\t*TM_ROW2 0.0000\t0.0000\t1.0000 \t\t*TM_ROW3 0.0000\t0.0000\t0.0000 \t\t*TM_POS 0.0000\t0.0000\t0.0000 \t\t*TM_ROTAXIS 0.0000\t0.0000\t0.0000 \t\t*TM_ROTANGLE 0.0000 \t\t*TM_SCALE 1.0000\t1.0000\t1.0000 \t\t*TM_SCALEAXIS 0.0000\t0.0000\t0.0000 \t\t*TM_SCALEAXISANG 0.0000 \t}} \t*MESH {{ \t\t*TIMEVALUE 0 \t\t*MESH_NUMVERTEX {1} \t\t*MESH_NUMFACES {2} \t\t*MESH_VERTEX_LIST {{ {3}\t\t}} \t\t*MESH_FACE_LIST {{ {4}\t\t}} \t\t*MESH_NUMTVERTEX {5} \t\t*MESH_TVERTLIST {{ {6}\t\t}} \t\t*MESH_NUMTVFACES {7} \t\t*MESH_TFACELIST {{ {8}\t\t}} \t\t*MESH_NUMCVERTEX 1 \t\t*MESH_CVERTLIST {{ \t\t\t*MESH_VERTCOL 0\t1.0000\t1.0000\t1.0000 \t\t}} \t\t*MESH_NUMCVFACES {9} \t\t*MESH_CFACELIST {{ {10}\t\t}} \t\t*MESH_NORMALS {{ {11}\t\t}} \t}} \t*PROP_MOTIONBLUR 0 \t*PROP_CASTSHADOW 1 \t*PROP_RECVSHADOW 1 \t*MATERIAL_REF {12} }}\n'''.format('mesh' + str(geomlist.index(x)), \ len(x[0]), \ len(x[1]), \ vertlist, \ facelist, \ len(x[0]), \ tvertlist, \ len(x[1]), \ tfacelist, \ len(x[1]), \ cfacelist, \ normals, \ x[1][0][3]) # material reference from first face data = '''*3DSMAX_ASCIIEXPORT\t200 *COMMENT "{0} v{1}" *SCENE {{ {2} }} *MATERIAL_LIST {{ \t*MATERIAL_COUNT {3} {4}}} {5}'''.format(script, version, scene, len(shaderlist), materials, geomobjects) # Write the compiled data to the output file file = open(fullpath, 'w') file.write(data) file.close() GlobalCommandSystem.execute('DeleteSelection') # Create a new func_static func_static = GlobalEntityCreator.createEntity("func_static") # Set the origin originKey = '{0} {1} {2}'.format(found_func_static_origin.x(), found_func_static_origin.y(), found_func_static_origin.z()) func_static.getEntity().setKeyValue("origin", originKey) relativePath = fullpath relativePath = relativePath.replace(GlobalGameManager.getModPath(), '') relativePath = relativePath.replace(GlobalGameManager.getModBasePath(), '') print('Relative path is ' + relativePath) func_static.getEntity().setKeyValue("model", relativePath) # Insert the entity as child to the root node func_static.addToContainer(GlobalSceneGraph.root()) # __executeCommand__ evaluates to true after DarkRadiant has successfully initialised if __executeCommand__: execute()DarkRadiant-2.0.2/install/scripts/commands/example.py000066400000000000000000000007751245424655700226710ustar00rootroot00000000000000# Set the command name so that DarkRadiant recognises this file __commandName__ = 'Example' # should not contain spaces __commandDisplayName__ = 'Nice display name for the menus' # should not contain spaces # The actual algorithm called by DarkRadiant is contained in the execute() function def execute(): shader = GlobalShaderSystem.getShaderForName('bc_rat') print(shader.getName()) # __executeCommand__ evaluates to true after DarkRadiant has successfully initialised if __executeCommand__: execute() DarkRadiant-2.0.2/install/scripts/commands/patchsplitter.py000066400000000000000000000301251245424655700241140ustar00rootroot00000000000000__commandName__ = 'SplitPatch' __commandDisplayName__ = 'Split patch' def execute(): MAXGRIDPOWER = 8 # Grid 256 MINGRIDPOWER = -1 # Grid 0.5 class UserError(Exception): pass class TooManyVerts(Exception): pass class TooFewVerts(Exception): pass class Vert: """Holds coords for one patch control vertex.""" def __init__(self, vertex, texcoord): self.vertex = Vector3(vertex) self.texcoord = Vector2(texcoord) class Verts: """A 2d matrix (row/col) implemented as a list where each element is a list of Vert objects in one row of the patch.""" def __init__(self, patch=None): self.verts = [] if patch: for rownum in range(patch.getHeight()): row = [] for colnum in range(patch.getWidth()): v = Vert(patch.ctrlAt(rownum, colnum).vertex, patch.ctrlAt(rownum, colnum).texcoord) row.append(v) self.verts.append(row) class PatchData: """Store all of the information needed to reconstruct a patch exactly.""" def __init__(self, patch): self.cols = patch.getWidth() # int self.rows = patch.getHeight() # int self.verts = Verts(patch) self.shader = patch.getShader() # string self.subdivisionsFixed = patch.subdivionsFixed() # bool self.subdivs = patch.getSubdivisions() # Subdivisions def replaceverts(self, verts): self.verts = verts self.rows = len(verts.verts) self.cols = len(verts.verts[0]) def getRows(self, first=0, last=None): """Return a Verts object holding the subset of the patch mesh verts in the specified row range.""" if not last: last = self.rows result = Verts() result.verts = self.verts.verts[first:last] return result def getCols(self, first=0, last=None): """Return a Verts object holding the subset of the patch mesh verts in the specified column range.""" if not last: last = self.cols result = Verts() result.verts = [r[first:last] for r in self.verts.verts] return result def getVertex(self, row, col): return self.verts.verts[row][col].vertex def getTexcoord(self, row, col): return self.verts.verts[row][col].texcoord # Utility functions def getAndValidateSelection(): sInfo = GlobalSelectionSystem.getSelectionInfo() if sInfo.patchCount != 1 or sInfo.brushCount > 0 or sInfo.entityCount > 0 or sInfo.componentCount < 2: raise UserError('Bad selection. Select one patch only, and ' \ '2 or more verts from the same (pink) row or column.') patch = GlobalSelectionSystem.ultimateSelected().getPatch() if not patch.isValid(): raise UserError("This isn't a valid patch. It has some invalid " \ "vertices, or maybe all vertices are in the same spot.") #if not patch.subdivionsFixed(): #raise UserError('You need to fix tesselation on the patch in the ' \ #'Patch Inspector (Shift+S) before splitting it.') return patch def resetPatch(patch, patchdata): """Apply patchdata to the patch, reconstructing it.""" p, pd = patch, patchdata p.setDims(pd.cols, pd.rows) p.setShader(pd.shader) p.setFixedSubdivisions(pd.subdivisionsFixed, pd.subdivs) for row in range(pd.rows): for col in range(pd.cols): p.ctrlAt(row, col).vertex = pd.getVertex(row, col) p.ctrlAt(row, col).texcoord = pd.getTexcoord(row, col) p.controlPointsChanged() def clonePatch(patch): """Clone the existing patch so the new one is automatically part of the same func_static and layer as the original. Return a reference to the new patch.""" patch.setSelected(0) # Clears vertex editing mode patch.setSelected(1) GlobalCommandSystem.execute('CloneSelection') return GlobalSelectionSystem.ultimateSelected().getPatch() # Procedures for identifying the selected verts. # They can't be accessed directly, so move them about to find out at what # distance they cross the bounding box of the patch. Then infer the # selected verts' bounding box, and which row or col they sit on. def distToEdge(patch, direction, axis, gridPower): """Return distance from selected verts' bounding box to the edge of the patch's bounding box. Make sure orthoview is facing right way before calling. SIDE EFFECTS: Leaves selected verts displaced by a small amount. Grid size is changed.""" GlobalGrid.setGridSize(gridPower) stepsize = 2 ** gridPower reverse = 'right' if direction == 'left' \ else 'left' if direction == 'right' \ else 'down' if direction == 'up' \ else 'up' origin = lambda: getattr(patch.getWorldAABB().origin, axis)() extent = lambda: getattr(patch.getWorldAABB().extents, axis)() if direction in ('right', 'up'): boundary = lambda: origin() + extent() comparison = '<=' else: boundary = lambda: origin() - extent() comparison = '>=' starting_boundary = boundary() looplimit = (extent() * 2) / stepsize # Safety valve. Don't let verts move further than the # extent of the patch. Stops an infinite loop crashing # DR if something goes wrong. stepcount = 0 while eval('boundary() %s starting_boundary' % comparison) and stepcount < looplimit: GlobalCommandSystem.execute('SelectNudge' + direction) stepcount += 1 for undostep in range(stepcount): GlobalCommandSystem.execute('SelectNudge' + reverse) return (stepcount - 1) * stepsize def attemptGetVertsLine(patch, tolerance): """Return ('row', 4) or ('col', 2) etc. Designed to be called multiple times with different tolerance if necessary. SIDE EFFECTS: Leaves selected verts displaced by a small amount. Grid size is changed.""" from math import log AABB = patch.getWorldAABB() gridPower = int(log(tolerance, 2)) GlobalCommandSystem.execute('ViewSide') minX = AABB.origin.x() - AABB.extents.x() + distToEdge(patch, 'left', 'x', gridPower) - tolerance maxX = AABB.origin.x() + AABB.extents.x() - distToEdge(patch, 'right', 'x', gridPower) + tolerance minZ = AABB.origin.z() - AABB.extents.z() + distToEdge(patch, 'down', 'z', gridPower) - tolerance maxZ = AABB.origin.z() + AABB.extents.z() - distToEdge(patch, 'up', 'z', gridPower) + tolerance GlobalCommandSystem.execute('ViewFront') minY = AABB.origin.y() - AABB.extents.y() + distToEdge(patch, 'left', 'y', gridPower) - tolerance maxY = AABB.origin.y() + AABB.extents.y() - distToEdge(patch, 'right', 'y', gridPower) + tolerance GlobalCommandSystem.execute('ViewTop') # Find which verts lie in the selected box includedRows = set() includedCols = set() for row in range(patch.getHeight()): for col in range(patch.getWidth()): vert = patch.ctrlAt(row, col) if minX <= vert.vertex.x() <= maxX and \ minY <= vert.vertex.y() <= maxY and \ minZ <= vert.vertex.z() <= maxZ: includedRows.add(row) includedCols.add(col) # Interpret result # Special case: if the user selects the existing seam of a polyhedron like a sphere or cone: if includedRows == set((0, patch.getHeight()-1)) or includedCols == set((0, patch.getWidth()-1)): raise UserError("You've selected the existing seam of a 3d patch. It's already cut " \ "there, so no action has been taken.") if len(includedRows) > 1 and len(includedCols) > 1: raise TooManyVerts() elif len(includedRows) < 2 and len(includedCols) < 2: raise TooFewVerts() elif len(includedRows) == 1: return 'row', includedRows.pop() else: return 'col', includedCols.pop() def getSelectedVertsLine(patch, patchdata): """Return ('row', 4) or ('col', 2) etc. Makes multiple attempts if needed. Mutates patch, so uses patchdata to restore state.""" userGridPower = GlobalGrid.getGridPower() # Start with tolerance = the user's grid size tolerance = 2 ** userGridPower mintolerance = 2 ** MINGRIDPOWER maxtolerance = 2 ** MAXGRIDPOWER lineType, lineNum = None, None while (not lineType) and mintolerance <= tolerance <= maxtolerance: try: print 'Patch Splitter: Trying to identify selected verts with tolerance %0.2f' % tolerance lineType, lineNum = attemptGetVertsLine(patch, tolerance) # has side effects that can't be fixed till search \ except TooManyVerts: # \ is finished, as the fix clears the user's selection tolerance /= 2.0 except TooFewVerts: tolerance *= 2 GlobalGrid.setGridSize(userGridPower) # \ fix the side-effects resetPatch(patch, patchdata) # / if not lineType: raise UserError('Unable to determine selected verts. Try again with different ' \ 'verts from the same row/column. Make sure all the verts are ' \ 'on the same line. Selecting 2 _pink_ verts might help with ' \ 'very twisty patches.') if lineNum == 0 \ or (lineType == 'row' and lineNum == patch.getHeight()-1) \ or (lineType == 'col' and lineNum == patch.getWidth()-1): raise UserError("You've selected the existing edge of the patch. No action has been taken.") if lineNum % 2: raise UserError("You've selected a green line. Patches can be cut only along lines with some pink verts.") return lineType, lineNum # Execution starts here # STEP 1: Validate selection patch = getAndValidateSelection() patchdata = PatchData(patch) # STEP 2: Work out what row or column is selected lineType, lineNum = getSelectedVertsLine(patch, patchdata) print 'RESULT: ', lineType, lineNum # STEP 3: Split the patch newpatch = clonePatch(patch) try: if lineType == 'row': newverts1 = patchdata.getRows(last=lineNum+1) newverts2 = patchdata.getRows(first=lineNum) elif lineType == 'col': newverts1 = patchdata.getCols(last=lineNum+1) newverts2 = patchdata.getCols(first=lineNum) # Make PatchData objects for the 2 new patches. Initialize them with # either of the existing patches then swap out the verts list. newdata1, newdata2 = PatchData(newpatch), PatchData(newpatch) newdata1.replaceverts(newverts1) newdata2.replaceverts(newverts2) # Adjust the patches resetPatch(newpatch, newdata2) resetPatch(patch, newdata1) except Exception as e: # Clean up before reporting error GlobalSelectionSystem.setSelectedAll(False) newpatch.setSelected(True) GlobalCommandSystem.execute('deleteSelected') resetPatch(patch, patchdata) raise # Step 4: Success! leave the new patches selected patch.setSelected(True) newpatch.setSelected(True) if __executeCommand__: try: execute() except Exception as e: GlobalDialogManager.createMessageBox('Patch Splitter', str(e), Dialog.ERROR).run() DarkRadiant-2.0.2/install/scripts/commands/select_all_models_of_type.py000066400000000000000000000026711245424655700264320ustar00rootroot00000000000000# Set the command name so that DarkRadiant recognises this file __commandName__ = 'SelectAllModelsOfType' __commandDisplayName__ = 'Select all Models of same type' # The actual algorithm called by DarkRadiant is contained in the execute() # function def execute(): # Collect all currently selected models selectedModelNames = {} class Walker(SelectionVisitor) : def visit(self, node): # Try to "cast" the node to an entity entity = node.getEntity() if not entity.isNull(): if not entity.getKeyValue('model') == '': selectedModelNames[entity.getKeyValue('model')] = 1 visitor = Walker() GlobalSelectionSystem.foreachSelected(visitor) print('Unique models currently selected: ' + str(len(selectedModelNames))) # Now traverse the scenegraph, selecting all of the same names class SceneWalker(SceneNodeVisitor) : def pre(self, node): # Try to "cast" the node to an entity entity = node.getEntity() if not entity.isNull(): modelName = entity.getKeyValue('model') if not modelName == '' and modelName in selectedModelNames: # match, select this node node.setSelected(1) # SteveL #3690: fixing return values return 0 # don't traverse this entity's children return 1 # not an entity, so traverse children walker = SceneWalker() GlobalSceneGraph.root().traverse(walker) # __executeCommand__ evaluates to true after DarkRadiant has successfully # initialised if __executeCommand__: execute() DarkRadiant-2.0.2/install/scripts/commands/shift_textures_randomly.py000066400000000000000000000013111245424655700262060ustar00rootroot00000000000000# Set the command name so that DarkRadiant recognises this file __commandName__ = 'ShiftTexturesRandomly' __commandDisplayName__ = 'Shift Textures randomly' # The actual algorithm called by DarkRadiant # is contained in the execute() function def execute(): import random s = random.randint(0, 256) t = random.randint(0, 256) for i in range(0, s+1): GlobalCommandSystem.execute('texshiftright "' + str(s) + '"') else: for i in range(0, t+1): GlobalCommandSystem.execute('texshiftup "' + str(t) + '"') else: print("texture translated over " + str(s) + " " + str(t)) # The variable __executeCommand__ evaluates to true # when DarkRadiant executes this command if __executeCommand__: execute() DarkRadiant-2.0.2/install/scripts/commands/shift_textures_upwards_randomly.py000066400000000000000000000011121245424655700277520ustar00rootroot00000000000000# Set the command name so that DarkRadiant recognises this file __commandName__ = 'ShiftTexturesUpwardsRandomly' __commandDisplayName__ = 'Shift Textures randomly upwards' # The actual algorithm called by DarkRadiant # is contained in the execute() function def execute(): import random s = random.randint(0, 256) for i in range(0, s+1): GlobalCommandSystem.execute('texshiftup "' + str(s) + '"') else: print("texture translated over " + str(s) ) # The variable __executeCommand__ evaluates to true # when DarkRadiant executes this command if __executeCommand__: execute() DarkRadiant-2.0.2/install/scripts/commands/test_targets.py000066400000000000000000000046321245424655700237420ustar00rootroot00000000000000"""Find any entities with "target" spawnargs that don't point to a valid entity in the map. Print results to the console, plus show a dialog and offer to select any entities that have missing targets. # 3718 Proposal: RJFerret Script: SteveL """ __commandName__ = 'test_targets' # should not contain spaces __commandDisplayName__ = 'Test for Missing Targets' # should not contain spaces def execute(): g_targets = {} # entityname : [targets] g_missing = {} # entityname : [missingtargets] class TargetFinder(SceneNodeVisitor): def pre(self, node): if node.isEntity(): n = node.getEntity() name = n.getKeyValue('name') targs = [t.second for t in n.getKeyValuePairs('target')] g_targets[name] = targs return 1 # Instantiate a new walker object and get list of entities/targets walker = TargetFinder() GlobalSceneGraph.root().traverse(walker) # Find any targets that don't exist, and count all targets entities = g_targets.keys() targetcount = 0 for ent in entities: targetcount += len(g_targets[ent]) missing = [] for targ in g_targets[ent]: if targ not in entities: missing.append(targ) if missing: g_missing[ent] = missing # generate report msg = '%d entities found with %d targets' % (len(entities), targetcount) + '\n\n' if not g_missing: msg += 'No missing targets found' GlobalDialogManager.createMessageBox('Missing targets', msg, Dialog.CONFIRM).run() else: msg += 'Missing targets:\n' for ent in g_missing.keys(): for targ in g_missing[ent]: msg += '%s -> %s\n' % (ent, targ) print(msg) # output to console msg += "\nThe list of missing targets has been printed to the console." msg += "\n\nDo you want to select all entities with missing targets?" response = GlobalDialogManager.createMessageBox('Missing targets', msg, Dialog.ASK).run() if response == Dialog.YES: class Selector(SceneNodeVisitor): def pre(self, node): if node.isEntity() and node.getEntity().getKeyValue('name') in g_missing.keys(): node.setSelected(True) return 1 GlobalSceneGraph.root().traverse(Selector()) if __executeCommand__: execute() DarkRadiant-2.0.2/install/scripts/dialogtest.py000066400000000000000000000013701245424655700215640ustar00rootroot00000000000000# Test creating a new dialog dialog = GlobalDialogManager.createDialog("Test") # Add a label dialog.addLabel("Testlabel") # Add an entry box and remember the handle entryHandle = dialog.addEntryBox("Entry") # Add a spin button dialog.addSpinButton("Spinner", 0, 10, 0.5) # Add a combo box, the options must be passed in the form of a StringVector options = StringVector() options.append("Test1") options.append("Test2") dialog.addComboBox("Test", options) # Add a simple checkbox dialog.addCheckbox("TestCheckbox") if dialog.run() == Dialog.OK: dialog = GlobalDialogManager.createMessageBox("Result", "User pressed OK, entry is: " + dialog.getElementValue(entryHandle) + "", Dialog.CONFIRM) dialog.setTitle("Result Popup Message") dialog.run() DarkRadiant-2.0.2/install/scripts/init.py000066400000000000000000000000721245424655700203660ustar00rootroot00000000000000# Called at DarkRadiant startup print('init.py executed')DarkRadiant-2.0.2/install/scripts/patchtest.py000066400000000000000000000011541245424655700214240ustar00rootroot00000000000000# Test patch manipulation class PatchManipulator(SceneNodeVisitor) : def pre(self, node): # Try to get a patch from this node patch = node.getPatch() if not patch.isNull(): print('Patch information:') print('Dimensions: ' + str(patch.getWidth()) + 'x' + str(patch.getHeight())) mesh = patch.getTesselatedPatchMesh() print('Mesh dimension: w=' + str(mesh.width) + ', h=' + str(mesh.height)) for v in mesh.vertices: print('Mesh vertex: ' + str(v.vertex.x()) + ',' + str(v.vertex.y()) + ',' + str(v.vertex.z())) return 1 walker = PatchManipulator() GlobalSceneGraph.root().traverse(walker)DarkRadiant-2.0.2/install/scripts/test.py000066400000000000000000000157031245424655700204110ustar00rootroot00000000000000# Some interface tests # Test the Registry interface value = GlobalRegistry.get('user/paths/appPath') print(value) worldspawn = Radiant.findEntityByClassname("worldspawn") worldspawn.setKeyValue('test', 'success') print('Worldspawn edited') # Test the EClassManager interface eclass = GlobalEntityClassManager.findClass('atdm:func_shooter') print(eclass.getAttribute('editor_usage').getValue()) # Try creating a func_shooter entity if not eclass.isNull(): shooter = GlobalEntityCreator.createEntity(eclass) modelDef = GlobalEntityClassManager.findModel('builderforger') print('ModelDef mesh for builderforger = ' + modelDef.mesh) # Test iterating over C++ std::map #for anim in modelDef.anims: # print(anim.key()) # print(' = ') # print(anim.data()) # print('') # Test implementing a eclass visitor interface #class TestVisitor(EntityClassVisitor) : # def visit(self, eclass): # print eclass.getAttribute('editor_usage').getValue() #eclassVisitor = TestVisitor() #GlobalEntityClassManager.forEachEntityClass(eclassVisitor) # Test implementing a model def visitor interface #class TestModelDefVisitor(ModelDefVisitor) : # def visit(self, modelDef): # print(modelDef.mesh) # #modelDefVisitor = TestModelDefVisitor() #GlobalEntityClassManager.forEachModelDef(modelDefVisitor) # Test traversing the scenegraph class SceneWalker(SceneNodeVisitor) : def pre(self, node): print(node.getNodeType()) # Try to get a model from this node model = node.getModel() if not model.isNull(): print('Node is a model') else: print('Node is not a model') return 1 walker = SceneWalker() GlobalSceneGraph.root().traverse(walker) # Test traversing the current selection class Walker(SelectionVisitor) : def visit(self, node): # Try to "cast" the node to a brush brush = node.getBrush() # If the Brush is not NULL the cast succeeded if not brush.isNull(): print(brush.getNumFaces()) else: print('Node is not a brush') # Try to cast the node to a patch patch = node.getPatch() # If the Patch is not NULL the cast succeeded if not patch.isNull(): print('Node is a patch') else: print('Node is not a patch') # Try to get a model from this node model = node.getModel() if not model.isNull(): print('Node is a model') else: print('Node is not a model') visitor = Walker() GlobalSelectionSystem.foreachSelected(visitor) # Try to find the map's worldspawn worldspawn = GlobalMap.getWorldSpawn() if not worldspawn.isNull(): # Cast the node onto an entity worldspawnent = worldspawn.getEntity() if not worldspawnent.isNull(): print('Spawnclass of worldspawn: ' + worldspawnent.getKeyValue('spawnclass')) else: print('There is no worldspawn in this map yet') # Test the entity visitor interface class TestEntityVisitor(EntityVisitor) : def visit(self, key, value): print('Worldspawn has spawnarg: ' + key + ' = ' + value) if not worldspawn.isNull(): tev = TestEntityVisitor() # Cast the node onto an entity worldspawnent = worldspawn.getEntity() worldspawnent.forEachKeyValue(tev) # Try to retrieve all keyvalues starting with "n" keyvalues = worldspawnent.getKeyValuePairs('t') for kv in keyvalues: print('Keyvalue ' + kv.first + ' = ' + kv.second) # Test the commandsystem GlobalCommandSystem.execute('texscale "0 0.1"') # Test the GameManager interface print('Mod path = ' + GlobalGameManager.getModPath()) game = GlobalGameManager.currentGame() print('Current game type: ' + game.getKeyValue('type')) print('VFS Search paths:') vfsPaths = GlobalGameManager.getVFSSearchPaths() for path in vfsPaths: print(path) # Test FileSystem (VFS) #class TestFileVisitor(FileVisitor) : # def visit(self, filename): # print('Found file: ' + filename) # #filevisitor = TestFileVisitor() #GlobalFileSystem.forEachFile('skins/', 'skin', filevisitor, 99) filecontents = GlobalFileSystem.readTextFile('skins/tdm_ai_elemental_fire.skin'); print(filecontents) # Test the Grid Interface print('Current grid size = ' + str(GlobalGrid.getGridSize())) # Test the ShaderSystem interface class TestShaderVisitor(ShaderVisitor) : def visit(self, shader): if not shader.isNull(): print('Found shader: ' + shader.getName() + ' defined in ' + shader.getShaderFileName()) shadervisitor = TestShaderVisitor() GlobalMaterialManager.foreachShader(shadervisitor) shader = GlobalMaterialManager.getMaterialForName('bc_rat') if not shader.isNull(): print('Shader ' + shader.getName() + ' is defined in ' + shader.getShaderFileName()) # Test finding a model class ModelFinder(SceneNodeVisitor) : def pre(self, node): # Try to get a model from this node model = node.getModel() if not model.isNull(): print('Model information:') print('Filename: ' + model.getFilename()) print('Model path: ' + model.getModelPath()) print('Surface count: ' + str(model.getSurfaceCount())) print('Vertex count: ' + str(model.getVertexCount())) print('Poly count: ' + str(model.getPolyCount())) materials = model.getActiveMaterials() print('Active Materials:') for material in materials: print(material) for i in range(0, model.getSurfaceCount()): surface = model.getSurface(i) print('Surface: ' + str(i)) print(' Default Shader: ' + surface.getDefaultMaterial()) print(' Active Shader: ' + surface.getActiveMaterial()) print(' PolyCount: ' + str(surface.getNumTriangles())) print(' Vertex Count: ' + str(surface.getNumVertices())) s = Vector3(0,0,0) numverts = surface.getNumVertices() for v in range(0, numverts): meshvertex = surface.getVertex(v) s += meshvertex.vertex print(' Sum of all vertices: ' + str(s.x()) + ',' + str(s.y()) + ',' + str(s.z())) return 1 walker = ModelFinder() GlobalSceneGraph.root().traverse(walker) # Test the ModelSkinCache interface #allSkins = GlobalModelSkinCache.getAllSkins() # #for skin in allSkins: # modelskin = GlobalModelSkinCache.capture(skin) # print('Skin found: ' + modelskin.getName()) # Test patch manipulation class PatchManipulator(SceneNodeVisitor) : def pre(self, node): # Try to get a patch from this node patch = node.getPatch() if not patch.isNull(): print('Patch information:') print('Dimensions: ' + str(patch.getWidth()) + 'x' + str(patch.getHeight())) w = 0 while w < patch.getWidth(): h = 0 while h < patch.getHeight(): # Push the vertex around a bit ctrl = patch.ctrlAt(h,w) ctrl.vertex += Vector3(0,0,10*(h-w)) h += 1 w += 1 patch.controlPointsChanged() return 1 walker = PatchManipulator() GlobalSceneGraph.root().traverse(walker) # Test the SelectionSetManager interface class SelectionSetWalker(SelectionSetVisitor) : def visit(self, selectionset): print(selectionset.getName()) walker = SelectionSetWalker() GlobalSelectionSetManager.foreachSelectionSet(walker) selSet = GlobalSelectionSetManager.createSelectionSet("TestSelectionSet") selSet.assignFromCurrentScene() selSet.deselect() selSet.select() selSet.clear() if selSet.empty(): GlobalSelectionSetManager.deleteSelectionSet("TestSelectionSet") print('') DarkRadiant-2.0.2/install/ui/000077500000000000000000000000001245424655700160005ustar00rootroot00000000000000DarkRadiant-2.0.2/install/ui/aboutdialog.fbp000066400000000000000000003015061245424655700207700ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject1 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY AboutDialogPanel -1,-1 wxTAB_TRAVERSAL bSizer1 wxVERTICAL none 12 wxALL|wxEXPAND 0 bSizer2 wxHORIZONTAL none 6 wxALL 0 1 1 1 1 Load From Art Provider; darkradiant:logo.png; 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 m_bitmap1 1 protected 1 Resizable 1 0 6 wxLEFT 1 bSizer3 wxVERTICAL none 6 wxBOTTOM 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY DarkRadiant x.y.z 0 0 1 AboutDialogAppTitle 1 protected 1 Resizable 1 0 -1 6 wxBOTTOM 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Build date: 2014-08-04 0 0 1 AboutDialogBuildDate 1 protected 1 Resizable 1 0 -1 6 wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY The Dark Mod (www.thedarkmod.com) This product contains software technology from id Software, Inc. ('id Technology'). id Technology 2000 id Software,Inc. DarkRadiant is based on the GPL version of GtkRadiant. http://darkradiant.sourceforge.net/ 0 0 1 m_staticText5 1 protected 1 Resizable 1 0 -1 12 wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT 0 bSizer4 wxVERTICAL none 6 wxBOTTOM 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY wxWidgets Properties 0 0 1 AboutDialogHeader1 1 protected 1 Resizable 1 0 -1 12 wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Version: 0 0 1 AboutDialogWxWidgetsVersion 1 protected 1 Resizable 1 0 -1 6 wxBOTTOM|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY OpenGL Properties 0 0 1 AboutDialogHeader2 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 1 bSizer5 wxVERTICAL none 6 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Vendor: 0 0 1 AboutDialogOpenGLVendor 1 protected 1 Resizable 1 0 -1 6 wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Version: 0 0 1 AboutDialogOpenGLVersion 1 protected 1 Resizable 1 0 -1 6 wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Renderer: 0 0 1 AboutDialogOpenGLRenderer 1 protected 1 Resizable 1 0 -1 6 wxBOTTOM|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY OpenGL Extensions 0 0 1 AboutDialogHeader3 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 -1,70 1 AboutDialogOpenGLExtensions 1 protected 1 Resizable 1 -1,70 wxTE_MULTILINE|wxTE_READONLY|wxTE_WORDWRAP 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY DarkRadiant Modules 0 0 1 AboutDialogHeader4 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 -1,70 1 AboutDialogDarkRadiantModules 1 protected 1 Resizable 1 -1,70 wxTE_MULTILINE|wxTE_READONLY|wxTE_WORDWRAP 0 wxFILTER_NONE wxDefaultValidator 12 wxALIGN_RIGHT|wxBOTTOM|wxRIGHT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_CLOSE OK 0 0 1 AboutDialogOkButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/aboutdialog.xrc000066400000000000000000000130031245424655700210050ustar00rootroot00000000000000 wxVERTICAL wxALL|wxEXPAND 12 wxHORIZONTAL wxALL 6 undefined.png wxLEFT 6 wxVERTICAL wxBOTTOM 6 -1 wxBOTTOM 6 -1 wxTOP 6 -1 wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT 12 wxVERTICAL wxBOTTOM 6 -1 wxLEFT 12 -1 wxBOTTOM|wxTOP 6 -1 wxEXPAND|wxLEFT 12 wxVERTICAL 6 -1 wxTOP 6 -1 wxTOP 6 -1 wxBOTTOM|wxTOP 6 -1 wxEXPAND|wxLEFT 12 -1,70 wxBOTTOM|wxTOP 6 -1 wxEXPAND|wxLEFT 12 -1,70 wxALIGN_RIGHT|wxBOTTOM|wxRIGHT 12 0 DarkRadiant-2.0.2/install/ui/addpropertydialog.fbp000066400000000000000000000671321245424655700222170ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY AddPropertyDialogPanel 500,300 wxTAB_TRAVERSAL bSizer3 wxVERTICAL none 6 wxLEFT|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Description 0 0 1 m_staticText3 1 protected 1 Resizable 1 0 -1 6 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 0 1 0 0 wxID_ANY 0 0 1 Description 1 protected 1 Resizable 1 -1,90 wxTE_MULTILINE|wxTE_READONLY|wxTE_WORDWRAP 0 wxFILTER_NONE wxDefaultValidator wxSTATIC_BORDER 5 wxALIGN_RIGHT 0 bSizer4 wxHORIZONTAL none 5 wxALL 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Cancel 0 0 1 CancelButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALL 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY OK 0 0 1 OkButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/addpropertydialog.xrc000066400000000000000000000030771245424655700222420ustar00rootroot00000000000000 500,300 wxVERTICAL wxLEFT|wxRIGHT 6 -1 wxALL|wxEXPAND 6 -1,90 0 wxALIGN_RIGHT 5 wxHORIZONTAL wxALL 5 0 wxALL 5 0 DarkRadiant-2.0.2/install/ui/camwnd.fbp000066400000000000000000000743141245424655700177530ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject1 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY CamWndPanel 500,300 wxTAB_TRAVERSAL camSizer wxVERTICAL none 0 wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP 0 bSizer2 wxHORIZONTAL none 3 wxBOTTOM|wxEXPAND|wxLEFT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 CamToolbar 1 1 protected 1 Resizable 5 1 wxTB_HORIZONTAL|wxTB_NODIVIDER 0 Load From Art Provider; darkradiant:wireframeMode16.png; wxART_TOOLBAR 0 wxID_ANY wxITEM_RADIO wireframeBtn wireframeBtn protected Render in wireframe mode Load From Art Provider; darkradiant:solidMode16.png; wxART_TOOLBAR 0 wxID_ANY wxITEM_RADIO flatShadeBtn flatShadeBtn protected Render in flat shaded mode Load From Art Provider; darkradiant:textureMode16.png; wxART_TOOLBAR 0 wxID_ANY wxITEM_RADIO texturedBtn texturedBtn protected Render in fullbright textured mode Load From Art Provider; darkradiant:lightingMode.png; wxART_TOOLBAR 0 wxID_ANY wxITEM_RADIO lightingBtn lightingBtn protected Render in lighting preview mode 3 wxBOTTOM|wxEXPAND|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 MiscToolbar 1 1 protected 1 Resizable 5 1 wxTB_HORIZONTAL|wxTB_NODIVIDER 0 protected Load From Art Provider; darkradiant:media-playback-start-ltr.png; wxART_TOOLBAR 0 wxID_ANY wxITEM_NORMAL startTimeButton startTimeButton protected Start Render Time Load From Art Provider; darkradiant:media-playback-stop.png; wxART_TOOLBAR 0 wxID_ANY wxITEM_NORMAL stopTimeButton stopTimeButton protected Stop Render Time protected Load From Art Provider; darkradiant:farClipIn.png; wxART_TOOLBAR 0 wxID_ANY wxITEM_NORMAL clipPlaneInButton clipPlaneInButton protected Clip plane in Load From Art Provider; darkradiant:farClipOut.png; wxART_TOOLBAR 0 wxID_ANY wxITEM_NORMAL clipPlaneOutButton clipPlaneOutButton protected Clip plane out DarkRadiant-2.0.2/install/ui/camwnd.xrc000066400000000000000000000074301245424655700177730ustar00rootroot00000000000000 500,300 wxVERTICAL wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP 0 wxHORIZONTAL wxBOTTOM|wxEXPAND|wxLEFT|wxTOP 3 1 5 Render in wireframe mode undefined.png 1 Render in flat shaded mode undefined.png 1 Render in fullbright textured mode undefined.png 1 Render in lighting preview mode undefined.png 1 wxBOTTOM|wxEXPAND|wxRIGHT|wxTOP 3 1 5 Start Render Time undefined.png Stop Render Time undefined.png Clip plane in undefined.png Clip plane out undefined.png DarkRadiant-2.0.2/install/ui/conversationcmdeditor.fbp000066400000000000000000001756331245424655700231150ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY ConvCmdEditorMainPanel 250,280 wxTAB_TRAVERSAL bSizer5 wxVERTICAL none 12 wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Actor 0 0 1 ConvCmdEditorActorLabel 1 protected 1 Resizable 1 0 -1 18 wxEXPAND|wxLEFT|wxRIGHT 0 bSizer11 wxHORIZONTAL none 6 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ConvCmdEditorActorChoice 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 12 wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Command 0 0 -1,-1 1 ConvCmdEditorCommandLabel 1 protected 1 Resizable 1 0 -1 18 wxEXPAND|wxLEFT|wxRIGHT 0 bSizer61 wxHORIZONTAL none 6 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ConvCmdEditorCommandChoice 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 12 wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Command Arguments 0 0 1 ConvCmdEditorCmdArgLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ConvCmdEditorArgPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL 3 wxBOTH 1 12 fgSizer1 wxFLEX_GROWMODE_SPECIFIED none 1 6 12 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Command Properties 0 0 1 ConvCmdEditorPropertiesLabel 1 protected 1 Resizable 1 0 -1 18 wxEXPAND|wxLEFT 0 bSizer611 wxHORIZONTAL none 3 wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Wait until finished 0 0 1 ConvCmdEditorWaitUntilFinished 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 12 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 0 bSizer8 wxHORIZONTAL none 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Cancel 0 0 1 ConvCmdEditorCancelButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY OK 0 0 1 ConvCmdEditorOkButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/conversationcmdeditor.xrc000066400000000000000000000076601245424655700231340ustar00rootroot00000000000000 250,280 wxVERTICAL wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT 18 wxHORIZONTAL 6 0 wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT 18 wxHORIZONTAL 6 0 wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT 12 1 3 6 12 1 wxALL 12 -1 wxEXPAND|wxLEFT 18 wxHORIZONTAL wxALL 3 0 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxLEFT 6 0 wxEXPAND|wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/conversationdialog.fbp000066400000000000000000002440431245424655700223720ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY ConvDialogMainPanel 500,500 wxTAB_TRAVERSAL bSizer5 wxVERTICAL none 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Conversation Entities 0 0 1 ConvDialogEntityLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 1 bSizer61 wxHORIZONTAL none 6 wxEXPAND|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ConvDialogEntityPanel 1 protected 1 Resizable 1 -1,120 0 wxTAB_TRAVERSAL bSizer7 wxVERTICAL none 5 wxEXPAND 0 ButtonSizer1 wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Add 0 0 1 ConvDialogAddEntityButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Delete 0 0 1 ConvDialogDeleteEntityButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Conversations 0 0 1 ConvDialogConvLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 1 bSizer6 wxHORIZONTAL none 6 wxEXPAND|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ConvDialogConversationPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer9 wxVERTICAL none 12 0 ButtonSizer wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Add 0 0 1 ConvDialogAddConvButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Edit 0 0 1 ConvDialogEditConvButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Delete 0 0 1 ConvDialogDeleteConvButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Clear 0 0 1 ConvDialogClearConvButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 12 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 0 bSizer8 wxHORIZONTAL none 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Cancel 0 0 1 ConvDialogCancelButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY OK 0 0 1 ConvDialogOkButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/conversationdialog.xrc000066400000000000000000000117011245424655700224100ustar00rootroot00000000000000 500,500 wxVERTICAL wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxRIGHT 6 -1,120 wxVERTICAL wxEXPAND 5 wxVERTICAL wxBOTTOM|wxEXPAND 6 80,-1 0 wxEXPAND 6 80,-1 0 wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxRIGHT 6 wxVERTICAL 12 wxVERTICAL wxBOTTOM|wxEXPAND 6 80,-1 0 wxBOTTOM|wxEXPAND 6 80,-1 0 wxBOTTOM|wxEXPAND 6 80,-1 0 wxBOTTOM|wxEXPAND 6 80,-1 0 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxLEFT 6 0 wxEXPAND|wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/conversationeditor.fbp000066400000000000000000004320761245424655700224260ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY ConvEditorMainPanel 500,650 wxTAB_TRAVERSAL bSizer5 wxVERTICAL none 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Properties 0 0 1 ConvEditorPropertyLabel 1 protected 1 Resizable 1 0 -1 18 wxEXPAND|wxLEFT|wxRIGHT 0 bSizer11 wxVERTICAL none 6 wxBOTTOM|wxEXPAND|wxTOP 1 bSizer12 wxHORIZONTAL none 5 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Name: 0 0 1 m_staticText4 1 protected 1 Resizable 1 0 -1 0 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ConvEditorNameEntry 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxLEFT 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Actors must be within talk distance 0 0 1 ConvEditorActorsWithinTalkDistance 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxLEFT|wxTOP 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Actors always face each other while talking 0 0 1 ConvEditorActorsMustFace 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 2 wxBOTTOM|wxEXPAND|wxTOP 0 bSizer13 wxHORIZONTAL none 6 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Let this conversation play 0 0 1 ConvEditorRepeatCheckbox 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 9999 0 -1 0 1 ConvEditorRepeatTimes 1 protected 1 Resizable 1 60,-1 wxSP_ARROW_KEYS 0 -1 6 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY times at maximum 0 0 1 ConvEditorRepeatAdditionalText 1 protected 1 Resizable 1 0 -1 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Actors 0 0 -1,-1 1 ConvEditorActorLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 1 bSizer61 wxHORIZONTAL none 6 wxEXPAND|wxLEFT|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 -1,160 1 ConvEditorActorPanel 1 protected 1 Resizable 1 -1,160 0 wxTAB_TRAVERSAL bSizer7 wxVERTICAL none 5 wxEXPAND 0 ButtonSizer1 wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Add 0 0 1 ConvEditorAddActorButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Delete 0 0 1 ConvEditorDeleteActorButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Commands 0 0 1 ConvEditorCommandLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 1 bSizer6 wxHORIZONTAL none 6 wxEXPAND|wxLEFT|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 -1,200 1 ConvEditorCommandPanel 1 protected 1 Resizable 1 -1,-1 0 wxTAB_TRAVERSAL bSizer9 wxVERTICAL none 12 0 ButtonSizer wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Add 0 0 1 ConvEditorAddCommandButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Edit 0 0 1 ConvEditorEditCommandButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Move up 0 0 1 ConvEditorMoveUpCommandButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Move down 0 0 1 ConvEditorMoveDownCommandButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Delete 0 0 1 ConvEditorDeleteCommandButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 12 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 0 bSizer8 wxHORIZONTAL none 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Cancel 0 0 1 ConvEditorCancelButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY OK 0 0 1 ConvEditorOkButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/conversationeditor.xrc000066400000000000000000000204541245424655700224440ustar00rootroot00000000000000 500,650 wxVERTICAL wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT 18 wxVERTICAL wxBOTTOM|wxEXPAND|wxTOP 6 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxALL 5 -1 wxALIGN_CENTER_VERTICAL 0 wxBOTTOM|wxLEFT 6 0 wxBOTTOM|wxLEFT|wxTOP 6 0 wxBOTTOM|wxEXPAND|wxTOP 2 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxLEFT 6 0 wxALIGN_CENTER_VERTICAL|wxLEFT 6 60,-1 0 -1 9999 wxALIGN_CENTER_VERTICAL|wxLEFT 6 -1 wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxLEFT|wxRIGHT 6 -1,160 wxVERTICAL wxEXPAND 5 wxVERTICAL wxBOTTOM|wxEXPAND 6 80,-1 0 wxEXPAND 6 80,-1 0 wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxLEFT|wxRIGHT 6 wxVERTICAL 12 wxVERTICAL wxBOTTOM|wxEXPAND 6 80,-1 0 wxBOTTOM|wxEXPAND 6 80,-1 0 wxBOTTOM|wxEXPAND 6 80,-1 0 wxBOTTOM 6 80,-1 0 wxBOTTOM|wxEXPAND 6 80,-1 0 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxLEFT 6 0 wxEXPAND|wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/difficultyeditor.fbp000066400000000000000000003560171245424655700220560ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY DifficultyEditorMainPanel -1,-1 wxTAB_TRAVERSAL bSizer17 wxVERTICAL none 12 wxALL|wxEXPAND 1 bSizer18 wxHORIZONTAL none 0 wxEXPAND 1 bSizer19 wxVERTICAL none 5 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 -1,-1 1 DifficultyEditorTreeViewPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL 350,120 bSizer21 wxVERTICAL none 6 wxEXPAND|wxTOP 0 DifficultyEditorButtonPanel wxHORIZONTAL none 5 1 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Add 0 0 1 DifficultyEditorAddSettingButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT|wxRIGHT 1 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Delete 0 0 1 DifficultyEditorDeleteSettingButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 1 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Refresh 0 0 1 DifficultyEditorRefreshButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 12 wxEXPAND|wxLEFT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 DifficultyEditorSettingsPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL 300,-1 bSizer22 wxVERTICAL none 6 wxBOTTOM 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Setting 0 0 1 DifficultyEditorSettingLabel 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 0 2 wxBOTH 1 0 fgSizer3 wxFLEX_GROWMODE_SPECIFIED none 3 0 6 wxALL|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Classname: 0 0 1 m_staticText11 1 protected 1 Resizable 1 0 -1 6 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 DifficultyEditorClassName 1 protected 1 Resizable -1 1 wxCB_DROPDOWN|wxCB_SORT 0 wxFILTER_NONE wxDefaultValidator 6 wxALL|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Spawnarg: 0 0 1 m_staticText12 1 protected 1 Resizable 1 0 -1 6 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 DifficultyEditorSpawnarg 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALL|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Argument: 0 0 1 m_staticText13 1 protected 1 Resizable 1 0 -1 6 wxEXPAND 1 bSizer23 wxHORIZONTAL none 6 wxTOP|wxBOTTOM|wxLEFT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 DifficultyEditorArgument 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 DifficultyEditorApplicationType 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALL|wxALIGN_RIGHT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Save 0 0 1 DifficultyEditorSaveSettingButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 DifficultyEditorNoteText 1 protected 1 Resizable 1 wxST_NO_AUTORESIZE 0 -1 DarkRadiant-2.0.2/install/ui/difficultyeditor.xrc000066400000000000000000000144261245424655700220760ustar00rootroot00000000000000 wxVERTICAL wxALL|wxEXPAND 12 wxHORIZONTAL wxEXPAND 0 wxVERTICAL wxEXPAND | wxALL 5 350,120 wxVERTICAL wxEXPAND|wxTOP 6 wxHORIZONTAL 5 0 wxLEFT|wxRIGHT 6 0 5 0 wxEXPAND|wxLEFT 12 300,-1 wxVERTICAL wxBOTTOM 6 -1 wxEXPAND 5 3 2 0 0 1 wxALL|wxALIGN_CENTER_VERTICAL 6 -1 wxALL|wxEXPAND 6 wxALL|wxALIGN_CENTER_VERTICAL 6 -1 wxALL|wxEXPAND 6 wxALL|wxALIGN_CENTER_VERTICAL 6 -1 wxEXPAND 6 wxHORIZONTAL wxTOP|wxBOTTOM|wxLEFT 6 wxALL 6 0 wxALL|wxALIGN_RIGHT 6 0 wxALL|wxEXPAND 5 -1 DarkRadiant-2.0.2/install/ui/entityclasschooser.fbp000066400000000000000000001225121245424655700224210ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject1 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY EntityClassChooserMainPanel 500,300 wxTAB_TRAVERSAL bSizer1 wxVERTICAL none 12 wxALL|wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 0 1 EntityClassChooserSplitter 1 protected 1 Resizable 0.0 300 -1 1 wxSPLIT_VERTICAL wxSP_3D 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 EntityClassChooserLeftPane 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer2 wxVERTICAL none 6 wxEXPAND|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 -1,90 1 EntityClassChooserUsageText 1 protected 1 Resizable 1 -1,90 wxTE_MULTILINE|wxTE_READONLY|wxTE_WORDWRAP 0 wxFILTER_NONE wxDefaultValidator 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 EntityClassChooserRightPane 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer4 wxVERTICAL none 12 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT 0 bSizer3 wxHORIZONTAL none 5 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_CANCEL Cancel 0 0 1 EntityClassChooserCancelButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ADD Add 0 0 1 EntityClassChooserAddButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/entityclasschooser.xrc000066400000000000000000000042501245424655700224440ustar00rootroot00000000000000 500,300 wxVERTICAL wxALL|wxEXPAND 12 300 0 0 vertical wxVERTICAL wxEXPAND|wxTOP 6 -1,90 wxVERTICAL wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT 12 wxHORIZONTAL wxALL|wxEXPAND 5 0 wxALL|wxEXPAND 5 0 DarkRadiant-2.0.2/install/ui/filterdialog.fbp000066400000000000000000001604121245424655700211420ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY FilterDialogMainPanel 500,300 wxTAB_TRAVERSAL bSizer5 wxVERTICAL none 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Filters 0 0 1 FilterDialogTopLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 1 bSizer6 wxHORIZONTAL none 6 wxEXPAND|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 FilterDialogTreeViewPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer9 wxVERTICAL none 12 0 ButtonSizer wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Add 0 0 1 FilterDialogAddButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY View 0 0 1 FilterDialogViewButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Edit 0 0 1 FilterDialogEditButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Delete 0 0 1 FilterDialogDeleteButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 12 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 0 bSizer8 wxHORIZONTAL none 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Cancel 0 0 1 FilterDialogCancelButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY OK 0 0 1 FilterDialogOkButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/filterdialog.xrc000066400000000000000000000062501245424655700211660ustar00rootroot00000000000000 500,300 wxVERTICAL wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxRIGHT 6 wxVERTICAL 12 wxVERTICAL wxBOTTOM|wxEXPAND 6 0 wxBOTTOM|wxEXPAND 6 0 wxBOTTOM|wxEXPAND 6 0 wxEXPAND 6 0 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxLEFT 6 0 wxEXPAND|wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/filtereditor.fbp000066400000000000000000002515501245424655700211750ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY FilterEditorMainPanel 500,300 wxTAB_TRAVERSAL bSizer5 wxVERTICAL none 12 wxALL|wxEXPAND 1 bSizer10 wxVERTICAL none 6 wxBOTTOM 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Name 0 0 1 FilterEditorTopLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 FilterEditorNameEntry 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxTOP|wxBOTTOM 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Rules 0 0 1 FilterEditorRuleLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND 1 bSizer6 wxHORIZONTAL none 6 wxEXPAND|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 FilterEditorTreeViewPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer9 wxVERTICAL none 12 0 ButtonSizer wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Add 0 0 1 FilterEditorAddButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Move Up 0 0 1 FilterEditorUpButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Move Down 0 0 1 FilterEditorDownButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Delete 0 0 1 FilterEditorDeleteButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Filter rules are applied in the shown order. "Match" is accepting regular expressions. "Object"-type filters can be used to match "patch" or "brush". 0 0 1 FilterEditorHelpText 1 protected 1 Resizable 1 0 -1 12 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 0 bSizer8 wxHORIZONTAL none 0 wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY OK 0 0 1 FilterEditorOkButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Cancel 0 0 1 FilterEditorCancelButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Save 0 0 1 FilterEditorSaveButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/filtereditor.xrc000066400000000000000000000112151245424655700212120ustar00rootroot00000000000000 500,300 wxVERTICAL wxALL|wxEXPAND 12 wxVERTICAL wxBOTTOM 6 -1 wxEXPAND|wxLEFT 12 wxTOP|wxBOTTOM 6 -1 wxEXPAND 12 wxHORIZONTAL wxEXPAND|wxRIGHT 6 wxVERTICAL 12 wxVERTICAL wxBOTTOM|wxEXPAND 6 0 wxBOTTOM|wxEXPAND 6 0 wxBOTTOM|wxEXPAND 6 0 wxEXPAND 6 0 wxALL 5 -1 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND 0 0 wxEXPAND|wxLEFT 6 0 wxEXPAND|wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/findandreplacedialog.fbp000066400000000000000000002102471245424655700226160ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject1 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY 500,200 FindReplaceDialogMainPanel 500,200 wxTAB_TRAVERSAL bSizer1 wxVERTICAL none 12 wxALL|wxEXPAND 0 3 wxBOTH 1 0 fgSizer1 wxFLEX_GROWMODE_SPECIFIED none 2 3 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Find: 0 0 1 m_staticText1 1 protected 1 Resizable 1 0 -1 6 wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 FindReplaceDialogFindEntry 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 Load From Art Provider; darkradiant:folder16.png; 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY MyButton 0 0 1 FindReplaceDialogFindSelectButton 1 protected 1 Resizable 1 wxBU_AUTODRAW 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Replace: 0 0 1 m_staticText3 1 protected 1 Resizable 1 0 -1 6 wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 FindReplaceDialogReplaceEntry 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 Load From Art Provider; darkradiant:folder16.png; 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY MyButton 0 0 1 FindReplaceDialogReplaceSelectButton 1 protected 1 Resizable 1 wxBU_AUTODRAW 0 wxFILTER_NONE wxDefaultValidator 12 wxLEFT 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Search current selection only 0 0 1 FindReplaceDialogSearchCurSelection 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 12 wxALL|wxEXPAND 0 bSizer3 wxHORIZONTAL none 6 wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 1 wxID_ANY x shader(s) replaced. 0 0 1 FindReplaceDialogStatusLabel 1 protected 1 Resizable 1 0 -1 0 wxALIGN_RIGHT|wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP 0 bSizer2 wxHORIZONTAL none 6 wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Find and Replace 0 0 1 FindReplaceDialogFindButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Close 0 0 1 FindReplaceDialogCloseButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/findandreplacedialog.xrc000066400000000000000000000100361245424655700226350ustar00rootroot00000000000000 500,200 wxVERTICAL wxALL|wxEXPAND 12 2 3 3 0 1 wxALIGN_CENTER_VERTICAL 0 -1 wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND 6 wxALIGN_CENTER_VERTICAL 0 undefined.png 0 wxALIGN_CENTER_VERTICAL 0 -1 wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND 6 wxALIGN_CENTER_VERTICAL 0 undefined.png 0 wxLEFT 12 0 wxALL|wxEXPAND 12 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxRIGHT 6 -1 wxALIGN_RIGHT|wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP 0 wxHORIZONTAL wxLEFT 6 0 wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/fonts/000077500000000000000000000000001245424655700171315ustar00rootroot00000000000000DarkRadiant-2.0.2/install/ui/fonts/FreeMono.ttf000066400000000000000000012376541245424655700214040ustar00rootroot00000000000000 FFTMT x?GDEFyXk18PGPOS68vGSUBLprep\ɻyBH@7 h_< ȸ0'ȸ0'8  8ZX  xX/]1 @ GNU @  8 `XdXXXXX\XqXWXiXX&XXqXHXXHXXqXqXqXTX`XiX`XXiXqXXXXHX3XNXXiX X+X?X+X+X+X?X5XqXTX+X?X XX3X+X3X+X\XHX(X XX(X3XgXXqXXqXXXHXXTX?X?XiX?X+X\XX?X\X X5XHXX?XTXgX+X+XXX3X3XsXXXX\XXXqX?XgX3XXBXXXX?XHXHXXXXHXXXX+XOXXXXX?XXXXqX X X X X X X X?X+X+X+X+XqXqXqXqXXX3X3X3X3X3XvX(X(X(X(X(X3X+XXHXHXHXHXHXHX XTX?X?X?X?X\X\X\X\XHX5XHXHXHXHXHXHX5X+X+X+X+X3XX3X XHX XHX XHX?XTX?XTX?XTX?XTX+X?XX?X+X?X+X?X+X?X+X?X+X?X?X?X?X?X?X?X?X?X5X+X5X+XqX\XqX\XqX\XqX\XqX\XX|XTXX+X?XFX?X\X?X\X?X\X?X4X+X\XX5XX5XX5XX5X5X3XHX3XHX3XHX X X+XTX+XTX+XTX\XgX\XgX\XgX\XgXHX+XHX+XHX+X(X+X(X+X(X+X(X+X(X+X(X+XXX3X3X3XgXsXgXsXgXsXiXXX,XX.XX?X?XTXXX:XXDX+X2X\XXWX?X0XXXqX+X?X\X:X XX5X3X3XHXXXXX<X\XgXfXQX+XX+XHX(X+XNX+XX3XgXsX`XPX_XXXTXPX_XXXXX3XXXXXXX|XXX X XHXqX\X3XHX(X+X(X+X(X+X(X+X(X+X?X XHX XHX X X?X?X?X?X+X?X3XHX3XHX`X_XXXXX?X?XXXX5X XHX X X(X5X XHX XHX+X?X+X?XdX\XqX\X3XHX3XHX$XTX+XTX(X+X(X+X\XgXHX+XpX|X5X+XXgXsX XHX+X?X3XHX3XHX3XHX3XHX3X3XXHX?XXXTXTX?X?X?X?XCXgXgXgXLXX?X?XMX4X2X+X3X3X\XXX\X\XXX X X XX5X6XHX X+XpXTXTX4XTXiXTXTX<X<XgXWXWXWXQX+X+X+XFXXXX3XQXsXsX_XpXXXX?XHXIXgXMXSXX?X\X?XXX)XX XXXXXX%XXHX XXzXXXXWXwXfX{XXXXXXX,XXXXXXXXXXXXXXXXXXXX,XXXXXXXXXXXXXXXXXXX2X2X2X2X2XdXZXX7XdXXXXXXXXXXXXXXXxXxX;CC9CC4twCCCCG]nkXU9zA7J;N:<LFE!A6|9;ARAOBnQmb wBXXXXXXXXXXX XXXXX X+X>X X+XgX5X3XqX+X X XXEX3X3X+XfXHX3X.X(XXFXqX3X?XX5XX+X?X<X=XDXXzX5XqXXFX:X+X5X|XHXRXX^X+X+X+X%XX"X+XZX+XHX+X+XpXBX0XX0XQX+XPXYX+X'XdX3XX+X+XX>X@X\XqXqXTXX XX-X3X2X3X X,X+X>X X+XX\X3X3X-X9X X5X3X3X+X?XHX2XX(X2XIXXXX X+X@XX XHXQXlXrX7X?X XgXAXAXFXXX4XAXHXAXXTXfX3XX3X5X`X X X@X XlXJXXXX?X?X+XrXJXgX\X\XX"XX+XFXAX3X>XX+XXXX X XXX&XX&XX"X3X XX XXX+(GnX3XAX+XlX+XX>XrX>XrX>XrXX X\XgX$XFX$XFX$XFXX X5XRX5XRXXX?XTX?XTXHXzX3XX3XX(X3XXXJX`XJX`XJX`XXXXXqXX X$XFX9XXX5XRX5XAXJX`X X4XqX XHX XHX X X+X?X2XLX2XLXX X\XgX`X_X3XAX3XAX3XHX3XHX3XHX@XJX2X3X2X3X2X3XIX`X>XrX X X\XgX9XXX3X?XXX-XFX)X)X+XX"X"X:X)X X5XX?XX.X)XkX5XX!XXZXX=X*X+XX@X X)X X\X*XAX\XGXX3XZXXXXXXXX X4X+X!X,X+X}X5XX5X5XIXXGX8X5XGXBXPX6X[XXGX5X]X XGX5X,X,XgX5X?XyX XiXHXZX,XXXdX1XX<X<XX<X<XXX<XXX<X<X<X<X<XXX<X<X<X<X<X2X1X<X3XXZXZXZXXXfXjX]X5XdXdXAX@XgXcX5XfXcX:XdX]X5XjX5X5X4XbX5XhX@XjX5XfXPXLXfX2XjX.XnXbXuXWX]XeXX+X+XHXX X\XHX3XJX2X XTX+XXhXXhX>X4XXBXHX@X X2X#XX3XJX*X3X9X?XXJXgXXXHXX5X XXhX(XXTX+X\XLX&X2X XMX;XHXZX X\X)X2X?X?X?XX4X+X2X&X(X+X(X X#XX3X3XHXQXX>X<X2XX+XXXGXGXGXGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXzX3XXXXXX~XXXXXXXXXXXXnXX3XXXXiXXXXiXXMXXXXX3XXXXVXXXXvX3XZX XHX+XX+XX+XX?XTX+X?X+X?X+X?X+X?X+X?X+X?X+X?X+X?X+X?X+X?X+XiX?X?X5X+X5X+X5X+X5X+X5X+XqX\XqX\X+X?X+X?X+X?X?X\X?X\X?X\X?X\X X X X X X XX5XX5XX5XX5X3XHX3XHX3XHX3XHX+XX+XX+XTX+XTX+XTX+XTX\XgX\XgX\XgX\XgX\XgXHX+XHX+XHX+XHX+X(X+X(X+X(X+X(X+X(X+X XX XXXXXXXXXXXX(X3X(X3X3X3XgXsXgXsXgXsX+X+XX3XHXiX XHX XHX XHXXX XHX XHX XHX XHX XHX XHX XHX XHX+X?X+X?X+X?X+X?XXXX&X+X?X+X?XqX\XqX\X3XHX3XHX3XHXXXX0X3XHX3XHX3XHX3XHX3XHX3XHX3XHX(X+X(X+X(X+X(X+X(X+X(X+X(X+X3X3X3X3X3X3X3X3X?X?X?X?X?X?X?X?XXXXXXXXXXXXXXXXXXX~XX5X5X5X5X5X5X5X5XXXXXXXXXXXfXiXXXOXoXXXXXXXXXHXHXHXHXHXHXX XXXXX+X+X+X+X+X+X+X+XXXXX+X+X+X+X+X+X+X+XXXXXXXXX?X?XXX5X5XXXHXHX+X+X+X+X?X?X?X?X?X?X?X?XXXXxXXXXX5X5X5X5X5X5X5X5XXXXXXXXX+X+X+X+X+X+X+X+XXXXXXXXX?X?X?X?X?X?X?X X XXX XXXXXX5X5X5X5X5XXXXX3XXXXjXjXfXX`XZXqXqXXXXXX+X+X+X+XXX+X+X3X3XXXXXXX+X+X+X+X+XXXXXFXXXXXXXXXXXXXXXXXHXHXXXXXXXX2XBX]XVXX|X|XXXXX3XXXXXXXXXX"XXXiXXXiXXX?X%X=XpXXXdXdXXXHX2XXXX&XXiXOXQXQXqXXdXqXjXXdXHXhXXXXXXHXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXX?X?X+X?X XXXXX<X?X X+XHXgX+X?X X>X? 6@)XXX?XX?X X X\X+XX!X"X"X1XVXVXuXXX XX4X+X3X(X#X+X XXX1XFXFXX+X X?X+X<X<XX<X>XXX2X7X7X3XjXXbXXXXXXXXXXXX8XXqX1X!X%X+X%X XXX(XXX?X?X+X X\XOXX XXX+XX?X3X"X"X\XTX?X X)XX6XXXXpX{XxXX(X(XMXMX(XX(XX)X>X*XX*XXX)XFX)XFXXXXiXXiXX*X)X(X(X+X&X;X9X!X!XXX!X1XXX)X+X)X)X*XJX*X!X!X8XX8X8XX2XXXX,X*XX*XXX X?XX+X+X#X+X+X&X&XsX&X&XsXX3X3XqXHXHXHX`X`XqXXXXXX%XXXFX1XCXXXXX<X<XGXIXX8XXnX8XXnXnXnX;X;XX<XHXHX<X\X\X\XXfXX\XJXJXHX3X3X3X\X\XJX\X3XdX3X3X3X3X3X3X.X.X3X3X3X3X3X3X3X3XX3X3X3X3X3XAXNX3X3X%X%XXXXdXHXNX+X;XHXNXHXNXXXXXHXFXHXFXHXFXHXFX3X3X3X3X3X3X3X3X3X3XIXIXIXJX>XJX>XHXHXXXXX#X#X#X#X#X2X2X2X2X3X'XXXXX3XwXIX"X3X3XyX"X{X{X_XyXHXHXXX\X4XdX<X<X<XXX-X-X+X+XXXXHX\X\X\XXXLX8X8X3X3XGXGXxX3XNXNXXXXX8X8XFXHXHXFX4X3X3X3XHXNXHXFX_X`XHXHXXCX$XX7X2XXXXXX"XX"XX(XX(XHX#XX7XXHXX'XX'XXYXdXdXX XX>XXXX+XXPXXXXXX#X#XHXHXXXXX)XIXXX#XX+XXXXHXXX+XXXXHXXX+XXX#XGXX#XXX+XXX#XHX3X\XNXHX+X\X\XXXXJXJXXX+X?XXX+X?XXXXX<XXXXX2XXXXXXXXXX#X#X#X#XXXXXXXXXTXTXTXQXXQX,X,X,XdXXdXX,XXXcXXcXXX<X<X X XXXX"XXXXXXX(X(X(XXXXXXXWXWXXXXX@XXXXXX+XX XX,X8X.X#X#X-XX&XXjXsXXXuXhXoX~X+X!X+X+X+X"X$X#XXrX!X#XaX_XiXZXX!X(XXXjXjXjXjX XX X#X XbXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,XXXX,XXXXXXXXXXXXXXXXXXXXXX,XXXXX XX,XXXXXX,XXX2X2X2X2X2X2X2X2X2X2XXX2X2XXXXX#X#XXXTXTXXXyXyX#X#XXX9X9XXX^X_X#X#X#X#XYX#X#X#X#X#X#X#X#X#X#X#X#X,XXXXX#X,X,X#X#X#X2X2X2X2XX2X2X2X2X2X#X#X#XX2X2X2X2X#X#X#X#X2X2X2X2X2X}X}X2XX/X<XXXXxXZX#X2X2X2X&X2X&X2X2X8XPXPXX#X#X2X2X2X2X2X2X2X2X#X#X#XXX7XvXvXvX@XX8XXXVXX:XXXXXXXX XXXHX,XTXXHX,XQXXXX6X6XmXxX=XJXJXJXJXJXJXX#XXXXXX-X X X[XMX#X-XXYXYXXXX X XXX}X}X-X-XXX X X X X X X X XXlXlXlXkXkXkXkXpXXXXXXXXpXXXXXXXXpXXXXXXXXpXXXXXXXXpXXXXXXXXpXXXXXXXXpXXXXXXXXlXlXlXlXkXkXkXkXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXpXXXXXXXXpXXXXXXXXpXXXXXXXXpXXXXXXXXpXXXXXXXXpXXXXXXXXpXXXXXXXXpXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+X(X(X(XEX3X?X?X?X@XX*XXX?X>X?X?XXX2X2X2X2X#X#X#X#XXXXXXX+X#XXXYXYXxXxXXXXXXcXXXXXXSXSXSXSXSXSXSXSXSXSXSXSXSXSXUX)XSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXS#'GGXS)MG BZ<<<<<<<<H3131<<<<<<<<<<<<<21<3<<<<""~ 37IMZuz~dhmrw}V_EMWY[]} d q ! !!!"!$!'!+!.!2!;!D!K!N!!!!!"#######'#,#z#####$!$$$J$i&& &&&&&)&7&S&g&o&''''''(***?+ ++++T./6<>ADO $7PKPtz~fjpt|1Ya HPY[]_ p t !! !! !$!&!)!.!2!5!A!K!M!S!!!!"########)#6#|####$$#$@$`%&&&&&&(&.&9&`&i&''''''(***?++++S.8>@CF|{zyxub`VUTRQMHF0*]wuthgMJGFED410/.-,*'% {f_^[OIHEE/NJI"`ed}    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpkQvj As E Fgw9 l|"cnT )m}b : yjq|}~zk,K*PXJvY#?+X=YK*PX}Y ԰.-, ڰ +-,KRXE#Y!-,i @PX!@Y-,+X!#!zXYKRXXY#!+XFvYXYYY-, \Z-,"PX \\Y-,$PX@\\Y-, 9/- , }+XY %I# &JPXea PX8!!Ya RX8!!YY- ,+X!!Y- , Ұ +- , /+\X G#Faj X db8!!Y!Y- , 9/ GFa# #JPX#RX@8!Y#PX@e8!YY-,+X=!! ֊KRX #I UX8!!Y!!YY-,# /+\X# XKS!YX&I## I#a8!!!!Y!!!!!Y-, ڰ+-, Ұ+-, /+\X G#Faj G#F#aj` X db8!!Y!!Y-, %Jd# PX<Y-,@@BBKcKc UX RX#b #Bb #BY @RX CcB CcB ce!Y!!Y-,Cc#Cc#-KPXYF+X!YKRX!Y+\X E+D E+DY+3))((((hl(T(h\  ( l h d X   \`hH`D(d8 tD,t,hx4 L !|!"$""#$#x##$d$%&@&x'8'|($()),)<)**T*+++,,,--L--./l0\00011,1D1\12222233(3@3X3344404H4`45X5p55556<6677747L7d8,8899909H9`9x9:0:H:`:x:::; ;;;;<< <<<<<==>P>h>>>>>>??(?@?P??@@@4@L@d@AAAAABBB4BLBdB|BBCPCCDD(D@DXDpDE\EtEF<FFFGGG,GDG\GtGGGGGHdHHIII0IHI`IxIJxJJJJJKKL(L@LXLpLLLLLMMMNNNOPOhOOPP|PPPPPQ Q$Q<QTQlRRRRRRSS S8SPShSSSTU U0UV0VW4WXXXhXYTYYZDZTZ[d[\|]]]^X^__`aabbbccddeefLffgdghXhi4ijDjk8klHlmmnno8op<pq0qqrr\rlrrrs\stTuuvXvpvvvvvwww0wHxx(xy yyzPzhzzzzz{x|| |8|P|h||||||}d}~t4@Xp8Xp0H`x 8Ph(@X4 8d| $<T @`H<Xl@(\X,Th|X Tt XD<<$l4|4DX00@`x Td 8dP<P 0DXl Pd0t`X<d” Hxô<PĐĤĸ$HpńŘ8L`tƈƜ`tLjǜǰD`tȈȜȰ(<Ɉɜɰ(`tʈʜp˄˘ˬ,@Ť,͔ͨ0DTh|ΐά0DXtψϜϰ,@ЄД<TфќѴ,<LҐ ӌӜӬ$Դ,<ՄՔդ<Lt׌פ׼؀xH l@PݬL\0߸|@((@`<T |H0H`xLt$4\l,Ph`p$ 0|pt8xx XhllPD@(8H`p(@Xp  x 0  8  |  `p(@Xx`$dxL$8\XX\ !,!"\"#H#$$h$%\%&d&'D'(H()h)*d++,d-$-4-L-d.../h/0|112233x33344 404@4X4p4455,5D5\5t5555556 6$6<6677 787P7h77777788\8889x::;;(;8;H;X<<=D=>0>?(??@`AAxAB<BC(CDDDEdEFhFGlGH\HIxIJTJJK<KLLM@MPMNNN$NdNtNNO|OPhPQ\QRRxRSdSTTUUV VWWWX4XY YYZlZ[p[\ \0\\\]]^^___\_`0`aaDaab bPbxbcc,c`cccddPdddePefffgghh<hhiPij<jtjkLkl4lmmmnHnoPopp`ppqqrHrsDstu u\uvvwtwx\xyyz{@{|p} }~~,|H@$8L`p,  0@4(8@DL \LxllTPdx,dP`p,p|\t,<lD \8h8\@L4\ @@p<h8H(T$\ Xt(Ph@,D\t4d|@X4Ld|”¬ $<TlÄÜL $<T,D\tƌƤƼ4Ld|ǔǬ $<TlȄȜȴd|4Lxː˨ 8Ph̘̰̀,D\tόϤϼ4Ld|H`(@Xp҈ҠҸ0H`xӐӨ 8PhԀԘ԰(@XpՈՠո44Ld|۔۬ $<(@Xp݈ݠݸ0H`xސި\tߌߤ߼4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld|(`\t4Ld| $<Tl$<Tlhx(@Xp ,T|H|$D0Hh0D0xl ( t    T p       @ p     4 4 4 4 4 4 4    D l  4H\p8h|x4`0044@ D !"X"l"""""# #d##$0$D$%%%%&&$&8&L&`&'()`**+,,-P-.x/ /0l01X122334t45x6x7789:0:::::::;;;(;8;H;;<<<=0=D=X=|====>> >@>`>>>>???(?|?@H@A ABBBC8CCCDDD$DEEEFFG(GGHxI$I4IDITIdIJJLJKK|KL4LLMlMNlNOlOOPPPQPQRRdRS`STdTUVTVWWlWWX,XXYtYZ[ [[\\L\\] ]L]^^4^_L_`l`a`abLbcdcd$ddelefdfffgg|gghphi8iijjdkkhk|l(l<lLllm@mhm|mmnnn0n@nxo$op ppq(qrTrxrrs\sxssstLtuvwy4z{{| |4|P|||||}}\}~8~~8Ph$<h  0L|`0Hd0Dx@Xp< 8Pl $p4dxPpTlLd0ph((L`4H<Tldx(<,DX<Ph$Xh<$ (<XxDl($h|dd(@Xp(44 8P<Tlh,D\tÌäü4Ĉ 8`Ǩ,<L\tȌȤȼɨXʠʼ(̐HxϸДhш4xҌH|ӤԨtHdלװ$H\l؀ذ0L`٬(`ڤ,Lۀۜ۸$T<ݸ|`pXl<P,T|4TtDl 4\| ,Ll(dT Hh,`@T4PlH0Pp0Pp0X,X$LxHp8d 8` PL@p@hDx0\0` 8<Ht<Xt$Lp4Pl  ( @ \  lPl,LlXt  4Px@\ Ld Dd8hp\  d   !!t!""@"p""##P#l####$$$L$t$$%%@%h%%&,&h&&'T'((((P(x((())0**+,H,-d-..t../x/0401112|233445585566L67T88:,:; ;`?@@@@A4ABCtD,EHEFG(GIIJ JKKLLMN4NpNO0OOP4PPQ0QR$RStSST TTTU\UxUUV@VVVWWLW`WWX XhX|XXY8YYZ|[[[\(\\]]]^^^,^X^^__h_``L`aaPab$bbc(ctcd,deeef@fg4gh$hiTiijjjk<kl0llmXmnLno\ppLpq qrrs(st4tuDuvtwwxxxy@yyz\z{P{||p|}d}~x l@0@ThDh\Px8THX,(H44D8,`p(P,<(<pt(p4h|@8 (tńtǠ(p4d|@TdҔ8Ԥ0րDش|\ۈ0ݘ\ p80(XD`|$x4Pl8`x0X<Xt@Td|X `\(x8plHXp80<t  l| D0HDt ,   0 H ` |       ( @ X p        0 H ` x        8 0d33!%!!dN3!hj#"'4&5463232+"&46R-  3F **;\ 3"'73"'"4"4\$$$$\<@7##"&5457#"54;7#"54;7623763232+32+#"&54#3A[ WY NQ&[Y[ PS [ [$ ~~ ~qD%4.54675432632#"'.#"#"=.'#"=432326.EPE.Q?!,I.4I.EPE.ZL#HW7@S$,7,6P44<(=+!) <.;PwwO 0=Wc !,<%2#"&46"32654&2#"&46"32654&#"&547%632i4GH23HH2#12#"214GH23HH2"22#"21 { I52HIfI&2$#32#%2H52IIfI&3F33"%2z z  i/8!'#"&5467.5463262&#"6732+32#/32-C;V;4"I2!!  ! 2,o+ &qi(/>)70@^@4M7$1F  1>E:FS+)V ;)/F;l\3"'"2\$$&\%4>32#".&=D ' d C54'&54632#"& ' d C<=D h ;GI mNJn q\)54327632#"/#"&54?'&54632 Q  RQ  Q  + *p  pp  p* H #"=#"54;543232#@oT 73#"&547υ   H+ !"543!2nvt %32+"&46' (( ((t%8&&8%q #"&547632  G yH   qj "&=462'"326=4&hhhhDNQADNQ_dvvdwk^Yb^Ybqd32#!"54;#"&54?Aq  dq Tj"4632!5432!57>54&#"#"&hmMIo5[:vF+V93S  -ghD-OU$M"4N<- `j/4>32#"&546232654&#"543254&#"#"&}'V3KeA&;B{V; *N1DcjIN:*;   ('YA:D U3Lk; T:;Un1A i\%!5332+32+"54;5#xT"""LЩ/va`\&"#"5!2+632#".463232654&<'>& I;MdsY'M3 *N2I\Ob nT_y!  &&bOCTj,"&#"632#"&5463232654&#"!(TL1=iDcdIYp{ / J<8KK41# 3%DtG&znLQp QQX@;V1i\5!#"=!#"&547u  !#LA qj'"&547&5462&"32654"32654&wpnnpfiixrOO98P=UU=54'#"&54632#"&546.#"32>!(TL1=iDcdIYp{ / 9J<8KK41# (%DtG&znLQp wQQX@;V1v %32+"&4632+"&46' (( (( (( ((t%8&&8%-&8&&8&o^ 73#"&54732+"&46Ӆ   (( ((  &8&&8&H, %#"'-632  _ c C 3%w !"543!2!"543!2 DDNN,4632 #"&547-&N ^ c  A)>32#"=>54&#"#"532+"&46 >?(PbG^XMP>=D UE8L,)D%E+2?"),,ip-6"&=4632+5#"&546354&#"32>3275"32+WknUD[! :NaOB3DWVI*5 _@;L7+>or\EH5=S/4D~c]~ (:-&/ O3 $%!32+"54;#"54;32+"54;'#6Ox%LGpl%+3*7#"543!2#!"54332654&+4.+326|6IbUaD_@RJ7O&M65J)S>J.-d?Z<.,;&%A?@+4>325432#"'.#"3267632#"&5? "2Z9eHgCSvX4R(  4T,fE7J<+Ep.DYGZ*0  &+ e+37#"54;2+"5434.+3265h"aa'Q5Hp)j8k66ۑwb--+3'32+"54;#"543!#"=!35432#"=66Ƒb--?2@/"3275#"54;2+#"&=46325432#"'.;>Z)|lFIZa{mcC`6N@Ifu"4vJi6[&65'33!32+"54;#"54;2+!5#"54;2+32+"54;6-x66x.6q332#!"54;#"543!2#@? TG3#"&'54323265#"543!2#oM0V6KI=U( Jk)1DR:e+<32732+"54;#"54;2+%#"54;2+32+.'K66K-vIP88W7VGݴmw?3!5432!"54;#"54;2#=``  Q3,%##32+"54;#"54;32+32+"54;#F.J"cd"Ja\23"!#32+"54;#"54;#"54;2+4K"6j1J"13%@ 2#"&46"32654&,jghhVzzVU{y@y)Җgl+3!732+"54;#"54;2#'32654&+66PmvUA^U;_a)J43I3%@%0"#"&54?.546263232632#"&"32654&>0_ ZUqБh6(*G5 IE4VzzVU{yY Aj||{( $pҖgl+M3$-732+"54;#"54;232+./32654&+K66Ik/@=9BU9rJhU6]?a0 Rkzg)D0-E\@7%4.546325432#"'.#"#"'#"=4323264M[M4iOV<R:>Q4M[M4tZj?bDF]*4?2BY;g-m9`>@ps $xp(03332+"54;'32+"54;7'#"54;2+7#"54;2+E>@n+-o 3%3&%32+"54;5#"54;2+7#"54;2+Biio&(n g3)55!#"=!!5432vH]:;v:4\ 32+32#Aa3zq#"'&54632G    H    @\ #"54;#"543aS(qbg#"/#"&47,   g   X!5XK22@#"/&54632r  r vd  d  H ,463232+5#"&5463254&#""&5&#"326}&F[6_YfFVu^;MD7.b &45YzF5CSG9AQG%- Z;/'/(\#632#"'#"54;#"543"32654&Ik[~ZnF_66JhhJIig\g]^hX jkjJNkT%%#"&546325432#"'.#"32762"7Z/bd]?]?SghRmN  X !$|`c7 [(7gROeH ?G\#32+5#"&46325#"543"32654&6_GoYYnH6}JhhKJhg\YihjLMjjKNj?%!3267632#"&54632!."` nQ/b  De`e`v fdO_ 8a[{@DRQi\*".#"32+32#!"54;#"54;54632.A1>bXXWCFE'/&=O=7G ?F2'532++"54;26=#"&4632"2654&_6`Ert3GBiUyyUjgFbbbaNSl@^H3a|{)bcbFIb+'\-4&#"32+"54;#"54;>3232+"54;D7*7) -.6_&F.FY-- -9!0  .&O=\p32#!"54;#"5437#5@v;OhhFp#"543!+"54;265#5WD2A;xCFXB3hh?\)7#"54;#"54;7#"54;2+32+"54;'_66_/- \\32#!"54;#"543@u\  Q7>3263232+4&#"32+4&#"32+"54;#"543p0 @!7:+>"J(26"J'27"m""4$GG@,?+R<-RO51"32+"54;#"54;>3232+"54;54&?! --"K+B/CZ"m"A  OE0#N:+;H 2#"&546"32654&,`^__NmmNMnl_\^\)jkjJOjF(>32#"'32+"54;#"543"2654&(R9]}~\pCb66JhhhfR4,yz` cFGcbFIb?FG'532+32+"54;5#"&4632"32654&_66bCq\~~]ooKggKJigOR`zy)bcbFIbT""&#"32#!"54;#"54;>324"IS`KtEV&(< X*0LOf?10 g6%4.546325432#"'.#"#"'#"=432326D``DaJU4H98JD``DoU`=Z@BXu%(2,1@.E"(+  909K6 S"14+3$32+3267632#"&5#"54;5432<4*_  @GTJJ&. -C8 w+ !5#"&5#"54;327#"54;32#Tb2#".#"#"&54632* R%B;   L,E;'& P0/ R0/[h632#"&574#"&46;2-  nF **qv/4>754322632#"'.#"32>32#"=.q H4?)>0DYWB,; b2I^7,=2 kj$= 'S@?S(.qqi?B732+32>32#!"543>54'#"54;&54632".#"cZ9 1##7h^S:3N -)<`#hG&7mEU$;T@ =g_2>7#"&54?&547'&54626327632#"/#""32654&9  8#"7  8,:9-7  7"#7  8/6773II32JH8  8/6;+8  7##7  8/6:,8  8#"I34II25I3%3@%32+32+"54;5#"54;5#"54;'#"54;2+7#"54;2+32#AVVtn''nv<dd<@\"542"542@((((A N B[1E%+543232654&/&5467&546;#"=#">54&/&'#"f L9(5;HA8/ L4%6PH 1AoG+ 8($PC"-/EmE-41&CS:$.+G#-c 2"&4632"&46((c((TB%0<%#"&=463242#"'.#"32>22#"&46"32654&<";ZR9+.$4"+=C.& }z~x{jgm "Z;-!,463232+5#"&5463254&#"#"&5&#"32U,8?65,7K:-$C *+7"7/%,#+6 , ; $??632"'?632"'?          H !"543!#"5|H+TB )4@32+"4;5#"4;232+&/32654&+72#"&46"32654&$`.;& '96?8*1'MCz~x{jgmf$$$4), (6$w$z})jiki@#"4;2((Z| 2#"&546"264,:U)=*,==VH#"=#"4;543232#!2#!"4@on-((((d46323542#57>54&#"#"&@-+A;}$&+)  =<) Es'+{& ' d."#"&54632#"&5463232654&'&54632654&,  E",<.:G2%M :$"34($'@ %5'+$4,?$ "**  #"&54?632r  r  Wd  d +8!7#"5#"4;327#"4;32+5#"6_3(eRJs"KPe9&()2[((;KO \%-.=46;2+32+"547#+"54;5\qyb=>bHa:MMP r Q/;$ `32+"5432#"&546?G'A `$   A 2#"&546"2654->UW<=VVk\@AZAAV>;VV=54&#"#"&  ^  G'A *@-+A;}$&+) b   }$   =<) Es'+{& ' Dd.=TX"#"&54632#"&5463232654&'&54632654&"&54763246;5#57332+32+"75#}  E",<.:G2%M :$"34($'Q  ^  . 9  U9k@ %5'+$4,?$ "**  cb   + 9"$9$qQ'#"&546754323275432#"&46;2cLPbG^WNP>325432#"'.#"3267632+#"&5463232654+5.5? "2Z9eHgCSvX4R( &#Z) A,#> ,.llE7J<+Ep.DYGZ*0 # ';$  EM+ #o(+#n(+"jt(+"j_(q #o(,q#n,q"jy,q"ja,3.#"54;5#"54;2+"54;4.+32+3265hMM"^^"w )F+Gqh8h,<1#}O2"d13% #o23% #n23%"jx23%"b23%"j`2vd!762"/#"&54?'&54632,     7     (0]'/7#"&54?&546327632#"'&#" 32654A  EBhVHB  FChZB ;IVzl;JVz3R  WXr|BS  XSx|l;i[;i^(0 #o8(0#n8(0"jx8(0"j`83% #n<+3(732+"54;#"54;2+32#'32654&+66PmvUA^U;oFO_a)J43I\:%4.+"54;2654&#"32+"54;4632#"&5432326,A9&:B,*@n6Y:@W:HA3F  $.20H$3!*>8%S5QS?<'.T]D1%FH"oDH"nDHr"jDHD"DHO"jDH"~ D B2?G4632>32!32>2#"'"="&5463254&#"#"&5&#"32%.#"Gb%>@$IHH2.! ])J2(8TkL),3%$> ,# J;.3B*Yz .&'-}kLb BM"DT@6G <#2 ] "*6'5TS>%#"&5463232654+5.546325432"'.#"32762%1K+A,#> ,-2K'd]?(\?SghRmN  X;$  C*1>(c7 [(7gROeH ?"o H?"nH?p"jH?O"jH\"o\"n\t"j\O"jHl,7.54632?2#"&54632&'#"&547"32654&. /e_ KKX`_^)@)5D[ WNmmNMnl%  0* "@Sl^\c1* jkjJOj5D"QH"o"RH"nRHv"jRHD"RHO"jRH!"43!22"&5462"&546n((((5#+7"&4?&54632762#"32654&#"B  B9_R>@  @;_P3BNm2ANm#D  CBS]1B  AAV]Y(jLD&jLD+"oX+"nX+r"jX+O"jX3F%"n\FN(>32#"'32+"54;#"543"2654&(R9]}~\pCb66JhhhfN4,yz`cFGcbFIb3F%O"j\ O"m\$H"mD O"|{$Ho"|D eY3482632#"&547#"54;'!32+"54;#"54;32#3 #  1$(MuL86Ox%:Jpl{   :$!)"`%He,4@46323232632#"&5467#5#"&5463254&#""&5&#"326}&F[6%+  1$(#*=YfFVu^;MD7.b &45YzF5 %"   +CSG9AQG%- Z;/'/(? #n&T"nF?"jy&To"jF?"}e&TO"}F?"kr&T"kF+"kp'?\#`8G3?G\&232+32+5#"&546325#"54;5#"54;"32654&666_FoZZmH6_JhhKIigJQa]\`+jLMjjJOj+"m\(?"mH+"||(?p"|H+"}a(?\"}H+e$3<2632#"&547!"54;#"543!#"=!35432#"=#!5432  1$(Mn66ۑ::{   :$b--w+"?e+12632#"&547#"&54632!3267632!."  1$(6f`e` nQ/b  5@5v fd{   2!b[{iO_  $"2"kDRQ+"kp(?"kH?2"j u*?F2"jJ?2"| |*?F2m"|J?2"} g*?F2^"}J?82@'*?F2"_J5'"jx++'#jK5'3?C32+32+"54;5!32+"54;#"4;5#"54;2+!5#"54;2+!!.66-x66x)(T(eeeD+'\94&#"32+"54;#"4;5#"54;32+>3232+"54;D7*7) -.666_&F.FY-- -9!0 (6_(z.&O=q"c,\D"q"m[,\"mq"||,\n"|qe3+2632#"&5467!"54;#"543!2+32  1$(#*? % {   + %"\ep&*2632#"&5467!"54;#"54;32#5  1$(#*v & X;{   +O $"hhq"}c,\32#!"54;#"543@vO;36#"&'54323265#"54;2#!32+"54;#"54;2#FI/> (%8-_m,,, Pe*0)JBe|Fp*.#"54;+"54;265#532+"54;#"5437#5QzWD2A0;@B8l;xCFXB3hhOhhTG"jln-F&j+8<3'.?8\'NF?"ny/\#nO?83'/\8\'O? @#`/\\#`O?3'y/4\'yO+3-7632!5432!"54;5#"&54?5#"54;2#  <`j  ~` P  \ޡ>  J\\&763232#!"54;5#"&54?5#"543?X  lW  ku\3  >2  =2"nt15"nQ823'158'Q2"ks15"kQ"Q` 5 A*4&#"32+"54;#"54;632#"&5463232P=aK--"KKeIi> .i+q|`qES 595232654&#"32+"54;#"54;>32#"&546,.;A7! --"K+B/CZV=> A3J+;  OE0#N:?X 3%"m]2H"mR3%"||2Hm"|R3%"6p2Hz"6R N3$135432!"&5463!#"=#35432#"=%;#"Rrm;N-X= =X-\}q` )NK..KN B"*5632!32>2#"&'#"&54632.#"'"32654&+-W//I0.! ])-ME*>\[>)H +Y-DD.,ED=r1`BJd B@79>\Y>&6mnnGJn+M"nu5T"n U+8M3'5T8'U+M"kq5T"k U\"nw6g"nV\"jp6gr"jV\S@M#"&5463232654+5&'#"=43232654.546325432#"'.#"4M[M4lXA,#> -/\1bDG\4M[M4iOV<R:>Q'0C3F\;$  B <p1DI7*4?2BY;g-Qh2fSA,#> ,.T.Z@BXu%(2,1@.E!)+ "pH;$  B , S"14\"kn6g"kVHS33232654+5#"54;##"=!#"&=#32+#"&546,.ii ilA,#> r QIrr I/;$ +C3"zWH"kq7+e#`WH3(32+32+"54;#"4;5##"=!#"&=#Accii`` Q((Irr I+305#"54;543232+32+3267632#"&=#"43JJ<4*_  @GTKewwe(~&. -C8((0"c8+D"X(0"m[8+"mX(0"|}8+m"|X(0 "~x8+"~ X(0"6s8+z"X(e03:2632#"&547#"&5#"54;2+3265#"54;2+  1#)<'Tr"J[CB\J"!//!{  !2$tUQD\]CQ-J/(,"+e,42632#"&5467#5#"&5#"54;327#"54;32  1$(#*)TbbXXWCFE'/&KO=7G \ 1"32654&%5#"54;32+632#"'#"54;#"543BJhhJIig6_Ik[~ZnF_66jkjJNk+Tg]^hX3832654&+4.+326!2#!"54;#"32#"&46@RJ7O&M65JRIbUaD66%! %9<9<.,;&%AS>J.-d?Z!  7R4,3g\ ("32654&'632#"'#"54;#"543!2#BJhhJIigIk[~ZnF_66jkjJNkg]^hX .%N 3%4.+32632#!"54;#"&54?54327632&M65JA_0aD62  FJ  &%Ar24?Z#  0B%3  N 532654&#"'632#"'#"54;#"&54?54327632hJIigKJhIk[~ZnF_6-  AO  kjJNkUg]^hX  -C'7  ?@+72326=4&#"#"=432632#".54S #H.XvSCgHe7Y3# f+S5!}&ZGYD.pE)325462#"&54&##"'.#"3267632#"&5? "2Z9eH4R7   gCSvX4R(  4T,fE7J<+E%;8& !$p.DYGZ*0  &+ eT2%#"&546325462#"&54&##"'.#"32762"7Z/bd]?4R7   ]?SghRmN  X !$|`c7 %;8& !$[(7gROeH 33 ,4.+3265!2+"54;#"32#"&46'Q5HpCaa"F$! &8<>j8k   7R4:,3&35!#"=!2+32#!"&54>;5#"66Da0_{J5ЕiQCb^@54 /FL\ ("3264&7!"543!2+32+5#"&54632KgiIJhhh66_FnZ~[kIkNJjkjXh^]gD9 -J+3)##"=43235!#"=!2+32#!5432!66>:--bw2@\@;"3267632#"=#"&54675.546325432#"'.#";2#)IX]FDb?jZt<2'1iOV<R:>QWA0@57ID1pH^I5HA,BY;g- ' A3b--;J Wj-"&#"32+#"&546323265#"54;54632)3?``V=> ..;``W@> 6 @3W?X A3WA[ ?x<46325462#"&54&##"'.#"3275#"54;2+#"&5?mcC4R7   `B>Z)|lFIZa{>i6%;8& !$[&66N@Ifu"4v0"3=%3254.'#"54;2+7#"54;2+#"&54>, !<o&(n  50/6& &"%5Z  !("#:IN56-E\8%#"'.5'54+"32+"54;#"54;>323265#"54;EG;@. D$3-.6_-)5&-)Jst8L9 % ]5 %"&432A%2;=fD) D "!G9(EW q3#5#"543!2+32+32#!"54;5#"43?dd_A((+f3?32+.'32+"54;#"54;2+%#"54;2#"&5463265.#IP88W7VGQK66K-v$<8& !$ mwI4R7   ?j2"&#"7#"54;2+32+"54;'#"54;4632k)3?/-._6W@> 6 @3'A[ \\!+32#!"54;5#"4;5#"54;32 baaub) (:&f<2763232+"54; 32+"'"&54;'#"&54?'#"543H  Jn85n  N  P^f 1  40 T86  87 Q37!5#"'#"&5#"54;327#"54;327#"54;2+32#0 @!7:+>"J(26"J'27"m""4$GG@,/+R2-RT3&7"&546323265#"54;#"54;2+#?4> ,!(6jJ"4:@V A35H1"32+"54;#"54;>3232+"54;4&?! --"K+B/CZ"m"A  OE0#N:J+;3%@.3U )"32654&32674&#"&54632+#"&4632,VzzVU{y8:$! &8;%BghhPҖgl   7R4UzyHN *"32654&732674&#"&54632+#"&54632,NmmNMnl4?$! &8;%4^__HjkjJOj   7R4=T\^\R~ 3"32654&'63232+"54;4.#""&54632TY\QR[Z)f?:W(!(3<pspf!qlnoIJ* "G)~~T /"3264'63232+"54;4&#"#"&54632tJK9:L62^)9..#!=-?gCGdcH+lPKfj{<;1?!'.32#"'32+"54;4632hhfLJh)3?(R9]}~\pCb6W@> GcbFIbc @34,yz`_A[ ZI,C\:@+/& 2)7'q?  --  ?.#*+B2*4 |$ {j_    \@774>54&#"#"=4326323267632#"=#"&\4M[M4Q>:R7654&#"#"=432632D``DXB@Z=`Uo1MOL J89H4UJa>-1'&(41"S 6K9*6  +("E.@fAQj '"2654#"&54'"&4632326322##2#>=V7L77&@W;., I"""X?& $56J5[Ar3A +9342326=#"&5#"54;543232+3267632#"&546..;KSGTJJ<4*_  V=> A3;!C8 ww&. c?X 3'"32#"&463!#"&=#32+"54;q$! &8<$ ii   7R4r I+j/"&#"32+3267632#"&5#"54;54632l)3?<4*_  @GTJJW@> 6 @3-&. -C8 -A[ H93 #"&5##"=!#"&=#32632>=V ;., X?:Irr I3A (u2#"&5#"54;2+3265#"54;2674&#"&54632#sTUr"J[CB\J$! &8;% UtsVQD\]CQ   7R4+>5232+5#"&5#"54;327#"54;2674&#"&54632"KTb75##"=33>54&/53#"=#+.W&8-}MRS1\+= AD A_+6&Z%4';[,ae``.?.532+#"&5#"54;2+,(+^ 4U]51M 0# NPx:=%337#"54;2+32+"54;5#"32#"&46;2#(nii$! &8<$o    7R43Fj52 32+"54;7#"54;2+#"54;2674&#"&54632#AGs46n$! &8;%xxK   7R4g3!!5432!57#"4;75!#"=!32#6:vMj]Q;(v:(s%7##"=!32+!5432!57#"43(x^}GjM7`$(8a$(`3/"&54?##"=!2+632#".463232654&#" ?&,MdsY'M3 *N2I\O?4\:7` nT_y!  &&bOCT(P30".#"32>32#"&54632'#"543!#"=#&@&?O\I2N* 3M'YsdM,&? :TCOb&&  !y_Tn `7_b0%".#"32>32#"&546;'#"543!2+l  "/AJ2$<'  !C"JZSE  ȴ  Z>Ek%% UMs~ X8A#".5>32>54&#"#"54?#"&543!2+2#"3267632r;2E8^C),88"   (51$H25E=1-Mh)7 2+<6 1#-   ~/%22$% ,Tj0+!5432!57#"4;>54&#"#"&5463232 ]J:vW:$V93S  mMIo15 <$M<(99 4N<- -ghD$:3P3,"#"=#"&543!2+632#".463232654&<'>& - GI;MdsY'M3 *N2I\Ob nT_y!  &&bOCT_*7"="543!2+6;2#"&546232654&#" %P\QG>Y7-97=G 0 y JD@R2 9160 327543232654&'5#"54;5#"54;2+32+#".D=>PMXii--ii^GbP(?>"D)"?2+E%Qoo6,L8EUF )%654&#"32+"54;#"54;7>32I10$+DMb66_3#R.%W;G)5#"54;2+#".'5432qY((  _2s   S+e  "FGp-135432!"54;#"54;2##"54;+"54;265#5``QzWD2A0; CFXB3hh|Fp*#"54;+"54;265#532+"54;#"543QzWD2A0;@B8xCFXB3hh X3C#"=4323265#"54;2##32+"54;#"54;#"54;2+0R*$u2+f&Z*u"jS1ZD%6Q(@&FGp"6:!#32+"54;#"54;#"54;2+#"54;+"54;265#54K"6jJ"QzWD2A0;ACFXB3hh FGp3GK4.#"32+"54;#"54;>;232+"54;#"54;+"54;265#5a8*  --"K'*"BT"m"QzWD2A0; ++  OE5N:OCFXB3hh O"kq$H^"kDq"kq,\l"k3%"kq2H^"kR(0"kq8+^"kX(0 #q+"ql(0%/9I#"&5#"54;2+3265#"54;2#%2"&4632"&467#"&54?632sTUr"J[CB\J((r  r  LhhL0Z)|lFIZa{mcC`6N@Ifu".??E4vJi6[&6?F2 4"2654&+"54;27#"4;6=#"&4632532+32#Fbbba~MIqBPMb66_C19b@,377UMɆCC& -2"C6q15"C< Q O 04>H#"&54?632!32+"54;#"54;32+"54;/#2"&46"2654:r  r  f6Ox%LGplc'67L77?2##2#d  d v^5'$56J5!"""H &~&Dv N"vq B^"v(0#v5"v O#0$H#SD O#1u$HV#SD+#(?z#H+#Hu(?I#OHd#!,\z# q#Xu,\I#W3%#"2Hz#"R3%#Xw2HI#XR$M#5Tz#.U+M#;t5TI#dU(0#"8+z#X(0#Zw8+I#?X\8@&6g8'VH83&7+83&Wp@6%".54?654&#"#"=432632#"54?>54&# 'Q>:R54&' J89H4UJa M(  %& 5 f +("E.@1- !J+%V V#I5'"kq++' #kKF:A*32+"54;4&#"32+"54;#"54;632--P=aK--"KKeIiq|`qESg93%2326=!55!#"=!!5432#"&546..;H]:V=> A3*;v:4?X s9#2326=!5##"=!!5432#"&546..;-^V=> A3*$T7`$8?X O"}_$HO"}D+S3@232654+5#"54;#"543!#"=!35432#"=#!5432##"&546,.66ۑ:A,#> r Qb--w/;$ ?D27!.".4632!3267632#"&5463232654+hv fdZw`e` nQ/b  DA,#> ,.DRQ {iO_ 6/;$  3% #qH"ql3% #qH"ql3%"}e2HM"}R3% #qH"qu3%"qX<3F% "q\F#"543!+"54;265WD2AxCFXB3H De?G !"32654&43232+5#"&4632JhhKJhgg6_GoYYnHjLMjjKNjYih' fj ,32654&#"7"&#"632#"'#"54;4632hJIigKJJ)3?Ik[~ZnF_6W@> kjJNk @3g]^hXA[ T(7232654&#"#"=432632#".546g #O4RhgS?]?]db(K4( keORg7([ 7c`| T|/5".546325432#"'.#"354632#"&5764#"HEe3d]?]?Sg+S:7029  )B>*FF&c7 [(7gR :8"D3?9.gb |I?9\ ,"32654&#"&=#"&46325#"54;32632JhhKJhgQ>=VGoYYnH6_;.. jLMjjKNjX?ihz3A ?j ,%4&#"326"&#"32+5#"&463254632gLJhhKJh)3?6_GoYYnHW@> NjjLMjj @3[YihA[ ?723267!4632#"&546%."V,V8Qn `d`eD df V_Oh{[a8 EQRD? HGC)1%#"&/#"&'%&#"#"&54632732632'32654*. `Hqn9p/b  D@k!:+ !6fRh ) ,.[{H>T 892J KeI$g@7326=432#"=#"&54>75'&46325432#"'.#";2+"XB@Z=`Uo .aJU4H98JDP0D-A u(41"S 6K9(  b@.E"(+ ) g@%4.+"54;2654&#"#"=432632#"'#"=432326 A-D0PDJ89H4UJa. oU`=Z@BXu  ) +("E.@b  (9K6 S"14gT732632#"&/#"'#"=43232654.+"54;2654&#"#"=432632:+ !*. = oU`=Z@BX A-D0PDJ89H4U/PwJ ) 3% (9K6 S"14(  ) +("E.L <747>32#".'.732654.+"54;2654&#"LEZ.Ja= oU%  G,jBX A-D0PDJ8`OJ@13% (9K  Z@O%S4(  ) +F !%#"543!32++"54;26=#"543;;WD2A)OFXB3?Fj 1%4&#"26"&#"+"54;26=#"&463254632aGFbbb)3?+3Grt3GBiUyyUjAW@> Ibbcb @3:.6H3a|{aA[ ?F &"2654&5432+"54;26=#"&4632Fbbbaa+3Grt3GBiUyyUjbcbFIb8SC:.6H3a|{M2"3275#"&54;2+#"&=46325432#*#"'.+Sbg`;>u  OUm|`T; QWA6JN\  v&hX7Nq( C &48('/%3#"54;2++"&=47#"54;2+274+2o% %o1%S{J3%%2LL-!!2&.8632#"=.#""&547&#"#"=43263263232654E5H5^5H4F!V@@V"<"!S/Z/IH0Z/S99uPw".."w+E' KR3'j64&#"32+"54;4632#"&#">3232+"54;D7*7) -.W@> )3?&F.FY-- -9!0 A[ @3s.&O=39j:"&#">32#"&5463232654&#"32+"54;4632W)3?&F.FYV=> ,.;D7*7) -.W@> 6 @3s.&O=?X A3J-9!0 A[ \p$#5#"54;5#"54;32+32#!"54;>;vphhX%#"&5#"4;32>32A%2;=fD) D "!G9 (W 32#!"546;#"&543!2#Aw  yy  x   O  \\0746325#"54;32>2#"'32#!"54;5&#"#"&\L,$u/* R%'*   R&'& P# \\&0325#"54;32+32#!"54;5#"&=464&'; u 2'33Y/2   6"%1n)/9\#"&5#"54;32632>=Vu;.. X?cz3A b7\?%"54?#32#!"54;#"54;!2+32#".'&5463232654&#"*xk5 ESZJ"C!  '<$2JA/"  ~sMU %%kE>Z  Q P\ FQ75#"'#"&5#"54;327#"54;327#"54;2+32#0 @!7:+>"J(26"J'27"m""$GG@,+R -R  9@232654&#"32+4&#"32+"54;#"54;>32632#"&546=..;(26"J'27"m""J0 @!7:+>U=> A3i+R<-RO4$GG@,?X 95"#"&546323265#"54;>3232+"54;54&?! V=> -.;"K+B/CZ"m"A  ?X A3E0#N:+;595"32+"54;#"54;>3232632#"&54&?! --"K+B/CZ;.. >=VA  OE0#N:3A X?P+;6(!#32+"546;#"&54;#"&54;2+1@  - ] ?  k   O B  H 2#"&546.#"!26,`^_iIHjtjk_\^\F\]E(E^^ K%.75463!#"=#35432#"=#35432!"&#; |y5KKr$u\nh Xiq`\wMOS^+(!9"32>=43232654&'.#"&'#"&5467>3233_:*"  77= T UG*0*&IT1]B;g 8d7Q&( 1)xG6G!"&P;5332+#5#"&53;#"4&+3265p D0"-5?N D0"-5?N-?%163,W<(163,)*J;(+J;1,Q6%2+6%T UqT[  q49C+7232675#"543!2+32632#"&=#"&546I4"IS<`;.. >=VEV&(< I*0L^3A X??10 TF""&#"32#!"54;#"54;>324"IS`KtEV&(< X*0Li f?10 i9&"&#"32632#"&5#"54;>324"IS;.. >=VKtEV&(< X*0L3A X?f?10 T)"54;546;2+"32`WD2AFXB3T8"54;4&+"54;232#A2DW`3BXF^<)4732+"546;#"&46;232+.'74.+326?  -- @^@:*;2 28K4)$ a;]  M E/$99I XIx2<)473>732++"&46;#"&54;2+4&+32>q4K82 2;*:@^@ --  ?];a $)IX I99$/E M  2g9B%4.546325432#"'.#"#"'32632#"&=432326D``DaJU4H98J>Qh2oU`=;.. >=VZ@BXu%(2,1@.E"(+ "89K6P3A X?"14Wj"&#"#"&5463232654632)3?V=> ..;W@> 6 @3l?X A3A[ Wj,"&#"32+#"&54632327#"54;654632)3?`kI.> .<P^W@> 6 @3[*3 4 A[ Wj#"&54&#"#"&5463232632>=V?3( >@W;., ;X?3@ [Ar3A Qj '2654&""&#"#"&4626546322##2#,.;W@&77L7V=> <"""N A3rA[5J65$ &?X +3 W#+83$32+3267632#"&5#"54;5432<4*_  @GTJJ=&. -C8w+*232+32+5#"&=#"54;5#"54;!5#"54;!327"""KTb=V-^;., X?0$T7`$83A s +%3267&'7+"&=#5##"=!3546;2v)/>0  -^ѣ6"%1)/ ),P O$T7`$2'33_b07"54?#"&543!2+32#".'&5463232654&#"  ESZJ"C!  '<$2JA/"  ~sMU %%kE>Z  p8 H'&#"3267#"/#"&54632654&#"#"54?#"&543!2+2(Q   ),8$35A/"   /E"%m+% - . =%3-+4_>Z   ~'>=6aA$>3232+"54;5>54&#"#"5 >?(PbG^--XMP>=DUE8L,%E+2?")A$#"=&#"32+"54;5.54632D=>PMX--^GbP(?>D)"?2+E%,L8EU3$7543232654&'5#"54;2+#".D=>PMX--^GbP(?>"D)"?2+E%,L8EU?8B+4>325432#"'.#"3267632#"&5? "2Z9eHgCSvX4R(  4T,fG7J<+Ep.DYZ*0  &+ eH "32+"&4672#"&546"32654&' (( (("`^__NmmNMnl %8&&8%_\^\)jkjJOjI!)7#"&54;2#!"5463732654&+4+326- @VKpU< V8C;10;)O >-8!!K/B '" "S'g8";2+"32654."&54>75&54632.8JDP0D-A XB]I"@.Uo =aJ+E,+P+ )  (4`j&0jK9( %31@'0)u  OUmNq( %;8& !$C &WA6JN\  v&hXS ;%#32+"&546;#"&54;2+35#"54;2+32+"546;- { % j--j & | -ě   O    F"p*#5+"&5>;#"543!32+";267;gb4 7MR1D m$85' &Fphh!IPC/5<O  ( />8?E N\\35432!"546;#"&46;2#s SS  xl O   ?Fj 0%4&#"326"&#"32+"54;5#"&463254632gLKggKJi)3?6bCq\~~]oDW@> Ibbcb @3`zy`A[ A2>3232+32+"54;5#"54;5>54&#"#"5 >?(PbG^ii--iiXMP>=DUE8L,6ooQ%E+2?")A2#"=&#"32+32+"54;5#"54;5.54632D=>PMXii--ii^GbP(?>D)"?2+E%Qoo6,L8EU)9\ -732654&#"73%25#"54;335432!5#"&546R2-:=,,R6_V/E=LkiLNjk]O7@$8a1A~b^b=\ Q732654&#"725#"54;!2+32#".'&5463232654&#"#"54?#32+5#"&546B, 07=,,FR6_ ESZJ"C!  '<$2JA/"  &O[0@=@whMNjk@~sMU %%kE>Z  1A]^ S\ 5AE%3267&'7#"&546325#"54;33546;2+"&=%32654&#"73)/V/E=2R6_=6"%1>0  2-:=,,)/[1A~b^@$2'33# ),P OLkiLNjk]OK3C%32654.546325432#"'.#"+"&=#"54;543232+@F;UU;OH(0=168;UU;]S=VJJ@@;3)%(2,2?E/)":0;IX?ww3AFj<"&#"#"&=#"54;543232+32654&54&546323)1B#Z:=VJJ||90-?#[=> 6 :-7TX?ww3A=+A ;S |O6OW32+327&546325432#"54&#"354632#"&="'#"&5#"54;5432>54#"//<4 ;`T+8"O9@H8&./10KJ  0)#GTJJ%=/84&.8ve~ [%:eT)6!D4>8/;5b `C8 w#">I9?\CG".#"3632#"&5463232654&#"32#!"54;#"54;546323.A1>>O>PF9> .772?E-NDDWCFEZ'/&=ESN:@W D0J,:ZO=7G OP\63"54;#"54;32654.546325432#"'.#"#"W>H;UU;OH(0B-68;UU;]S 0(#%/*2;E0&! :1:F%2\!35432!"54;#"54;8W$8a O: A#'##"54;2+73#"54;2+#'##"54;2+73#"54;2+2[Y3To5HV3YE2oS2[Y3To5HV3YE2o77H4#"=!#"&=#"=!#"&=q   p pkp p E&h.73275#"54;2+32+5#"&54#"#"&54632A0D3-.6_8,=X>( 744-;c$&N<Ot BU9Wh732632#"&=#"&54#"#"&546323275#"54;2+   5.88,=X>( 744A0D3-.*4@ VAl$&N<Ot BU-;czt-4&#"32+"54;#"54;>3232+"54;{,$%V#>--:V%  S 3(  64&#"32+"54;4632#"&#">3232+"54;,$$V9)( !).-:U%  +; )"J3(  u#"54;+"54;265#5y9,TS +& -9 +!CC ""&#"32+"54;5#"54;>32"05t>1L-7' 1  C)  W "232675#"54;2+32+5#"&546e!06t>0K-7'- 1  C)  w5+232675#"54;2+32632#"&=#"&546!06t>&((8-7'U 1 !* 9)b)  f_$-3>732++"54;#"54;2+32654&#V%7+%(*ZE0##o1c$7D0CO F5?)= 9 -,{ %#'#'#"54;2+737#"54;2+ <9"6 I#/8!:-!H  Ц {%%'#"54;+7#"54;2+32+"54;!z K"ki#G *S    v 3#"&5465&PW   &]]Av #7632KPW   v 3#"&5465&PW   v #"/K*  W , 2654#,##(57&""!4'$5, "&5467",&75(##!5$'4!"">32#"=>54&#"#"5))4@.= 923)(,  7-$2}- )#"=&#"#"=.54632 ,()329 =.@4)),) -}2$-7 S #"/7632n   > b` S fXsS #"&54?#"',> aa n  S hXs#"/#"&47,  kk  l  XX  '&54632762,  kk  m  XX  @{"=42@((cbb@qv@CE@l[ql8~N:~Pr 32"/&54"54?62#d6666p p_p pr 32"/&54d66p p,ub,uc #"4;54232B(B(BB(oxX54232+"=#"43(BB(BoBB(BB(@#"4;2((l2267632"&54>-^c 2"&46,(c( 2"&46"2654,'67L77?2##2#5'$56J5!"""e2632#"&5473j  1$(M/:{   :$!)"]2632#"&#"#"&54632j0 ?V &  AW-. 40- 10y#"&54?632"&4?632#a  b  b  b  Q^  ^  ^  ^ 732632#"&/._+ !*. ;b3J )!#"&54?'&546327632#"/ //  //  //  //   //  //  //  // t#+7#"54;2+#"&547'#"54;2+274+k!H zv I g    0! 2  u32+"54;#"543:hhLu  S  74.546325432#"'.#"#"'#"=432326,?>,?07" /%$1(5D H7>(  ;)+9@  *- %%1#6 "332+"54;'32+"54;7'#"54;2+7#"54;2+>xV*df,WxjHXY Ht  aa  tf UU w$#"=&#"32+"54;5.54632 ,((429U=.@4)(X,) -  2$-7 2 !"5!"4M}( (2 !"43!542"5U((a(} 2 !"43!42"5U((|(b 2 %!"43!42"5U(((& 2 3"43!42MU((d )42!2(U(Z{ 7!2#!"542U(((P8'&54632762,  kk  m  XX  7!!"43!2!"43!2LLr((b((dW\87632'&54632,> aa vn  8X=8#"/7632n   d< `^ 8X88~X~mo'R~\955vDn 32+"5jB((Bn "=#"43n(BjB(n]W|[zx85432!5432 U~~ Ux8 !5432 )~ U;8"7632!2#!#"'< BTB nT ) CCevCej9o]Ce@q@!"43!2RL((Cel|c}4ucjt0!"&=4>7&#"&546;2  26  8&(4L      63 )68w1~CeyCek{l${"=42"=42((x((cbbbbCey&54632#"/&54632"'  b   b  Q  ^  ^  ^  Ce#}@|GiH |27_U` a  :.9=CO8/vrNB" "=#"4;542(BB(&(&B5.)]x54&#"&54632+"&546;26! &8;%B B$  7R4  8v4nEPx-kEMX8:zNU7{o92326=3#"&546..;)V=> A3*0?X 9#"&=332632o>=V);.. X?0*3A c}d9gzjh89~X8f 3#"&547DJ  4 zS!zeYJ`A8 7] 2325432325432#"'#"&54L66 1./2,0+ 9 9 .34-JDlkZ;E] kNPp|f:I\ | A9i? v]v1]9#".5332632>-!)%. :(#/ o^q#"&54?632jW W  v  ##"&54?6322"&4632"&46W W    v  B  Wk# v 32+"&46' (( ((&8&&8&Ok#GVm#/ k#$7Lk#('Ui#0Im#,"7"2 O3$+3%>3732+"54;#"543!"=!66()b O3)"54;#"54;32%!#4x%x)+3(g3=5'3+3%@$/%#"=##"&=463235432'2#"&46"32654&  sjghhVzzVU{y--  00حy)Җglq3,+<3. O3 732+"54;#"54;32+"54;#lOx%L) Q30231E3 '7"=!#"=!#"=##"&=4632354322!54632!54t   | 2dd--  00 ee 3%@233'7+"54;#"&543!2+32+"&54;!32, - 56 " "+33fA)57'5!#"=!!5432|ʨ4<:yH373%3<.*309#";5#"&46;5#"543!2+32+32#!"54332654&#"B^U;2.OmuU us UumO.s2;U^BJ43IY_a<?G !"32654&43232+5#"&4632JhhKJhgg6_GoYYnHjLMjjKNjYih3"32654&#"'543267654&IAR)F=d:@t; "G3CML6Kgj]E+ <\M@'B JA_u((U/2#1AedFHH!-8=F!!+32+"4;5#"4;2+#"4;!A= n58n((y((L(D(832#"&54767.546325432#"=&#"2654.#"P>cK1b]/9 &6G;69*2Rf,5*Nj77 *V7Z\\^1: 3$8<'N'&oL*E( mOL87E732>75432##"'"=#"&5'467&54632#".#";2+"48    .:@].+NO@S]  +@'1? & *,w>  JB7 #? 96HB  ##2)$ &6zF\.##"=!;232+"54;654#"&5467^F4=-'-=" ~-"?S=I37`$AeK/A$/8 ?&-Y?SyC5F,"32+"54;#"54;>3232+4&?! --"K+B/CZ"KA  OE0#N:H+;qj "&=46226=!"!54&hhhhDNQADN$Q_dvvdwD^b'^b%#"&5#"4;32>32A%2;=fD) D "!G9 (W F(3#"54;#"54;7#"54;2+32+"54;'_66_/-O:&f%32+"54; 32+"54;'#"54;2n85n G^U 9T+8w5!!##"54;2+3>5#"54;CFt91b)5@ D#F*x+?[]-(+ZCX-|F\<;2+3232+"54;76=4#"&5467&54?##"=!$7%4 4TB& ~/+|Lr\P,B^#3  04j/! $@FFUi%9P 7`= HRR%!2+32+"54;#32+"54;#"54m~""x--w!"OOB&2#"'32+"54;'4676"32654&=Wz\n@b6D3,6N`eIHe^z_\|[`@k+fHIefHJd^n1754>;2432#"=&#32#"&46326=4'#"&^,IV0 ;12:]@ KQ*$ 5Lv=\4#E0KO#/*  &h+ 72654&""&546763!2+J^`abGZx./.K Y#<bOLhjg)[>Q('  Bs5E#=+) %#"&5#"5463!2+32>32A%2;  D) D "!G9  W +)%26=#"54;2+#"=#"4;(:M15]U4^<A6(PN(.E%8! )%+#5#"&=#"54;;3226=4+! @-+--?O2 $\3(2b(; 3,d1)*F;)2y*+9!YF)("4;7#"54;2+32+32+"54;7G@1-4 L)5y(( "F-\-7;462326532++"&=#"&=#"4;=-  *%2V -H9)  +9H)R1-  6' :K L:(+(="&547#"4;2+32>=432327654'#"4;2+#"&'IT7m1:*"  7@#:2n6UG*0*\^S((P]7Q&( 1)Z/6[Q((S_b%Z;"j2+);"j>H"8+)" >+("$Bpf &03254&+"32+".4>;2#;2654#B69K(>: ^H5Q++O5D` N:8BD7;gw"$"-!E[32#"&'#"&46;2326=4&#";2+"&r&F-ShhSEb! , "fDNQA 5 t5I;*wdviY   ^Yb!/8)   0(3 %#5&5476327>32#"'&#")  $   C3%%#5#"&54?6327>32#"'&#"2)f  r $Y  d  0("jBJQF\ ;4&+3265%;#"+"&=#".=4>;546232<(163,?%163, @-+  5(; @-+  5(; 2+6%2+Q6%)* *+)* *++(="&547#"543!2+#"&'""+32>=432327654'IT76UG*0*K`1:*"  7@#:\^SS_b%P]7Q&( 1)Z/6[QPnT2'#"+"'5;254.#.546;TDaaD)J;)   `lɯ =C)*$.(A  RYYm'#"#";2>54.5463ldYG&@; 6 9%1/ERE/~(ki4.%!/ (  B1{+3$#"=#32+"54;#"543!#"=!32_66Ƒ)--b'1("4;7#"54;2+32+'32+"54;7'OIp.*{1 L~&2usy(۱( xdB#/2#"'32#".='4676"32654&=Wz\n@CIC32#"32+32Dh26W5M`cJCe8(NA(_AE_+&kC,q+&kjsw61326=4&#"32+"54;##"=!"=#6732#T=QHDL%6x|t(|)O RamO`S84+ItrL ?AKj>&iq@@/4>32542"5.#"!2#!327632#"&5@ #3Y7dJ((hCSuXbL  4T,fE9I;)Ep.DYZZ  &+ e\@6q3,q"jr,TG3-H3,532+"54;##"&=432325#"54;2#32654&#T(UwnPst6$; .:3732+"54;#"543!"=!66()b 63%765#"543!2+3#"=!#"=;#"Yc<)""bbb"+3(P3N2+7#"54;2+32+.'32+"54;5#"54;>7'#"54;2+5#"543^V2=98RKd3?589=2V34pXu"9r]Xp4\@<2654&#"#"=432632#"'#"=43232654&+"543"AWQ>:Rx6>N"M6x.)=1.133%3#"54;2+32#!"54;#"54;2+3#"54;2+@6.,66.)O35)"54;#"54;2+3#"54;2+3#"54;2+3#"5&Z[[J-3##"=32+32+"54;32654&#@UvmP6);U^A ba_I34J Q30932+"54;#"54;2#32+"54;#"54;2+32654&#ee7UvmPe;U^A a_I34J+2!32654&#'32#!"54;#"54;2+;U^AUvmP66v"I34J)a_@@/72326=!"543!54&#""=42632#".54T "H.XuSCh((Jd7Y3# f7h5}&ZYD.pE)32"&'#32+"54;#"54;2+%"32654&s`fpspJWZSZ[RQ\Y9s~~ސonlq /3-5#"3##"54;>7&546;2+32+"54;6UhJr9UB9=@/kI66K$E-0D)gzkR 0a?]HDQr#.%"&54>;5432"&#">32'"32654&~~ $3K_@<0BH,)E8[~JhhJIig_`:HP-/&P#?,.WjkjJNkl(7#"54;2+"546373254+32654&+%FI Y<@ L^veo/'PC^)O IB$$*)r#"=#32+"54;#"543!--"M[O7(%765#"543!2+3#"=!#"=73#"M"ea·) %[[) O?H MS!#"54;532+"54;67'#"54;2+5#"54;2+7#"54;2+32+"54;.'32do#?Re0c#o#c0eR?##E.oAAo.E#g@%4.+"54;2654&#"#"=432632#"'#"=432326 A-D0PDJ89H4UJa. oU`=Z@BXu  ) +("E.@b  (9K6 S"14A3%5#"54;2+32+"54;532+"54;#"54;2# -x""x--w!"xx3+OA&XF(3#"54;#"54;7#"54;2+32+"54;'_66_/-OX*7325#"543!2+32+"54;#+"&'5432"M""x-J"A7O>4%,32+32+"54;##'#32+"54;#"54;k""m"}~(nbwOOA3!5#"54;2+32+"54;5!32+"54;#"54;2# -**--w!"xxOHRA%!2+32+"54;!32+"54;#"54\""x--w!"OOFSTFf!#"=#32+"54;##"5f-.[P[3F%\F`="+45#"&46;5#"54;32+32+"543";3#32654&F\~}]F6^F]}~\F6LfhJDlDDJhfzyeyzbIFbSbFIb3%[5')"54;#"54;2+!#"54;2+3#"5r"-- "m"8OO`23275#"54;2+32+"54;5#".=#"54;2#>&H "m""m"%A-"xx # P3%3#"54;2+32#!"54;#"54;2+3#"54;2+A"m"! j""m")OOO L5)"54;#"54;2+3#"54;2+3#"54;2+3#"5# k##k""!k!>OOO@#32+32+"546;##"532654+@%:@<@ #p›2$cIf> OZ#%S N19%#"54;2+32+"543#32+"546;#"54;232654+-x""x*:@<@ pB2$c)OOIf> O#%Sl!#32+"546;#"54;232654+%:@<@ #%q=2$cxIf> O#%SJ,723267!"543!.#"#"=432632#".546^ #O3LgeM?\=_dc>n6 kXGJ[7([ 7c`|+/ &07#32+"54;#"54;2+3>32#"&"32654͗.."x.[`^Y(nnNMmOWw_\s#jkjJNX'/%#"&546;2+32+"54;532+"54;#";X^9A<@ "$r$.3#bI32? O"&S?l&C6?\&j+i\D%+"54;2>=4&#"32+"'54;#"54;5#"54;32+>3231A@$&D7$ -.666_D'D[%9O% @-,:  "6_(!K@rb'J+%#"&546325432#"'.#"!2#!32762"7Y0cd_=\?MegLlN  X "#|`c7 [(7[JGXH gV\pL\["jFpM"6+332+"54;#+"'5432325#"543!2#32654+`\9A<@J<"V3#bJxI32?O>;7"&S<5=32+"54;5#32+"54;#"54;2+35#"54;2#32654+^d9A<@ !cc! ^^3#bRxI32?O"&S+'\>%4&#"32+"'54;#"4;5#"54;32+>3232+"54;D7$ -.666_D'D[--,:  "(6_(!K@Fb&Al"C63F%\&|>)!#5#&54;#"54;2+!#"54;2+32D0""x--w!"PPOOD4>"&5467#"4;2+32>=43232654&'#"4;2+#"&'D[ m1#K,*/ +&,S!2n^H+@A{:#((7p -$ "- m;#((#;t(!+(B8`#,32#!"54;##"=35423#"&=#32654&#ƧUvmP7d( `;U^AKa_6_00_ 6I34J-732654+'#"=354323#"&=#32+"546;қ2$c _:@<@ #)#%S&O00O &_If> #<@L%2>32#"&=#32+"54;#"54;2+354632542#".#"32+"9 &!>/`DWZDr`p( 5#OYm& )#$h kEp${][ O32%#2+"54;5#32+"54;#"54;32+"54;'#plk"v6!i%y%u%8l%ۼ O2%'#2+"54;5#32+"54;#"54;32+"54;'#ljk"s6i%y%u"2oƉ``O``3@D7#3732+"54;#"54;2+3#"54;32+"54;'32+"54;57#p:_6&((},m-%q!8l k#pl&*%P448'&543!232+.'32+"54;5#"54;>737#n&n&11" 85?3d3?588=U(^<#=]C]r99r]Wp4,&2/37'&54;232+.'32+"54;5#"54;>737#XXD?8:FdG88!7d(H!ORaM  Ie[H3wP36:?C332+.'32+"54;532+"54;#"543!2'#>7#737#d1=785?3dFPWY-<+}(^=4oW]r9 fp5? &>6:37##>#"543!232+.'32+"54;5#"5437'#$(HS%_tXD?8:FdG8EG*wc$-N!ORaM  IeyyJ3!"F-\A3%@"2N6 J3!#"54;2+33"=# MO(  [J!##"54;2+33"=#PF)Am(,xx] J&lJ]&D&')B+(r'*')(i5432%#"&5 > d~ Ie~ Gi UnH 3n&H2267632"&54 32+"54;#"54;2+5#"54;2+3#"=#"54;>-wD \wAn5H%5#"54;2+3#"=#"54;532+"54;#"54;2#2267632"&54 -x"=i--w!"x$>-+H'32+"54;#"4;546232#32654&#UvmP666  ;U^Asa_(L L(I34Jl'732654+'5463232+32+"546;#"43қ2$c) --:@<@ #-)#%S+ +(`If> $(+344632654&+327'#"/+32+"54;#"54;2  H?U;>  I(466PmJAc I&>3I = J_FO3@F<$4632654&#"327'#"/#"'32+"54;#"54;>32C  J?fLJhhJ,$D  D2!32+"54;#"543!54266( br5432!32+"54;#"543--"[O>3$32+32+"54;#"4;5#"543!"=!6556((@(ybr%5#"543!#"=#32+32+"54;5#"43"MNN--*!W((>0322326=4&+32+"54;#"543!"=!32#"&546W..;]A:66(ƬUwV>> ' A3e4JbaFk?X rD32326=4&+32+"54;#"543!#"=#32#"&546 ..;E9Z--"MVN^V>> A3-1O??X nP3Q%#"=#.'32+"54;5#"54;>7'#"54;2+5#"54;2+7#"54;2+P*5?3d3?589=2VdV2=9)w]r99r]Xp44pX nMU%#"=#"54;.'32+"54;532+"54;67'#"54;2+5#"54;2+7#"54;2+MUR?#o#?Re0c#o#c0)w.E##E.oAAo\S@R2654&#"#"=432632#"&5463232654+5&'#"=43232654&+"543"AWQ>:R ,.X5bDF]XI=7;21B<-g;YB+BG6F^;$  B >p1DI75@gSV232654+5&'#"=43232654.+"54;2654&#"#"=432632#"&546,.M5Z@BX A-D0PDJ89H4UJa. hQA,#> r B/ S"14(  ) +("E.@b  (7J;$ $n538%3#"=#.'32+"54;#"54;2+%#"54;2+SI76L3&J66J"v.DUD)w;]6+  :cFn*%3#"=#"54;'#"54;#"54;7#"54;2+Iu_66_/)wO$43@32+.'"=#"'32+"54;#"54;2+35427#"54;2+Lq'8X"`B(J66J8(v1yvqzIZa;F4%32+"54;'"=##"54;#"54;35427#"54;2+-(_66_(l/֭~AYObFl$43B32+%#"54;2+32+.'32+"54;#"4;5#"54;2+QQ"v.DUD8X76L3&J6;;6J(g :cE;]6+ (3F432+7#"54;2+32+"54;'#"54;#"4;5#"54;++/-_6@@6_U(=(#438!2+%#"54;2+32+.'32+"54;##"5J"v.DUD8X76L3&J6c3 :cE;]6+ [ *37#"54;2+32+"54;'#"54;##"5 /-_6cO[5n'35%#"=#"54;5!32+"54;#"54;2+!5#"54;2+'~66-x66x)wRn5%#"=#"54;5#32+"54;#"54;2+35#"54;2+i--w!"x--x")wO5k35#32+"54;5!32+"54;#"54;2+!5#"54;#"5Ac.66-x66 RV5#32+"54;5#32+"54;#"54;2+35#"54;#"5,c"x--w!"x--xOd3?2326=4&+32+"54;#32+"54;#"543!2+32#"&546..;I5`.66-R\IcV>> ' A3'7N9?X DI?2326=4&+32+"54;#32+"54;#"543!2+32#"&546p,.;E9X"x--w!">"TN^V>> A3-1OOH??X ?|@19"&=4>325432#"'.#"354632#"&576=4#"Eh "2Z9eHgCSvZ7029  )B>fS7J<+Ep.DYGZ3?9.SXb 2O>IT|/5".546325432#"'.#"354632#"&5764#"HEe3d]?]?Sg+S:7029  )B>*FF&c7 [(7gR :8"D3?9.gb |I?e@<2632#"&547#"&=4>325432#"'.#"3267632j  1$(0f "2Z9eHgCSvX4R( W3:{   0eS7J<+Ep.DYGZ*0 &K !)"Te82632#"&547#"&546325432#"'.#"32762j  1$(1 bd]?]?SghRmN  P;:{   0|`c7 [(7gROeH ; !)"Hn3%#"=#"54;##"=!#"&=#i )wIrr Izm%#"=#"54;##"=%#"=v.tdt(wO[[3%3&%32+"54;5#"54;2+7#"54;2+Biio&(n 9:'#"54;2+3#"54;2+32+"54;)AD)23#Oe{3%30%#"4;#"54;2+7#"54;2+32+32+"54;^^o&(neeii( (8:132+"54;5#"4;#"54;2+3#"54;2+32#B23aO)AD)P#||(sO((n035%#"=#"54;'32+"54;7'#"54;2+7#"54;2+0u>@n+-o)w3n%5%#"=#"54;'32+"54;7'#"54;2+7#"54;2+%uAD o.0n)wn&3+#!#"54;2+3#"=!"54;##"=!#"5d6.JfdD w[ +#3#"54;2+3#"=!"54;##"=!#"5"d"m"8"cDxO[O[Jn33%#"=#"54;5#".'5#"54;2+3275#"54;2+~6 E%!.4x6sK)6x)w#35`n4%#"=#"54;5#".=#"54;2+3275#"54;2+^"%A-"x->&H "m")w #J39%675#"54;2+32+"54;5"=.'5#"54;2+542<=#6x.6 5 (>N x6 `(-ZY"0/j`:%"=".=#"54;2+542675#"54;2+32+"54;5B(%("x-N(8"m""m"8799J31>3232+"54;5&#"32+"54;#"54;2+ E%!.4x6sK)6x.vB#35`2%5.#"32+"54;#"54;2+63232+"543>&H "m""R%A-"x) #O@<%54&"#"&=#"&4632#";54>32!3267632[vv 4T,f&%;9% !%& "2Z97Y3# EX4R( 3 YY &+ e4R7   7J<+)32!3267632#"&'#"&4632#"3hv fd6 Ze` nQ/b  D`%;9% !%DRQESliO_ 8|[4R7   e@N%54&"2632#"&547#"&=#"&4632#";54>32!3267632[vv  1$(0 f&%;9% !%& "2Z97Y3# EX4R( R1:3 YYF   0e4R7   7J<+)32!3267632hv fd  1$(1`%;9% !% Ze` nQ/b  D1:DRQP   0|[4R7   SliO_ ' !)"q3,P"|ql M_"|$3>2326=4&+32+"54;#"54;2+%#"54;2+32#"&546 ..;WGJ66J"vK[qV>> 3 A3e:D\Kk?X FD42326=4&+#"54;#"54;7#"54;2+32#"&546..;E9Z_66_/#N^V>> A3-1OH??X 9n'3-7325#"543!2+3#"=#"54;##"&=432b! /QI~66$:P'wB%'*"Xn,7325#"543!2+3#"=#"54;#+"&'5432"M"=i-J"A7wO>593723265!32+"54;#"54;2+!5#"54;2+#"&546,.;6-x66xV=> A3:?X R972326=#32+"54;#"54;2+35#"54;2+#"&546..;-w!"x--x"V=> A3OX?X 5n'35!32+"54;#"54;2+!5#"54;2+3#"=#"54;6-x66xI~6wAn5!5#"54;2+3#"=#"54;5!32+"54;#"54;2# -*Eq--w!"xxwOJm33%75#".'5#"54;2+3275#"54;2+32+#"5KQ F$!.4x6sK)6x.~(#35x`n4%5#".=#"54;2+3275#"54;2+32+#"=%A-"x->&H "m""^) #w nQ3.%##32+"54;#"54;32+3#"=#"54;#F.J"cd=Ja\w4n%.32+3#"=#"54;##'#32+"54;#"54;k"=^"}~(nbwwOOq332#!"54;#"543!2#@?  O&f|qHY&| O&fjrH[&j N3 B+&k|q?\&|2@)%265".=!54&#"#"54>32nvv7Y3# X4R(  4T,f "2Z YY)n3%#"=#"54;#"543!"=!_56()wbrn#"=#3#"=#"54;#"543!Hu-"M[wO Q"jp N["j\@<32+"3267632#"=#"&54675.546325432#"'.#"60=IX]FDb?jZt;3'1iOV<R:>QW7@57ID1pH^I6GB+BY;g-75'&46325432#"'.#";2+"XB@Z=`Uo .aJU4H98JDP0D-A u(41"S 6K9(  b@.E"(+ ) 993/23265##"&=432325#"543!2+#"&546,.;6$:! /QV=> A34B%'*"'?X X9.23265#+"&'5432325#"543!2+#"&546..;J""M"V=> A3>7X?X 3%@4?FGTD3::Z-<3I732+"54;#"54;2+7'&546327#"54;2+#"/32+.'J66J#  )V"v|*  2.DUD8X76L3&)h  $@Z(  ,b :cE;]6+ F=3#"54;#"54;7'&546327#"54;2+#"/32+"54;'_66_U%  +7/X+  1R-OC  %+E% +A)oD39".'#"&5#"54;2+32>5#"54;2+2/83 0Yn#KYC$9"L" y =)xTNE^'/% N2! r)7C+4&#"!2#!32+"54;46232+"54;]ACYtL#qo#fxHZ^DmOVuuV9+FD +272+32+"5473'#"&5464&#"3264R- JJ6fCo]}~gKLefKLfD%3?.*mZ{[]yJbbbcQC2232+32+"54;4&#"32+"54;5460K)YY#k[B%;!f#pC"1<,mOD^'0# 99Wt"03/"&5#"54;2+!2#!32>=#"54;2+'Xo#KuYC$9"e"pySNdE^'/% 99Wu"6B (#"&54632!"'"=423!24&#"326&kmlm7+((!Av8zZ[z{Z[y֎kl#t8(HZxyYZxy:3#"/!"54;#"54;2+!!3 F__7&Q ; Ed)Q )1C$4&#"!2#!"54;46232+"54;]ACY~6#qo#fxHZ^DOVutW1 T?1<4&#"32+"54;4>3232#"&##"'&5!46#32765fTOkK# /W7Z,'-0_5 %2/&wBaiM;.A5&sP69R)h$c T4$+*P5<3 ."&54>;5#"54;2+32+'2>=#"Wp"1<-`"__pW$9"D^ZxW.I) Wu)'/% ZCE^;31>3232+"54;54&"32+"54;#"54;2+ "H)Rq#fZ[AA"b !yR%%C_^0?2)"54;#"54;2+!542;bbb* 5P37%26=#"54;2+#".=#32+"54;#"54;2+3s4L$fYO64n#f[LF\Wo)Q8dXJ.&<  #!"43!2#"&546324&#"326 s0kmlmgzZ[z{Z[y' (֎klZxyYZxy)132%2>=#"54;2+32+"54;5#"&=#"54;2+,,B -y##:aYn#KY&80BLxTE^k;#%4.#"54;2654&+"54;2"5>)ASQ0Eg9(b(%+84)5O<+D/\5AH*232#!"5432;27>54&#"32+54632;&#"F6v54( 4>Dy^M]ox`fLMN'> ?#XU5YK'0' *@^xbN(&^}FGVEC#4&#"32+"54;546232#'"4;]ADX$p#qoJ4xHZ^D11XsuV(!94!()"54;#"54;>;2+"3232'4&+!%!:JK;6$%vRv>zYGwU>O(8-rQ@ZK4/".5#"54;2+32765#"4;2"54&+ )6.#KW=S/L_("(G ,I-NAbY+N*|+',<1#Z]2%4&+"4;2654&#"#"=42632+"543!26g1\_1QT5*= (>OIj9&.ED2A%7;\(<+0@^0.XA(E_/3N8:3)%#"&5#"54;2+32>=#"54;2+%O6OnX%W;)>M"32#"'.54632'4'.+"4;2"=&'&#"D*H'! 4T,mG-'fbM).2:<6(8I1M*  &  ', G-RFgH<# (/*+$2?-Y*2C%463232+"54;4&#"32+"54;hpXVn#K[BCZL"xSxtWOHZ^D+J$0#"&#%&543237"&546324&#"326 !lGW$bab)mOPlmOMog/& /_'dabaPijOPjk?C64>3232+"54;4.'32+"54;"32+"54;W.[>\s#V ?,#o#CV$o#x#A@'qZO-8'Z]D9@H4*432#!"'"=432;2767&#!"=4;2654&+!2>>g1* '=[' B%D9[8%0|X.2U>:&)]$$.f\/>8d6Ne NC+463232+32+"54;4&#"32+"54;^pXVlPP#K[BCZL"xSxtW1(OHZ^D)13(%2>5#"54;2+#"&5#"54;2+,$9"L"pUYn#KY'/% NWuxTNE^ '4/32675#"54;2+32+"54;5#"&=#"54;2+|XA;^"e.^>_Tp-pWK]W7*T{V&\@6*2C$463232+"54;54&"32+"54;hpXUo#o#ZZ"xSxuV11HZ^DAR*4%2654&+"4;.=4632+"&543232654&"e=xXnnWzC8VonYNaFG`H`clruVX?5''G[\`K\GE]KD#52#"'!2#!32+"54;5"4;5464.#"32>K[tuWqBdo9\\| 56Gb*>2.D#DlQTiX(JK([p+? RA+? -.3%@2Z<,3:%#"5&'#"=4325.547>;2+"4&'>.[>Y9X9PX4>8WX $="A>A>IL>W66":r0@AB237RI-2 62 FZc.v`n[2632+"#"&5463j0 ?|&  A-. 4- /C?S 432#"54623254#""5)4[F  1:I8({3,WT ,078CL'763232# T  2L#T  2 Q1"&5#"54;327#"54;327#"54;32+5#"'73#L#45#L"28"K#L54@ 6N  *S,S)8DD4B-+2#"=4&#"!2#!32+"5473#"54;6JC]L1;[d59_FbNRk1Ah7Wa+BF!,232+32+"54;5#"&5464&#"3264R- JJ9dCo]}~gKLefKLf%3?.Z{[]yJbbbc!BC7232+32+"54;4&#"32+"54;#"4;>/%:"[[.qA5!</."K!<!) 3< $T*A,0<$232+5#"&5#"4;!2#!32754#LRaMB#*2#"'32+"54;#"4;6.#"!326Caz}]nD88aJfHJe` cBAb}Y\zZ*KZF]\G(;532+32+'2>=#"Wp"1<-K#`_pW$9"D^ZxW.I) Wu)'/% [CE^5B=-232+"54;54&#"32+"54;#"4;6C&; #n"B20C)."KM!* /902A*MIB#!"54;#"54;!2jXVB==3%#"&5#32+"54;#"4;3327>?#"4;32+5%7#"4;32+"54;5.C #n"C1#:#L/I"2'p/9$*K5<-232+"54;54&#"32+"54;#"4;6C&; #n"B20C)/.!JM!* /902*MGOa&2%+5#"&5467'&54;'&5432+32'4&#"326OLEwblQC_BsC_}#glN[cmOPlP``X{ H = F_NlrHOjjBBR/232+"54;4&#"32+"54;#"54;6M+? U+>.()..#LM!1(=-8 #T=MP<'%#!"54;#"54;546;2+"324.+3BAA51?NQn(%7+PU>T(m|S1H!6)=,46;2+"32+5#"&5#"4;3275'&3 c7`ROM]B2#!"54;#&=42;2w0D(&DFF$ I BQ;"&5#"54;327#"54;327#"54;2+32+"54;5#"'73#L#35"L"28#o##^54@ 6N *S,S8DDGB-%32#!"54;7&+"&=463232654&#"&wV:%/acb=#lP)C' -F#&<+$aQ- B/:Pj)1&5 1232+"54;7654&#"32+"54;#"4;>M,D PUPF.4@2/."K(F+$ '/(:T*>(%,%+5#"&5#"4;327#"4;32LSbM?F2Jy$#!"54;'"54;XX((S BP<7232+4&"32#!"543?#"&5#"54;327#"4;673#L#8@ nn4273#L#35"L6N D*31;N *S*;i e(2#"&#"32+32#!"54;#"54;5469fb$0@dYYZe -)?T?9GHRZB<07>.54325.547>;2+32+"54;"4&'>CzX9PX4>8WX $="nPdZA>A>IL>WWB0@AB237%J[I/0 62 F,<232+5#"&5#"4;32754#LRa=#"&546;#"'32+547'&< :?5 ^| ;>5 ^| 8,~  d6| 8,~  f4|<0232#!"&5463!4.+"&5463Z 4 I ('%    %&(  -3"&54676754&'.'#"&546;2#"/^5S #)I Q(,$ V$4# `'%   #>)   9*<!"&5463!2+#"&5  Y     ] < &74632#"&!2#"&5.'.'!"&546_   +JW   #'   PW %&%   @"&5#"&5463@  Y 4   #"&5463!2+"&5} $ ~     ] <*2#"&5.'##"&54>7#"&5463}'-    (%&;  W #>) %&%( :  3/  )3".5#"&546;32>5##".4?3#135 ^ ($'j$'( ^s  ~ !G2  &%(  (&% ǧ@"&=#"&5463@  Y    <82#"&5.'#"&5463T13   ($'  !G2 '$(   <%2#!"&546;>=.'.'#"&5463T'- MS &%(  %& #>)NY   (&%%'   <i!"&54?>=!54632!  I  +  ~ u-+< !.'72!4?#"&5463hi (%&'- E*K h&%( )#>))*K  <02!"&546;.'#"&5#"&546;72326kR_  ($'eh    :}.H_  '$( h    uu8@"&5#"&5463@  Y l k  32!"&546;4.'#"&546*IX (%'$ OQ  &%(   <.754?#"&5463!2+".;76=.'a*K %+P 13h &$I (%&o)*K  0(O "GAhn&% I&%( <$7#"&546;3>7#"&546;#!"&5463B] I8 %""V ( AR )  I3*  TP  <8*2#"&54.'#32+54?#"&5463}'-   ($'eh *K #>) %&( h  >)*K  <32#!"&5463!2>=.'#32+54?#"&5463}'-  $%&(  ($'eh *K #>)  (&%&%( h!  =.&K  <875#"&546;#"&5'5#"&546;Y  YZ   Vd "  F2"75#"&546;!"&5463!55#"&546;QY 5 Y   UT  R"  C18%3".54?6=!"&5463!#"&54632 ] -a     "  7"7  <!2#"&5.'.'!"&546P+JW   #' PW %&%   3:032+3267#"&546;#!32+3#"&546\ 2Q?6 "2 `' <)^ 52   r0P  #3  r  *2#"&5.'.'#+"&546;>7#"&5463}13   $'|+ $0)Z  !G2 %'# ˂  !65  Z"&5#"&5463#"&5#"&5463  Y P  Y 4   4   Z"&=#"&5463!"&5#"&5463  Y T  Y    4   Z"&=#"&5463#"&=#"&5463  Y P  Y       ;r\3"'^<4\$$;\ 3"'73"'^<4^<4\$$$$fl(#"&5472654./7sRSt ^]%8:2#K8CQ]\R+9,%BHHB*63'SWjl'7"&54>7&54&"&''657324.'326^**pr)4X&2#$ (0l"$"0F@[DCZ.1@! 9,P[[P-E%="G ?D a[1*'.(*++FBEF]H"3#"&5467654&"&54624.'326yVWxJ;f9P8!MnM*+$#-0 851cHGdTa`U=^~(89''(6NN6 % (9#$>+(:4 '5'ELL5B#'3#"&547&#".#52.54632632'"32654&#VKEP( )/DX>f- <Ǘ05)Y@5*)3EU>@^USC:AEJHG!-9$G192105) 47EHS( /4J&Al!.:27"&54>7#"&'5>26=4&#"4&#"3260QUFaec* %5HJ3":6&.,,cP76ON78OGRH[ ?bEFdcG!Ei I5,3K-7!&5A/0@7OP67ON@d,'654.#"#"&546326324&#"32()G+ +F6FOHM?+#7>A>46<@1r8S-IV<1*)/3O8bFOi..m:6ML71Cge&'654&#"&54632G ?f;=d$ G{JKzQ\ QF:ZX<%S WVIoncH'%4&'#532654&'7#"&5473265W00?1G" 4*;#vSTuPC`EDb(=N$G1, 8(.QZNRbbRTA5ECMMC5#@'654#"#54'.#"#54&#".#"'67.54>3262632#G@>##?$ >c@VGZ(z&;U9A*+`,b+m^[\{#RIWJ{H  5,>, # /J14&&&&fl'#"&463254&".546324&"32hGHggH[0__!tRSs$RrRQ:9OdhhGALMA,&Pb`QrSR9:Qcl+#"&#">32#"&5463232674&#"3261WK0EK(IggIHfZ>K%0QR:7TR9;QOE0 %ffgH:>[ 9RT7:QQ:e#'654&#"#5&#"&54632632E>.60 #$56.>ECEA((CECUaXJ;P!*0R^\S3<1*CHIC8M$-%&# E=3ID0HN]H14.'>73267#"&5473265#"&'7326B' 2+2J-xUWxN AcHFc:IM7:E$0-(80# ')Sb`UTA 9AFKLE& 7NM</:85d2'>54&#"#5&#"&54>765363262$"050 #"7d>E6VWY#$^I\5A(&D0S4!&>9R=:`cSMq@+,(WKuF88fjl"&5332654.5463"qq$\BC[ 4(7! P^^PAIIA /!&#$%  75D#i (>%".54>7&5462&4&"24&"24'"&5472>#6dd6&K5!:P:"%4%%4%$4&&4{ :P9{.WvW.>m_88_m>8\X?-'99'.5a4$$4&w4%%4%;(99(;7_U22U_5H#>"&5472654&#"#54&#"#"&5473267>32632#nqPB]Z+-#3&(8E'!-!0"2-AV]^UX>:AEJIFb+) &5>)50 %+&!.''@-4H$8C%26=4&#"#"&54632632#"&547326=4'52'4&"326D7%/RIKVVHE*);4KB+kZUs # ]IHZSArB@;:@0-M&6*+8GliJIh//L4ML!A:X_ZS"( !GHIG%Z$y:SS:=RSbL&"&547265#"&546;&'>tuMAb`+>@+8V?GT]^TR@7@DJIDv,):,@5-  ,5B#6'>54&#"#4654&#"&#"&'63&=4632>32#+,09('9$;&(9QC[+ p 78\N7K'=#7N!;Y./UJ'89&X&98'EHxqS J}E6MA#M6hH'"&5473265#"&547326=3lpO! [GHVU'@cMN10g$U\\UQB5%FGFG"1R@>M/1=X/Y@l*5"&46324&#"#54&#".54632>324&#"26opoQk0.!0 #<+)<-P9K(7 /E%XCBZZYO\\\C!/@59I*;<)*-1$8Q>!EWAFG@AFGjf*"#4632#"'632'654&'4&#"326,EY$^C5LgA-)=aTn$!!\7%5H++2Q^3DvK5?ORuTIMKCA]%7`6:5G#632654&+5232654&'.53#"&547# mlKS;$ 19$#" # '5,"N\3?7N)ocI54&#"#4654&#"! &54632>32#Q1"5#4 5=F1B"91FjrI)$"1. / , /*&V 1F: F@LH HT%'#"&546732654&'5#"&5463254&#"#"''65332632673'.#"32 o3B~TVH;hqGEiA4P72EF16Q#- *$'!'8@![3g&)"21#2dR4PUWQ;N ZBB@A1<IE21FO%:E\U:'Kh1/&1D1fl"&5376324&"26ss$v(Rt$__]]Q__R bPAMLADII2H&]%32654'7#"&/+"'673264&#"?'.#"&546327654&+532T   ;Z3#. HO,=G296+$#23" ,)G=,$ +==#+ ( #J#4!A E,2G4 2F2.z3! ( &>+>$-c $,<jlG2#".54732654&#"#532654&'&#"#53254&#"#"&'73>/))77#;A#1S>A13@^6@ & j)$ . gH 2 9:$7#2 5= &C&8A2>4%+ /9&8$)'$6+D.r*Zf32654#"#"546;2654&#"#"546;27>54.'&543232#"&'&'#"&54>7>32>54&#"'4?0;R= % K0* &  ''/ !$4+,$%eGNo  !w4 .HTM09Ag<(F:m '( !5#34!4"OFY!]  r. =4&#"  s&.U;54&+5326=#"'7327F:8G4W`4.<9+.TN/Z@F%NpTVdhg]`h@kb;8T-  &H1@\ lNuHm8#"&54726=4&+46;7>54&#"&54632&#"32jMLkJ=VzVJ4& -;A)1@C.%50.*#7W,$4!KZYKL=1xDE<&4J =-(A?1.C!/#*U7)FUWk,5##"&546;5+"&546;23#3'54&+";5#"26_bDE`bD0_4HH384H___4$8#44$_06MLlLDbaEDbXH43II3X$X|X$45#%3ނLlKK]8Xe HTFc{0+3'+M35H37?3 97"3264&7#"5432654&#"#"&5467>75#"54;2++>=,*>>Yw^MmlN;`/LCY\ M@)2+#"&5463232654&#"542654&#"$3- Kt`fpscdoJS[\RQ\Y3$'7s} monlq\p%32#!"54;4327#5@ ;)ohhH@C32+#"'#"=43232654&'!"54;&546325432#"'.#"g*1tZj?bDF]30dTiOV<R:>Q0 A+$GI^Hp1DI7,/#WBY;g-54#"!6-Y3U{yWjghR:+424:!<F"B2 29gly|W[B%AfED;J36%2#"&54654&#"32#!"54;#"543!2+632326 /<2;#(?%2,7B"  .7Dx)N+&2&3,"&543232>7#"54;2+#"54;2+&6  $-n*.p:SF1 .7"Q 'gg O3$TG3-+3(D3"*37463235#"54;2+3###"&264&"yP83K.HKˠT,L48'8N99N%pPA1/2CN88N8h@-2+>54&#"#"5463232#!"54;#"543V=Q^FR?]kYvbon<n_KISH7(*[[a=3+3#"&54623>=!#"&54623>5462!54&"=5()7  !!3()7  !ts=\]j%;8& "%%;8& "$UttIC]]Ch3%%32#!"54;#"543!2+35432#"=#7?)-->3 4$@6?72327.54323265#"54;2+#"'#".546654&"y 03'-!)ac)!-'5J .#1881*539> J+#H9669HCu8:@LL&"%WVwOnVUoOD3 3#"54;2+3#"54;2+# z<m58mDj98n>Cmp $ B3'5.54632"54&#"#"&546324&#"32> 6 ?(1E(.  $%&AE(ZoccXS[R?\`@+A":96&*$Q:(9'(1L-C_/^_Iv6MHT&0H3)2#"&=4323254&#"32+"54;46SPmOQ1N?tU;>W6m3_FK\9:,0!%~3I<+z;U@@:%4&+#"=43232#"&=4>325432#"5.#"326=):U'@G%f "2Z9dJhCSvXHb$=--P14Q-eS7J<+Ep.DYGZS O3,!##32+"54;#"54;32+32+"54;#D."m"cd"m" 2&C5%32#!"54;5.##"=432254&#"#"=>32_!-$#/"V326541# #</>5->N1 D^-O?" &-& ("2'%4fLXDc&:G<<+0B!-9C8ZU@%1%#"&546235#"54;2+32+"54;52654&#"s`fpspJWZSZ[RQ\Ys~~ސonlq3%33!32+"54;#"54;2+!5#"54;2+32+"54;6-x66x.6J 3-"#"547675#"543!2+#".546232654&*#839>\t~c/Z7"  NlRhg\\}]`|$!  HeORg*.30732>7#"54;2+#"54;2+#".54;2#PD #)n*.p8U#"+nï5*I'ei j^3%@.93*%275#"54;2+#"&5#"54;543232+:IIKZaGTJJ>"4C8 ww&.?2@*D<*7267>3232+"54;.#"#"&5432h(E0&C Pn$F/0(A),4'b(>51S,:8.+;2"J3g3=J3A4>3232#!"54;5#".5#"54;2+;54&#"32+"543V2L-No_ .)%,-%="V<!>'-1CkJQ 3 $0:R1%R@ 572654&#""&5463263232632#"&54654#"S[\RQ\YTfpscKe2,<" $(&@@onlq)}^Q)F+& ,9Q *$H3!%35432!54323##"=!#"&=#A8  )Irr IIrr I>=6"&54632#"'#"&54632327&54323254&#"f:Kj"UBO7MNL %%2@: (:R:#5A{UR9 k6w )D&]dM2Uv^j5#@/8"5432654#"#"5467&#"#"=4>32632'2654(&v'-!)ac)!-'4 0"1881]EB9>+2H9669H+@",LL[MCCwOnVUoO O@.:"54>54#"#"#"54326;23&54632632'654#"32'p9}</  o\Q"'/+!>"+? :9)%G!(%3, GQ >=B23267&54632#"54&#"3254&#"#"&54632#"'#"&546y %%2@ 6"%3/61R:#5f:Kj"UBO7MNL )D&]d!'E[]EAQ/- )]^I8^QAN;g-<7010VnI (03 )#"&5#"54;2+!5#"54;2#!3265sTUr"J32#"&'##"&5463234&=#"54;2#32654&"!"1LT ;'AJ("<1GlpW67 14 $68"!3+T "#"#(jOugIAO74([wJu7:3>H>7MA/ /(+26' ;:T3"%32+"54;5!5335432#"='5#6KTOx/+}(*+2\35%#"&54623275#"543!2+632#".#"32#!"54;$ %R )/?&,L   ,P &'&R $L D >H%4&#"326'>7.4632>32#"&4>54#"632#"&544#"36,8%$98%)4[ '"(1+$ -) $C.UQ20Sp!76D64S2%%B(#%  -'* )LE?AE;>Bw&23;7"54;2654&+32+"54;#"54;232+"54;4.//JhU6K66Ik+ 9@+*D0-E]?a0 ).N*+K-!2%3#"543!2+3275432#"&5`(UQ0 A41tZj?bDF]4M[M4iO9@4B1# $GI^Hp1DI7*4?2BY52;3&%"5432#"&5##"=!2+32654&;T B.UE8`1>8:<M6+3!_fRTGA&'7H3$#"54;2+32+"54;#"=432rZYYZ f7Z3&!"54;#"=4325!#"=!2+32#*Z66f7b O39\@6)/@*3#"54>32632#"&54>54&#"#"54#"2654!)ac>a,C)O,>Q% $$47:&F9>95Dx33J,.L  #3,4`twOnVUoO2&@ ,4>%4&#"26&5462"&5467'"&54676264&"264&#"#""$"88D879B9 ~} 9B9#"$""$"$""#r!78@88%I0HH0F(sA#1QQ1$AZZA$1QQ1$C>//>/\ 88@87?@ !5432!"54;4632#"54&#"=`EU.B 8:>1|Rf_-(*5G?3/?@&<3#.72+ =#"&5463235#"54;2+!54&#"3#3265!K)+<8'%5JK$*.>=/JhhF2.CB/OO**!.)hLTTL4$@6?"&54654&#"#"5467&#"32+"54;4>32632'2654 03'-!)ac)!-'5J .#1881*539>M J+#H9669HCu8:@LL&"%WVwOnVUoO+332&@/32+"54;4&#"326542#".5!2TP>0L0#  ->0Ea(|T9I6%Lp_Oi2(<@a5 N>Ne &>pI(m&23#"=32+3#"54;2+#( h F b(03=732+"54;#"54;2+7632#"&54654&#"32+"54;766Kg:"$*-6J;b4"> ,B - +<3.(0D$#"&546325#"54;2#4&#"32*]@^~}]rBf`fLJgfKL=M5y][{ZqbbJIc L@:%632''#"&5463277#"/#'#'&#"326?3730 &0(( IHfpscJI ((0&   qQ\YT9=   <<<31@*}";02<<<2000f4lq&f/00#W@J"32675#"54;2+32632#"&'#".54>325432#"'.#8# (>'%/-k(!. >.: I=C]1+;4cC`$5+9!:(1 3A C6 -UdAHn?' 6[&69C1<F".54632327.54323267.5432#"'654&#">54&"*53 03&*'ac+"*#*X.MT5-.fA425= 7">&"%W J+#C8779C}`o=U]XGG12>K>24$T4t$nVUo]3%@ *2#"&46.'3267654&#",jgh/E(&@-zV4\/yW6]/F( &A@yK)11(02i>\.4l?6*10)3%C/:"#"54>32#"&5463232>54&>54#"!!"-BuBhR:+4!6-Y36b824:!< #3A #FK6Qr|W[BB"B2 29hEjV%AfED;H@ #4&#"6&54632#"54323264 $30' 0L08KgQV%ZED_]#8# U|32"&=4632#"=&#""32654zc8axyyS2S7KIBbcONd"(\Y[_^\f)VC1~UFGFFJ>=L"&54632#"'#"&54632327&='#"54?3737632#'3254&#" f:Kj"UBO7MNJ %%2@:    #(:R:$4 @{UR9 k5w )D&]dM3M + 3000+ %+ w`j>\#:724>32#"'#"=.5462654&#"542>54&#"S  "G3ZI)F=~gE4 5p4dj]*.<1CM  s/2T9'B JA]^*2  IMDFJ (-81A<35727>75#"54;2+#"&543232654&#"#'4&54R 8 2"ZZV[0>)H6PL&1 L4$G%,2\\|^?*6%_USf"+%{2&j5">3232+"54;54&#"32+"54;4632"54&5&F.FY--D7*7) -.hNFe(IAb.&O=-9!0 BZI3 1;@E2#'#.#"3275#"54;2+#".54>32776( : -01=- #/L0FIZaNn9'8J7)'+ /  >00+$ 4`?<(3"4/VeAJp<%  2%'7›t/#'#3'g{#37{#"54327#37 !{#&547537'$$  / - -+F # # 33F  g]]CF %*2#"'#&47362374&'>'&"'2/F > jk , lkP=$//#> !"""$!0#<9&gLRTMLK k* MO*o8n99WM*( #3'{0 #'#33g {H #5'#335'g:{%'#57'537oojinnijy/{{.Y.{{t#.4673t" }>0q/P"Chd/J/_ q/O:#3:g{t#.4673t" }>0q//0/5%dev[YusUvif\ #&54632\""+  +!!'#3<{'#&5473****< 35 ] 53 ij'7'Û淶X#'#7'7'77'((''WF # #33#F g]{]qi #'#7'7'ﰰ''Ûκ淶= '#'773=/L.M #'##7'337 (''< '#'573<~~~//L '#5573nnAЀ-|F #&*-##5'#'737533'''5'/5F SS MM '>sNSq=COtoUBgb`![[ ߥ=G9Gpdn #'#3735#'5'5#'~~~~j(j~~~~j(jg{͕͕~~3%4>73#4&'#3'8E5evXeAj>*Uqe e:3:4%#'5573'7rnnnnrrr--/݈#3gPV%##5#53#53533#3[ZZ\\YY[ tt !hh!Lk #"&4632k$#$<,,<,k#89 '#75'37oNooNo8]v '##73'0٧s3%&4>7.533>53#4&'#3'8E5ev[YudevXeAj>*/vifsqe eZ#4>753#5.%4&'>Z*\>Wn!/9,WmhBK_K^_Z?wYi?e:(jg[\ 8O3#~X$H8#~XD+"}o%"}sE+h3#}i%Q\#}RE+3#q%\#qE?S"vqTS^"v+"}k'?G"}sG+i3#}j'?]G\#}^G+3#q'?G\#q G+T3)5232654+5#"54;#"54;2#"&5464.+3265,.""a]A,#>  'Q5Hpq Pj8h.;$  ,. YYnH6}JhhKJhg\YM+;$  FhjLMjjKNj+C3#jY'?8G\#jNG+ :B#"/&54632!5432!"54;#"543!#"=!35432#"=#"4;2r  r =:>66ۑ\d d  k}X(v)K((?"C6q+ 9A#"&54?632!5432!"54;#"543!#"=!35432#"=#"4;2`r  r  :>66ۑ\d  d k}X(v)I((?"vq+C3#jY(?8#jNH+o3#k(?i#eH+S"|{?Dn"|+"}o)i#}I?2"q Y*?F2"q J5'"}o++'"} tK5Y'3#}Z++T'\#}UK5'"jj++'#jK5S'3J232654+5#"54;#"54;2+!5#"54;2+32+"54;5!32+#"&546T,./-x66x.667A,#> r Q/;$ +S'\D232654+5#"54;#"54;>3232+"54;54&#"32+#"&546R,.0.6_&F.FY--D7*7) -.A,#> r Q .&O=-9!0 /;$ 5f'3#||++f'\#||Kqq3#m,\np#jLq '1;#"&54?63232#!"54;#"543!2#%2"&4632"&46r  r  k?((d  d O((\#v+<"vz.?#vN+n<3#}o.?j\#}kN+<3#q.?\#qN?f3#}g/\h\#}iO?f"q`\h#q?3#q/\\#qO?C3#jY/\C\#jYO Q"vq0 Qs"vP Q"}^0 Q["}P iQ3#}j0 jQ#}kP2"}^15\"}Qm23#}n15n#}oQ23#q15#qQC23#jY15C#jYQ3% %=#"&54?6322#"&46"32654&'2632#"&#"#"&54632r  r  jghhVzzVU{y0 ?V &  AWd  d slޛ$\ar. 40- 10H#v3% )A2"&4632"&462#"&46"32654&'2632#"&#"#"&54632(([jghhVzzVU{y0 ?V &  AW((slޛ$\a|. 40- 10H"ju3% &.#"/&546322#"&46"32654&7#"4;2r  r 8jghhVzzVU{yd d  slޛ$\a^((H"C>q3% %-#"&54?6322#"&46"32654&7#"4;2r  r  pjghhVzzVU{yd  d slޛ$\a^((H"vq+"v|3Fq"vS+"}l3Fa"}S+M"}l5TZ"} U+nM3#}o5To#} pU+nM"qXTo"q +M3#q5T#q U\"}o6g["}V\O@#}P6gK#}LV\ CS2"&464.546325432#"'.#"#"'#"=432326#"&54?632"(&>JK>&iOV<R:>Q&>KJ>&tZj?bDF] r  r   (j!*4';P5\)6;-( 7(BT@e-=BHd  d g#}\ CT2"&464.546325432#"'.#"#"'#"=432326'&54632762,(&>JK>&iOV<R:>Q&>KJ>&tZj?bDF]  kk  (k!*4';P5\)6;-( 7(BT@e-=Bm  XX  g#}#\O"}pgK["}H"}l7+"}]WHl3#}m7+^3#}_WH3#q7+3#qWHC3#jY7+83#jNW(W03#jX8+X#jYX(g03#c8+d#`X(803#jN8+8#jNX(0 5M#"&54?632#"&5#"54;2+3265#"54;2#'2632#"&#"#"&54632r  r  %sTUr"J[CB\J0 ?V &  AWd  d LhhL0q::^"C>ZD"vq::^"vZD"j]::["jZD"}b::]"}ZoD3#}p:t:#}uZ(0"}];3%["}[(0"j^;3%["j[3%"}_<3F%\"}\g"jq=sp"j]g`3#}a=s`#}a]g3#q=s#q]+'\#qK+"j\W:"~Z3F%"~\H&#bDi#}A jO3#}k$H\#}]D O #0v$H#SD i#vzHn#vDO #C*#CgW a #1vHd#4 O 8<M2632#"&#"#"&54632!32+"54;#"54;32+"54;'##"/#"&47j0 ?V &  AWO6Ox%LGplj  kk  . 40- 10*l  XX  H# jO"j{?H\p"j@ O 04G#"&54?632!32+"54;#"54;32+"54;'# 2267632"&54r  r  6Ox%LGpl>-H"va O 15H#"/&54632!32+"54;#"54;32+"54;'# 2267632"&54r  r 6Ox%LGpl>-H"C$j O !BFY"&=4>7&#"&546;2!32+"54;#"54;32+"54;/#2267632"&54  26  8&(4!6Ox%LGpl>-H#Sr O 8<O2632#"&#"#"&54632!32+"54;#"54;32+"54;'# 2267632"&54j0 ?V &  AWO6Ox%LGpl>-H# jO"|q?H\p"|@+n3#}o(?_#}`H+ 'Jv(?#O H+"b(?4"H+#vw?l#vN #C:#CXQb #2v&X#(+ ):R7!5432!"54;#"543!#"=!35432#"=#"/#"&4?2632#"&#"#"&54632:>66ۑ  kk  0 ?V &  AWk}X(v)l  XX  . 40- 10?#+n"jqW?_r"jXq 'Uv,\#W qk3#}l,\ip#}jL3`%@#}a2H\#}]R3% #Xv2H#X R3 #vHn#vN% #CF#CSKb #2v0c#33% "->2632#"&#"#"&546322#"&46"32654&'#"/#"&47j0 ?V &  AW1jghhVzzVU{yW  kk  . 40- 10slޛ$\al  XX  H#3`%"jqkH\q"jl3U#vbHN"vc3U#CRbHN"CI%c3U #TvbHN#Yc3U#bHN"#c3aU#}bbHYN#}Zc(\03#}]8+a#}bX(0 #Xv8+#? X(u#vq+>"vr(u #C5q+>"C+r(u #Yvq+>#@r(u#q+>f" r(^u#}_q+^>5#}_r3%"C"|<3F%c"C(\3m%3#}n<3F%#}`\3% #Xv<3F%#X\3%"c<3F%4"\?G"I*?G"*?G"V*?G"c*?G"W *?G"d*?G"X*?G"e*OQ#I OS# ^#V% Em#c Ej#W Ck#d @#XE D#e! J"I."."V."c."W/."d..Mg#I EGg# ?Xn#VPXj#cP}Nk#WFWm#dO5F"I05F"&05F"V05F"c05F"W05F"d05F"X05F"e 0Hf#I !Lf#%m#V[m#c ]xk#WQyj#dR#X8[#e7^"I2"2f"V2i"c2"W2"d 2O"X2o"e2h#Ii#*No#VEg\e#cHuJj#W6cXj#dZqX#XrqX#efqH"I8H"8H"V8H"c8H"W8H"d/8Bd#I" Sd#.tj#VOxh#cSpj#W8Ksj#dQN+)"I>+)">+)"V>+)"c>+)"W>+)"d>+)"X>+)"e>Zf# 5h#cdm#dg#K1+("IB+(" B+("VB+("cB+("WB+("d/B+("XB+("eB+f#I"9i#"'kj#V"Yuh#c"cfg#W@"Toj#dS"]p#Xb"^p#e:"^?G"u*?G"*"u ." .5F"u05F"-0"u2"2H"u8H"8+)"u >+)" >+("uB+("B?9G"?9G"?9G"?9G"?9G"?9G"?9G"?9G";VQ#H 9;VS#H&9;~^#H@9w;cm#H9;ij#H49;wk#H:9;\#H'9;Z#H)959"59"58"58"59"58"59"59"8Hf#H868Lf#H868m#Hs68m#Hw68xk#Hh68yj#Hi68W#HP68#Hx6+8("+9("+8("+8("+9("+8("+8("+8("8+f#H8689i#H@68kj#Hi68uh#Hv68fg#Hj68oj#Hp68*#H/68(#H16?GY"|*?G"q*?9G"?8G"*?9G"%?G="J*?9G="@ O"|~ O"qP Sm#u yj# * 8O3#H6 U 3#"'&54?N@  5i`%#"'3326324u) 9$#/" M 3#"'&54?N@  5i`]2632#"&#"#"&54632j0 ?V &  AW-. 40- 10!+2632#"&#"#"&546322"&4632"&46j0 ?V &  AW((. 40- 10J((59"58"059"'5FA"J059A"ODp#u<Qj#IRm#u+Xj# 138%3#H6&u>I&G0#JIjY"|2j"q2f"s2&t2`0"J2Z"K2q"|~q"qPi#uj#04&uJ&!#J+)Y"|>+)"q>+)"s>+)>B"I:B":+)="J>+)"K>3%"|~3%"qPWg#u2Xg#3f##&54632#"/2"&4632"&46  W x  v   L  a&54632#"'  W v   +8(" +8("B+8("G+(="JB+8(="yBm#u%g#Pj#u">,i#&"F83#H6"q\ #"/5B  @5`i5+ !"543!2+H.H. !"543!2nW. !"543!2< W.uF 8X&BBqv #57632fva -qOWg\ 3#"'&54?va -\Oj%o 73#"'&54?va -oO2W\ #"/5- a\OOBqv'R.]W\&iV{&W\'V+|\47263543232+#"5#"|_d|\'47263543232+32+#"=#"54;5#"|_Q 2#"&46.'9:()9:Q:()9:R8VPP}}]T %2#"&546+TT %2#"&546#2#"&546T3%T  72#"&54632"&46:#"&54d((T(^y"4f #-7AK2"&46"2654& #"&547%6322"&46"2654&72"&46"2654&.@AZAA--->-,@ v .@AZAA--->-,.@AZAA--->-,fB/-AB\A"-@.- !-z  z  B/-AB\A"-@.- !-"B/-AB\A"-@.- !-Rf #=IT_2"&46"2654& #"&547%632632#"'#"'#"&46326232654&#"4&#"326'4&#"326.@AZAA--->-,@ v y";.@A-;" =;" =-AA-;""v3/-, -", -- ,, -- ,fB/-AB\A"-@.- !-z  z  4B/-A4444B\A44o#+- !-- !,-@.. !,-@..W\ 3#"&547}  \ iV\&aWV\''9W\ #"/FF  \ iW\&aWV\'9'[#"/#"&47,  kk  l  XX  ?8?632"'?     %%#"&4?'&462     =3  'I2"&46!2"&462"&462"&46762"/#"&54?'&54632o(|(((     K(((h(Ȏ     pj-9#"'&5463232+"&46 #"'&5463232+"&46-  -  3F **F **A 6%32+"&46>32#"=&5'&54632654&#"#"5  >?(PbG^ yP>=DU,,UE8L,) :G2?"){WBdR2326432#"&54yc754.5432#"54>=.*;;*)(  =,%%,= #VA"EQ]>32#"=>54&#"#"5%>32#"=>54&#"#"532+"&46!32+"&461-NR:YS@@< 91-NR:YS@@<  Q  SG;K*)D#E-3> )D SG;K*)D#E-3> ),,,,&Hj:F#"'&5463232+"&46>32#"=>54&#"#"532+"&462-  7 >?(PbG^XMP>=D 3F **UE8L,)D%E+2?"),,'j:F#"'&5463232+"&46>32#"=>54&#"#"532+"&46r-   >?(PbG^XMP>=D 3F **UE8L,)D%E+2?"),,i5!#"=!#"&547ul  f#LA O \%-32+"547#+"54;#"54;2'>=4&'@aHb>=byq\:MM:HHTC/V  W?a.   $HHf37332+32+"4;5#Ojj7  `'?  >  $>c(""&=32+>32#".5463232654&48 ,>F48,)/'$bF16H3('+t'2#"&#"632"&=463265&#"[< 8N,31440CAb7 )'"A=t \A7C4$ChINq(+/Z4f#"&547##"=3` ^ @ , 8n%"&547&5462&"2654"2654X@?Z?@;=T=G@#$>$$>*'D';+<<+:3'99'4p"('|.&%p "267&#"7.54672#"543232658G#${)3/940D@dG<"2Q8S.&44H5$ChJVnVBE+"=#"54;543232#= SSU` `VV "54;2#&$ t4632. C #< ((FCU/Zp4lNX254;54&'"32+"&54;5"&54;2>3232+"X&"Q ! 2 #(;C  ! 0'B@?{@Ct@;u@F@:@>@>@=@:@==<'b 8tP8NXK#/%232+5#"&5463254&#"#"&547>5&#"326.0AF5?0=Q@%+&!@ [\$'/<$ 61'!+3(/9 # 0!L!3267632#"&54632%3.#" A/";  ['Ea[BEY ;*);(,4  ]C>UWH ,%,+L #"&54632'"32654&\AA\\AB[/BB//BA?YYA?ZZ/@..A@-0@Kl02+"54;'32+"5437'"54;2+7#"546;2#VPQVoaH BD  GaMMk^@@ ^LG?rJPX&'#"&54?.=4>?63276325432#"'&'>7632##"&54?&''   325432#"'.#"#"54;>32#".#"23267632#"&5? "2Z9eHgCSv`H3\0('2 !4R(  4T,fE7J<+Ep.DYGL{ Z9#/ -&*0  &+ e+355#"54;5#"543!#"=!32+32+32+"54;5#"543|666pppp668b8?BC%2>32#!"543>7#"54;&'#"54;&54632".#"32+32+ 1##6lj ^QS:3N -)<nc XU9)&7kC3;T@ =)5 hG Q;FL>3263276232+4'32+5"&54?#"54;#"543754&#"32?&#"p0 @!7:!  !"J "J  ^""}w'27"  264$GG (  ((?z  O-RR23@DHKN!#'#32+"54;5#"54;5#"54;5#"54;35#"54;2+32+32+'5##3'##3'4K"55556juJ"!!!!)((j}`!&/m~S.;nGB.C BNNBBBBBBB):(<.%2674632+46322"&=.+#"&55"      (&%~  )+.I 9  '$( ] ?G 1;"32654&7"54;5#"54;32+32+5#"&46325"543!2#JhhKJhge6_=;6_GoYYnHjLMjjKNjT6_OYih @G%2>32#"&'#"54;5#"54;>327632#"&54654&#"!2#!!2#!W,C .N,_  \4_ S?Kn,y $`<a^  $,fR<Rn+<3AD732+"54;5#"54;5#"54;2+37#"54;2+32+32+.'+K6556K?-v'=+8W4Q>9ݴlnxH3B%32+"54;5#"&54?5#"&54?5##"=!#"&=#762762AiiZ  p^  t V  lZ  p)<  KD?  MIrr I9  HD<  Kg87 8>54&#"2654.''#"&54?7.5432#"54[ /+&0<"Tp20 R6Q& $2M_$[;7P6%)!&7LFH8&@dqg wB-$:m!pH/Ai+3=BI3267!32+"54;#"54;5#"54;5#"54;232+32+#'!&+!654'(F6555567Y c>,E!aA/0(,5/XA?2p3>#"=.=46754325432#"'.'275#"54;2+'Pk}fS<R;FI2iY_)-H' e( mJd0[#4"3+(4>,I\r O3@D3'#32+32+32+"54;'!32+"54;7#"54;7#"54;7#"54;3'נJ\L6&7%L86O73BXgHx̂I;;;;>@Q73267632#"=#"&547#"54;>7#"543!654&#"#"=43263232+!2#!]FDb?jZt3?cKQ>:R754325432#"'.'267632#'DZ .R3YAZ=3Q( 4S,)Lgg%[S4G<->p*B+/ &+!- {SGO}{|w\_<  < 'y'yyo'y'y'yxy: 2#"544&#"326?!!!#.QB VWzW:4&#"62#"54 32ȱxeDeȯ(gwx< 6f!E"#*.45<>23:<."#*23:>4f 8%qS]HKb*; %ydzyiv#,!lYmlZk!4'UE@>GT(2QLa"0 4%VA@j]g kWl^P[ZQ]88M/ -!K9@8 '974'&'!"3!267#!"'3!2654'&'#!"&547>3!2$$>I$#H33H$R9-# *=u'6Xc%#"&546325462".#"32>32"&547632%463232+5#"&5463254&#"#"&5&#"32>"E&=OQ>:'  -"3782!1Y  ^  DU,8?65,7K:-$C *+7"7@ TACW% = ?85; b   e/%,#+6 , ; $K^3Bdo%4.54632432#"'.#"#"'#"=432326"&547632%463232+5#"&5463254&#"#"&5&#"32(,?>,A08-$$.=^"J8<'8)+70  ^  %U,8?65,7K:-$C *+7"7O !*+ L1 6 b   N/%,#+6 , ; $?@)/4>325432#"'.#"3267632#"&5? "2Z9eHgC7-7>4R(  4T,fe<E7J<+Ep.DC%*0  &+ exAYGVC A4632#"&264&"2>32#"&=>32542#"'.'.#":#(49$%7\'$0$",*> &'E.cZ/D%* SE7>32!5432!"54;5.54675#"54;2+5462#".'5'F/=`6ED7``-   #)*.. 1R<=UFF = =30: MP =L2#"&546"2654%#"&546325462".#"32>327"&547632>UW<=VVk\@AZA"E&=OQ>:'  -"3782!1  ^  V>;VV=327"&547632&"O2 #(;Ct"E&=OQ>:'   G3782!1  ^  ! 0'd TACW% = 4?85; pb   \@R+@9#".5432326=##"=432354&#"#"=432632f,T4  (R4XvSCgHe9Z2" ESe +&  0*Z--YD.pE+3232+"]-480*>36-.o6_60N.3232+"546;7654&#"32+"546;  T6_5  U0N.36-.S  :I P$  ;w.&=2   %,!0   1.882632#"&54>32327>7#"&#"#"&54672!];8 (,9M7R (3:!" &% c0  K,!LVmq|-;C 2emjZ1 $*BV3*6232654&=47#"#"5463!2##"&54-)<)9 1#C#7)S:3NW=)(hG&7nE3#;T@VB*".#"32>32#!"543>54&54632-)<)9 1##7)S:3N=)(hG&7mE-;T@ux267654#""&54>7>3232>32#"&'&547v8 -g 5C31iF.$7!  ]>!,/R1  6Ifp+G2]55 d1!71.J =%2654&#"'3#!"54;#"54;54323543232#>32#"&';6*H@<%%@JEP9!>UcMhmIHocW&Axeiy>B3"&#"54;#"54;2+#32+"54;3PJ"47(3 = J3 @2"&546"2654#"4;2#"54;32+##"&=43232#12E119, , (6j4)"- 1$!11#"1 ((&r&&)#XX& 3b+4j5?%#"'332>54.#"#"&547&53>324'326*L2m(';:. @-20/+(..(+CV/JUC.ZR3"%*DH$-I5&1Q0%)+M#0CG.WeCoR1JV0zAYRC4-+3 %732+"54;#"54;2#&+32?65466PmvUA )8_a (8<3%@%05"#"&54?.546263232632#"&'32654&#">0_ ZUqБh6(*G5 IE+4U{yW3,)HY Aj||{( $gl]Mts(1>_>327#7632&547>54.'#.5463232654.##"&54654&) @!6 *!!qF h!# z 7%$  (3!( 1C84 $() '6   )Ci1bc>   p'GH,*   F#M3-132654&+"543!232+.'#32+"54;3DJhU6kIk/@=9BU9V(0$D0-E]?a0 Rkzg+M39B%#"&54?.'#32+"54;#"54;2763232+&'%32654&+i  K7#K66Ik5&L  I$9'rJhU6<  4(/]?a0$64  3"?G+D0-E R?5`4.546325432#"'.#"#"'#"=432326+"54;5#'32+"54;5#"54;732+32'9:'<,,# ) #)(99(C37$ 3%'0yU%R S%U ;SQ< M '"&2! ;!  (#)6)@&&*X3Da35432#"54;#"546;2#35432#"54;#"54;#"=#35432#"=32+"54;##"=3#"&=#JJM G#m!8 >u7`L É8aJa8VBkk BV3G32+"54;5##"=3#"&=+"54;5#'32+"54;5#"54;732+3265G U%R S%U ;SQ< Ijj I1'375#!#"=!!5432!5U8!: H)#v:4;F3"F) "X) 2+<3. O?H+3 )33<<0<>o$#!"546;5#"546;3#5BB" zNC# zvdd22 iiy4@r3+JNt%2+"543'2+"5437'"54;2#7"54;2##32+"543#"54;2+"54;/#'32+"543"54;#"=#35432#"=!5*%$->9. ''d4K_E4  'Gz&Ɲhhvv`H^rI&u&2%B*d273/T373#"54;2+32#!5432!q```= 3%3<X3j HS&/6"&f$&fb)O`#utOf#tY#uX`#tXf#"tYXc#uQ#Xf#L"B`##{XBd##QH`##{XHc#"uQHd##Q8Hf"#3`"{Xq3,1'3#3!2+32#!"54;#"54wkkAkk  !73!2+32#!"54;#"54#3#3#<KK!KKgggg3)%33#732#!"54;#"54;26;2# #s956% fc '$'u) (E*+,332#"&##"'"#"54;26#! %," 3(E*%33##"56;26;2+32#!"56;73#e'$* cf "659D) *G( .3#'%3#32#!"56;#"56;26;2+#9s_'$,OR "(*)*G(G3'+73##32#!"56;#"56;263!2+3lq) UK-;> " H(()*G(J32732+7#"54;2+32+"54;'32+"54;#"5437'*,xx(n"2xx4**pB3)(03;E32732+32+"54;'32+"54;7'#"54;2+7#"54#38++3xx2"n(xy-BB3)J37;#;2#!"54;'32+"54;7'#"54;2+7#"543!2+#||! ddp"||Zdd!)1 ?3/?@&+3' Q30\pLOp##53#532#!"54;#"54;3#"543;;=WlU8a0phhhhOOMp 0#53#53#532#!"54;#"54;3#"54;3#"543;;;=-67`-V6phhhhhhOOO Qp)-!##32+"54;#"54;2+3#"54;2+%#5FH'A5oM;xOOhh:YVp%)!##"54;2+3+"54;32+"54;#7#5F|A )M&M;xOOhh+<p(,0%#32+"54;###"54;2+3#"543%#5##5Dm57UFI L7B;2;)OxOx.hhhhcp,0483#3732#!"54;###"54;2+3#"543%#5##5##5D?57UFI L7Bo;2;-;xOO)Ox.hhhhhh? p<@%32+"54;'32+"54;#"54;37'#"54;2+7#"54;2+%#5i L LR 'PBmXP;:D;۲Oqqhh3%["+p@#532+"54;'32+"54;7'#"54;2+7#"54;2+3#"543;=" LR K mXP;:DTin'phhqqO":p159?%#32#!"54;'32+"54;7'#"54;2+7#"5437#5##5#3Dm LR K mXP;:;2;Ti)OxqqhhhhO\\OTF?G\G QP)%#"/7632!2#!  `Tb mm 56& "/#"5#"&54?  46 ln< `Vb 6%"&54?!"543!'&54632L bT`  65 mm& 74632432762'& 64  nl bV`  ?%%"&54?!#"/7632!'&54632n bb  `6`  66 mm 55 mm,%74632#"&54?#"/7632'& 66 mm 55 mm b:b  `` pg%#"/#"/#"/  >i { k > {f!7"&54?#"&5&5437#"'#&=7 k = f  >h xm4632'&54632'&5475632'&x   ? k  i =  m27327432276 h>     = k (0-%".54?##"/76323763232+Y $b  `.  %h}- H6 mm 5[  IZ (0-23'&54632#"&54?##".54?#"54;76 %`  b-  $x. I5 mm 6Z  H[ M v*#'>32#.#"#"/".M)T.'Y('C('>#)19v  , !$/- % )+e /{M v,%".#""54632>?"54>7#"&54?,''C'  (Y $,W,b1)# % -.$! ,     e+)(0+%#"/##"/76323763232+ Nb  `N `b Y6 mm 5X 56+7"&54?5#"&54?#"/#"/#"=Y6 mm 5X 56 Nb  `N `b (0 X2 X2)%%#"/##"/763237632 b  ` Y6 mm 5X JJ>/%74?'&546323'&54632#"&54?##"&> `  b JJ X5 mm 6Y*62!5432#"=!#"/7> `jb   4ac6 ln "/32+"54;#"&54?  4ac6 ln< `mb *6%"&54?!#"=432!'&463f bj`   6ca4  nl&27462#"54;2+7632'.  4ac6 ln `kb , /32+"5474632#"&54?#"/7632'&  66 mm 55 mm  b:b  `` )'#!#"/7632!267&+"&546;284b  ` &A& &1;c&16 mm 51  2F7'46;2+"3!'&54632#"&54?!"&5F;1& &A& `  b48c%2  15 mm 61&)'2+"&=##"/76323546;23267.'6.9  b  `6**49%!d #2E E6 mm 5$-;2Z F7'446;23'&54632#"&54?#"&=#"&554&'3F4**6`  b  9.6! d$2;-$5 mm 6E E2#,$ ?;2>7327'&'463"'4?#".#"#"&'#.'?2"  `  )  b* -b )  ` !5 Q m 6! 6 R m 5X;23'&54632#"&54?##".54?##"/7632376_ %`  b-  $b  `. I5 mm 6Z  H6 mm 5[ 4463263277632'&d΁ e}Q  d5" o4\ 2IQ0i#"/76323"&5#N  `  b 1mm 5 F64?#"&53'&54632#"& b  `  1 6 o5 mmi%3462##"/7632N b  `  6F 5 mm X* %4632!"&5463!7632'&& 6 p4 nl bF  `  ) 2!462!#"/76 bE  `  6F 5 mm( (7632/4724>32#"'4&#"6 ln 4 *I/8P'PB)>!b  `32763'&5>324&-@! *E-2L(4 S l6L`$>A% :@/#2G9 ` *  b\q+g0; '"543!2#"/#".'#"/1a     i i k %.Z0> &69;!#"/?2!5432#"5#"=432!'&5463#"'4? b    `jDj` * b6 ln 4aca4 S l 6;!(4.'##"/#"/#"&54226" > i)9nfh(w[2$ k>Z7#"'"54657[w(hfn9)i '.Z.> "WqsSam  `Vb .mm 56mm 56+/F@)1/%4?!"543!'&54632#"&!2#!#"/7632L bT`  > bV`  . 65 mm 65 mm)/%#"/7632!2#!#"/7632!2#!  `Tb  `Tb .mm 56mm 56*&. 1"/#"5#"&54?"/#"5#"&54?  46 ln  46 ln< `Vb  `Vb J1/%4?!"543!'&54632#"&4?!"543!'&54632#"&L bT`  bT`  . 65 mm' 65 mm*&. +%'&54632432762'&54632432762nl 64   nl 64   bV`   bV` !a %%#"&54?!"543!2%7632!2#!"54 `  `T:m 5 m 5 !a %7&543!2#!#"'%#!"543!'&54632)` *:T`  5  5 8 H$)32+#7##/?237332+3{.g    (t23   HH.337'#73'&'463"'4?##7##/?23737#7^ !d  .k    (!*  c    28H(37'#7"'4?##7#"54;7#"54;733'&'463 n  ~.t(d g 4  8&!2#!#/?2!2#!|    T   &'#"5"&5>7"/#"5L  b 4   e  2 !"543!'&5763"&56?!"543!7V    z2    %76327672/472432  b |[   e  6H#)&'463"'4>?!#/?2!7'! !d      9'yw  c   \ !'#"&5?"/7632/46327'7     } i!!      )",+'%"&54?'#"/#"54;76323'&54632Z bG`c*",,b^>`  67c-,b65 mm*.#!#"/7632!2!55!.  F)HJQ^*CEE@*.X2E@5 %#7#3'#"&54?+32'&54;CECEHJ$HJ     O37#"54;2+##"54;2+#3;N9M9qw )?;j-2#"&54632654.#"#"&546.#"326|pYIdcDi=07;+! / +74KK8naJ-  /CpaI=Q]]V@>7*  ,K`m>-  /Lfm{3]P+-333%!+,:3(+-3X3& ;2+"&546;2+"!2#QgU eg Vf Tk  gh  gV  &8>#7;2+"'#"&54?.546;763232+32#'7#"4-}V ##1  0;Egs8  0R eY Y`Vf9Z  h  g yGhx  g   (gVsn;2+"&46;2+"!2#:/HPPHd />abk&>0&39=?#"&46;7&+"&46;27632+#"&54?#"&46;267#73&Z T$ +'?  ?6?ee,  $` SUg`MF     tEg]  L  kT̤rsnC/ ~3p(".543!2+32+"&54;!32+"54;b - 56,F  kk3oRqo'!!76;2#!"=47&=43!2+"'ܮ4WGrM H. !2#!"54cn.H sXHt#y\`3 "&547632  ^  b   `3&54632"'h  ^    b  qw }|lQt32+ #"5437TB5X$it.="#"&54632#"&5463232654&'&54632654&32+ #"543}  E",<.:G2%M :$"34($'7TB %5'+$4,?$ "**  X$it)46;5#57332+32+"75#32+ #"543n 9  U9kY7TBu 9"$9$X$i%*0326?.#"32+"&'#"&46326;2+"N@4;&5H86.@=OCXXCP<32326546~ *  @,/'6  "5 M.@7 $"R.H8"=265474.#"2#"&#"#"'#"&54>32326546326.   @+*  @,/53':  "51:&$"R   N 2'N.@018 $"R.H,,J2AP2632632#"&#"+"'#"'#"&54>3232654626547&#"#26547&#"%%#%( @,/!,)#(7  "5  @ j  @  'N.@8 $"R.H$"R& N$"R& Nn07A#".#"#"&54>32326=.546754632>54&'"& @D\\D,/'6  "HbbH51 Z3 W;:V 8"8>ESak32".'#"'#"&54>32326=.5467546;267>54&'26=#"'".'63254&#"327"+ @'QD4,/53':  "E==E51/f;+*23)b "!+O @#,. !%, Mr YHAV.@018 $"^:9]t.H,,#i;G F40N$" 2Mki J$/7w}547&'26=#7#"26=+547&'32&+3272632632".'+"'#"'#"&54>32326=.5467546>4&@ P H%  7 H@:97 %'$%)  @5CB6,/!+*#(7  "9IH:55-98F*23 f& Mf$"zz:$"|z1g& Mf0 Mq_v^.@8 $"a@=an.H'OfQM`Nn&Q#"&54>323265#"546754632#".'7632'&547632454&'"&@,/'6  "7'&547632454&'"&#"&#"7632#"&54>32326=.546754632@0F ;1H6)Z'Ng iF !9N|.@7 $"{kIHhg.Hn&V>7#"&#"#"54?.'"&#".'#"/#"&54>32326=.546754632@5J0 >F1)ZMg\?  Ca |.@7 $"{kIHhg.H;#yN#yANy; V^#yKy<#yK#y#yBKyBH#yH'q#yKy<E#y#y#yB#yB\?#y"y \\%2>2#".#"#"&54632* R%B;   L,E;'& P0/ R0/\\2#".#"#"&5463232>&Q  %9D,L   ;B\P &'/0P /0`@/%"&'.#"32#"&5463232654&#"&4632)L>-A@. =VV=/&27.@A- Vf$2>32#".#"#"&54632n(  G&4*#  B, 6! X7A7+, W7A+p '@\^074632763232>2#"'#"&54>?.#"#"&\L,F N+* R%"1I + &   R  "'& P& "%V  J' J& SH^E4632763232>2#"'32+#"&547#"54;>7.#"#"&\L,$) ) 0 * R% (  n/       KR!Q ` '& PT+ c  3y%&  3%'C7#"4;7#"4;763232+32+#"&5472>2#".#"#"&546324 4+ * R%B;   L,E;R(h(6 &(h(U '& P0/ R0/3%"P2>32#"'32#!!2#!#"54?#"54;7#"54;7.#"#"&546327632" R%5FG7 '.HFB# %  L, !8 6  P TqX  ?qi &' RZ  W\&  S\^U#"'32>2#".'#"&547&#"#"&546327.#"#"&54632763232>2R%#* R%*2 8   R&"     L,+) 0 * PD '& Pd p OD RQ _ '& J '& S \#& ' O 3y%'  dY%2326432#"&54"4&#"#"&54632yc54'# D:z)""3z%E& ~3z%/|X 3z%&j 3z%/jX 3z%J/  3z%'  3z%J/Pr  zI/Ip/H/G 3z%/"  3^%'7#"4;7#"4;763232+32+#"&5474(  4+ (h(O ?(h(U 3k% !"543!2'!"543!2!"543!2 DDD3 %;7".54?#"54;7#"54;7#"543!763232+32+!2#! n51(   15'  BqgU  CgqT 33%'  uA E'?NA&!;3%' ?3%'! ?%g'8#"4;7#"4;763232+32+#"&547"'-632ٙ4 4' 6{ E (S(, (S(A ز    %g'9#"4;7#"4;763232+32+#"&547#"&547-&54632ٙ4 4' YE | (S(, (S(A     rC#%#"'-632#"'-632C & &    rC#4632 #"&54?'&74632 #"&54?'& % %    \1727632#"'#"&54>7&547.54664!    EE  !    FF  7$$#\7"  ~y"  7"  '{"  ``bd A%"4&#"##"&54?#"&546?"#"&543232?632>5432c< V  D*5 [F)Ttc< ^  L'/ UD)RpY,- { $ "?ID',-  " != JD&H &)%#"/#"&54?'%76327632%7 o  pg  OW [ BC|  X  0 K}XN&)4632632#"&54?#"&54?'&7N x  zW  ?G wb  Hw  ]  ( Bxa+ S36%#!#"&54?#"54;7'%76327632"/!24  %#v/B  $P }k lTqZ ASt  ?%  :m  oyY5;S477632!2#!#"&54?#"54;7#"&54?'&546327Va  \\R4  %%Ls \ C  HZ A7  Kt  vKH s&m Nr&!l H CF"&4?#"&546?'%76327632#"/32>2#".'7 %   @&>*  \ J 8>2) R%2$+1i9M h ! Kfv  F3 Ir o.''& P"`NCF"&4?#"&546?#"&54?'&54632763232>2#".'7 %   @&({ @ :  :2>2) R%2$+1/M h ! KoD Z~ z  [.''& P"O>##"'-632"&54?'&54632  &  &   >#4?'&54632 #"&"'-632 & 2&     <?B"&54?'&546327'?6327632#"/#"&4?77'7 7:q l+   *>h b   *~E-  > ;7632#"'.#Hdzr  YY  rzd(/W6  00  6W/F)   [R2H 32432>7632#"'.#432#"'.#Hdzr  YY  rzd:aV]!  %1.(/W6  00  6W/v(/\=  He'F,4#"#"&54767&'&546323#"#"&547>3 dzr  YY  rzd#]ia   ^Va:O(/W6  00  6W/o(/V7 =\/H o'  [fF p'  \eH 3054326?63267632#"'&'#"&54?&#?Hn7t  Ta(  EK  :  {Q0 (  8L  907  o?  F 30563232#"#"&54?#"&5476?&'&5463267&  qU3u:z  XW%  B J  8'  ( 5G  {:87  l?33q7"&463!2#!"3!2#HPPH4:6;54qabG87K3q cM53%.7#"&54?.546;763232+32#%#"3S  KCKPH]  Uryy:6;5q  `EHb  )G87K3%.7632+#"&54?#"54;#"54332654&#`]  UCJPHS  Ksy,y5;6:  aEHa  )K78G3& c3' d3)2;7"&463!7632+32+!2#!#"&54?#"54;?#"3HPPH#   ID4  -J :6;5ab,   eF  -e)G87K36=%2#!#"&54?#"54;7#"54;7&#!"543!27632+326543  6Hy4%,  *5PHGi5;%F  -b:  70VHabsK7E31#"54?#"4;763232+'"&463!2#!"3!2# 1 HPPH4:6;54^ Q(/ (abG87K31#"54?#"4;763232+7!"543!2654&#!"543!2 1 345;6:4HPP^ Q(/ (K78GbaI/#"&=432326=42#"/763232+ef| hRMp(  d{}f g~~g TilQoo 78I"y I& zJq 7!2#!!2#JsqS>q pX5J'  p>' qH !"5!"5H((>fH tX?' "&5462.'#5#65#?桢+ m\*ӿossr]\m *\m?' "&5462."!26?桢+0ssr]]vv]*]vvD) 2#"&54%&"'64'2डtsHH;;f;YF(toot@::HK*J;D* 2#"&54%"&2654'डts`9HAU_9A)tooty]RBH9(^RA9#5& & #5'~ #5)5@54327632#"/#"&54?'&546327"32654&'2"&546 Q  RQ  Q  _^]Zkܛ$+ *p  pp  p* ]_]\(mnom#5'N #5'{ 2& 3!35+33535#2绻) ̾(2& 7!5!!!5!\^*6^( 2& 3!7'%'726ӶѴ Ҷ!cҵ2&& & q31I7#"5432!2#!\F+'%I X1:G"543!2+#"59:V XGI7#"543232++I7#"543232+32++g31I7#"5432!2#!!2#!\FF+gwI 7#"5432#"543232+f++I$I $7#"5432#"5432#"543232+rdf+++";I!7#"5432!2#!!2#!#"5432rrc+g+31I#7#"5432!763232+"&54?#\    +    31I*.7#"5432!763232+32+"&54?#?!\Ak  VFiXl  VW+  fg  f)ggyI$.%#"54323763232+#"&54?##"5432 j  T9Y  Cag+w  ^d  K+"CI 377#"5432#"5432!763232+32+"&54?#?#Kb e  P4WLe  OzK++  fg  f)gg{F.%#".54632654&'->54'#"&54>3212 )  AA  ) 219֢(#&6 6 6 6&<v{F W1_NT75%CHyNT XHp' H& /BQ #"2654&%2#"&'##"&46323>y""0""R'9:(#76$)9:*!46)"""#(:()9-#".:R8+ !*BQ X\Q %2654&"'#"54;>32#"&""0""G6$)9:*!4"""##".:R8+4!% '%#"=432#"=432#"54;2!#"54;2Ab̐d97"543!2+#"5Zl<.' l<3' <3' D0).'46232'.'0   q `  w  (dD03"&54762%!(    +    (-+2#".5473#"',    #    -+2 X'+- X+-#"&542326542-gi(z^\~(eglYN? t^y H+6A76232+"/#"&54?#"4;'&5463272"&5462"&546,  zz   {{  ((7  z({   {(z  W`\RX 7'757nn;{<;{Jwww\RX %'7/͖tn3wwww.W;{\RX X4%#"/#"&54?'&54632   !  4747632#"/#"&!     L& Q86 [B@86 T03q,7"&463!2#!"3!2#%"&5463!2#!"3!2#HPPH4:6;54/632==qabG87KS/'*32/3q M5G3754632#"=4&#"#"754632#"=4&#"#"Hef| hRMp UX8:U ;,(@ g~}h UhlQ CNNC 36<- G Wx"5432#"=4'#"5#"=46@Tk/>U]<<OBd :/CO3%F37!#"=##"=#"54;5#"54;54323543232+32+'5#u??)?gg)ggN, ^2N,' U2!sR@'f 'f@ f sR@ W'{/fV%f'{/fVef8 FN8 EBF, ^TH 3 6$#"#"&54767&'&5463236#".'&546323 dzr  YY  rzd:aV^   bh]#(/W6 00 6W/v(/\= 7V/H YHM64327&#"4326?6326763201#"'&'#"'&'#"54?7HDFc> w;D 4^'  @F  4L   ^& ' F C @$4' ' *4   @7!)13265472#"'#".54?&5463276&#",6B^A T-vRG8T T-wSF7Tw,4C_"k"^B6 U7GSu-T U7IRt-Tw"]A8,2&Y 37%!'24`( #"/#"&547   &8~ XX'qx (&q'qx (6 %!2+#"(~"A %#"5#"43!A(6 X"A X|0#753@)*S(((|A3##53((T(0|%#33#@)))S((@|%#573((((SH #"=!2#q#5  Sa2%&54>& ,>j@-.@i9NNa$48' (82#7,7232654&#"76".54?&54632#"' :4COooMPp*; ?6`^_T@? ;*oONpnND5: ?AU_6?4?[,7;FQ\%#"&=#"&546;5#"&4632354632+324&#"3265#4&+32654&#"35#"326?>,->|?X>>,CC,>>,->|>-,>>,CC,>(''C'|)'C'''''CC'''->>-BB,?>-,?{?X??,CC,??X?{?%''C'{{k'B''*C'''B'''HnX]1 !#('@  8@81Q 8 @'8@Q XX8 46;2"&54&#">4/- *,b8ND/ -1+Y8@  XXd%"4&#"#"&54632ch 37/!!73'3#fD$~pon@茌(@ooooZ#"'632   h ``  Z4632#".547&   F  NNXh Xh+-E %7%%'7%"=42#"'&54?632#"/&547632-((U  U jU  U ؕ(||bb1  1  -1  1  W!"54;#"543!2+32< ^CP!%!!Pph^(X&  UX& UX&  UX& UX. 9 U#5F#!#"=.54675432>4&@ggfgVwx~Wuuig Й@F ~WY#5& H3763232+"&54?#"543  ʥ  +    H3&5463232+"/#"54;h        X& UX& UX& UX&! U)F%%#"/76323543232+#"5#  `vxb mm 56I0F%%"&54?##"5#"54;54323'&54632_ bzx`  65 mmX& UX& U#5%-2#"'#"&547'&546326327654&#"0kK HZnT  EF^LX=[F9mkN 7orN  /DVA`_GAY\&:V&q +-F 336323##"533+)3YWX&  UX& U:U%,%2#!"54;5.54675432>54&55GG57JK6'54Q&12(bR76RS96Sa_='*=<''<HM3&"/32+#"=#"54;5#"&54?  46 lnc `b X& U:&qY +-F'3##"5#3632#@& W(3;YX&  UX& U:G%,"543!2+#"=.5467557>54&96HI56II6'34O&32rS86R~}S77Rr<((=<')=H#746325#"54;543232+762'& 64  nl b`  X& U\&q +-3&q?&q &q#5&q G& X&  U#5&  X& U:'Xp +-'Xpq'X q'X#5'X" HF3432>=3#"'.5H+PTMX+v[ao\^ aR^~ }g3F(7"&46;543232+32+#"=#"3HPPHLL:6;5qabggqq)G87K\c'OaN,c'l!Ho+&+-3#+!>32##"&5467!632.#"+u ?!Z,u  pvL6(*<3 j3 D  .C#'/'\j6"63232754&#".#"326%54622#"&'"&54,DNE; QPB;QA@Lhh hSOg A^0/$9b0/$by@ww  vn  \F)!#"5&#"#"&54632543232>2#"'@*   L,%* R%&# R '& P&qeX& A UX&" UJ.%.#"?3>32##"&467'363232w>6 r\\)M  = l  B*7E;/*Χ D ' +z 0/J)'#&#"#"&5463273>2#'. < ;.)   L, 5 _$ ; m*g,3I 1hD Ru& B +2B:+(B?G&*q&Uq& 4q+(& 6q?G*8W@EK$#!67632#"'&/&54325467#"'&5&'&54767542!54'36W!,4G I**I G4 7$$7(6$!*_IH (((< >  %L L%  =$% 1/12/0 !!/ 01,33D656D9V+#!"5#"4;2!4;V`_u v(U(jV1%%+32+"=#+"4;5#"54632.#"V"xtty!$ih((lpl8"5.46742@1@@1(1@@1(I32JMIfIM<m/D`T) W'+}d4)+}4)+}4)D)X#q#qg/D)D)S!-5=Oas463232+5#"&5463254&#"#"&5&#"326'#"4;2!#"4;2%'&547632#"'&547632#"%#"'&54?632%#"'&54?632X-;$>:B.8L='2,$@',4@("#9bbbb/\\\ \f\\\\-# +6/%*5.: &n((((N! " ! " " ! "  ! X3!2##3.5462654&#}[[,21>LLfMebP[\`96\` ^BDbgNMf2&p"5423#353#53E((Uo(\(( (XX 4%7'#7 '37&'+32>#"=#"=435432,8,Ժ8B++8%*  *%88Ժq$3K2/ 6 CbD 6W*2.5432#"54>7#"+"4;2?63#!"43!+  ?*)@  +.-T:+!Ci<& )<;) %=VV(VV(( WD m67'5'67'7&'#773&/542763232+#"/"=&'#"'&54?&'#"54;67'&5476326^i$<.Li%<.jj.54%!."'xah&$qq{|}|@o2:fph=X4==XIBK#"&5472654&#"&'632#"/#"&547654&54632326327#"'X}2ⓓpE1L[~|Y  _/8  X58}[L,Lono 4 X 30_ XL98 :F&' Tt rV]$+"5!+"4;43!23VnmWZX((#("XG#46;2#"+"4;2653547"26izHUUv>} 8iYY\]^e(jWBc.(eF@oRl?g#5!7#"543!2+7', #5 OX#5!7#"543!2+%!'7,:z 漼#5 QX?y$+"4;6#!"43!+"4;"+"4;?jjkkjj((((((((D %#'73'#3DqLJX!%!!X^(;# gU W 048<DS#5#532#53#53##54;#!"=#535''754;5332#53#53#53#"=33!73"&'($8r__^^(/99*9z((((((( 4( FnKTq:v ((((( 4(Ei 8ccc/$P(3. I! V 7LTX\`h#5#532#53'#53#53#53##54;#535!53#5'"543!237&'#5ᘀ537+5353%#53#53#53#"=33V(&((^^((((9(M^ Y((m*,j6(# (Sw(&(U((K^^^^M(9.(iY(ji.B((S?i`gLI ILFB(j((((*X%9%#!"&=4>75735##%54&'!3!2>X!#f* #G!p)|*#E8'#-48 P@8/B8V#oo @tC-Et@{B+BX_$,1%+"&=46;254&+";26"''.''&5X[[[[(ExyDExyDA+(:u[[[[yDDyyDE;*] !*T8 #7632(  - T8| 3#T(( T #"&/&3  (V -Q8 ]XX8 #3((Q  [XX,8##32م(,8T 3#,(( , 2+3(:d8, cXX8,  bd,  aXX8 "#4632DV(nTB;"NX,8@ 3#4.'>5(05 ()GN.*5G) Ս9 /I.,+G/ %&8! 2#"&53Tn(V;XN";B8@ #@( c8@ iXX8, #67.53@(05 ()GN.*5G)+9 /I.,+G/ %&8!c@  gXX8@ 3#(( 8X!5XxPP<8 65463<~~ XrV rV<8 "&54.'2~&DE-VrX9P)Vr 8:l '5!#''%5!j4/0(@7uA6@*+ : 373!57 !5%H(0=q @6+zX !#"=!#"5.X`X tX Xs/ tX uX"8A 3#&54632^)j, ; X !5X PPX5!5X5PPXT!5XTPP#Xs%!5XsPP +"5476;((q $+"'&5423(((p(/""=.5467542>54&'#?gd(cg(UsvR(VqsTfh[[hgn}VYz~}(/"("=.54675#"43!2+>54&'#?gd(cgUsvR(VqsTfh[[hgX((}VYz~}(/"(32#!"4;5.5467542>54&'#?gd|cg(UsvR(VqsTfhF((Fhgm}VYz~}:%+"=#"547542'#:((5(.__jj{{:!%+"=#"5475#"43!2+'#:(5(.__T((T{{:!%+32#!"4;5#"547542'#:|(5(.J((Jii{{>,746324232>?632#"'"5&#"#"N>4>(@3  O=4?(?3> Ak6C8  Bi6T7< ->274632#"43!2+32>?632#"'"5&#"#"N>4>@3  O=4?(?3> Ak6-((8  Bi6T7< ->2746324232>?632#"'32#!"4;&#"#"N>4>(@3  O=4?|?3> Ak6B8  Bi6((?7< -W +"5#"43!((G(W #!"4;423|(-((G }X |XJ#!2#!"546;2+!#"43ZO2  + ;&H)32##"/76322654#552>53B]c@  wg*HJPre<"RW; jv)}xCE+KxT@!7!5!(( R'%#!"543!42!2#!"43!#!"43!+"4;R(Ik77ppct((s((t((RO!%+#!"=#"54;543!232#5!5!RRDDnRCnnllPX&".+"&'+"#"546;2>32;2D l&%l =-l  #l-=P)9 **9)8X XVD%#!"&=>;2#D)!- )-&&| |+-E& jW. Nt#!"54763!2!!N  ?Ac L (T,82!2#".'!"547>#32>%." $   2++/  $!         - ?9 .   2 !  ,.v/1%/8/u8*y/6/2+n.-y/7/;n6#-v/(/7;n#0v/4u/1(-0v/(/27|=u/$/&.z&.u/%/(/uc7/6,h%rwje6/+Yv7:esd9//^y)BdXd8/7Dd9Uxud7/)8d)gwhf7/&Tr5-foe9/6Pt6,j~d7/6_r,4d+4t/(//'!t/'/&y+0t/'/&+3t/'/&+/t/'/&"3v/$/.p1$8y/1x/6<#9v/(/7%;x/& /$1{rl//(do0.l!9y/6/8%#6u/(/6&ad7/)Sw6;i_c5/6Eh*Kpib7/5[w6;gZe;/6Ej8M{b6/6gq38b!7t/'/(/~((%5432!5432 *U~~ U=g/1 M /. 9"=#+"=4234;29((|j%"5!"543!42((I(I_!j+"5#"542!42((3(D!_Ij Wj#%#!"=423#"=43!2"=#3542((_((f zN - 5#'N"zNUU@ #53#53#3@Xq Aa #53#3#53A__AA#4 #53#3#34__``XBB K !#53#53#53K__b!#3#3..h..JXX ,"32654&'2"&54632+"54;#"&547/mlkgxGKW  0lmkj({|}|^. XX 8"32654&'2"&546463235432#57>54&#"#"&/mlkgx>?4F2{/"D 0lmkj({|}|*DD+ ..r$M<*C XX G"32654&'2"&5464632#"&546232654&#"5432654&#"#"&/mlkgxK6FF&+#\B6S 22BG.,B/5")  0lmkj({|}|==+%$,$-Q= ""5 7!$ XX .2"32654&'2"&546#57332+32+"54;=#/mlkgxT|70lmkj({|}|/KtXX >"32654&'2"&546"#"=32+>32#"&546323254&/mlkgx'A 6MO"32654&'2"&546"&#">32"&5463232654#"/mlkgx; 5RN$]zf`R&K '%KaK0lmkj({|}|&\\ 1C7Rr[sq+ !<$mOXX )"32654&'2"&5465##"=3#"&547/mlkgx˦m  0lmkj({|}|FA XX -5@"32654&'2"&546#"&5467.5462&"3265"32654/mlkgx% J?BG#CnCQ'*$Z34,+50lmkj({|}|0+9FC<,-&(-:;,'(@K("r0'(..'&XX XXXX "/E"32654&'2"&546#"&54632'"32654&'32+"54;#"&547/mlkgxKD)(@80,Am( -/\# 0lmkj({|}|QusSaovM^J-L#ZBH`*'  X@!!X@(XT!!XTP8@ 3#(( 8T 3#PP X@ 3+53#53ddddd@((((XT 3+53#53dddddTPPPP8@  #=3#5@(((pd8T  #=3#5TPPPpdX@ #5;#!#53#53тFAAAA(((((XT #5;#!#53#53тFAAAAPPPPP8@  #5#553#5@(((((;gggg8T  #5#553#5TPPPPP;gggg8X@!!#@(@( 8XT!!#@(TP48X@!!#TP@( 8XT!!#TPTP48@@#!5@(@(8@T#!5@(TP8T@#!5TP@(8TT#!5TPTPX 3!( (X 3!(4PX 3!P (X 3!P4P@ !5!3@((@ !5!3@(PT !5!3TP(T !5!3TPP8X 3!!( ( 8X !!#3@((TP48X #3!!#P( ( 8X 3!!#(P@ ( 8X #3!TPP  (8X #3!!#P(4P48X !!#33@P(TP48X 3!!P4P48@ #!5!3@(((8@ !5!3#((P8T #!5!3@(P (8T 3#!5!3@P(@(8T 3#!5PP@(8T #!5!3@(P4P8T 3#!5!3@P(TP8T #!5!TP P8X@!!#!X(@( 8XT !!#!5!@(@@( P8XT 5!!#!5@(@P4(8XT!5!!#X(PP48X@#!5!TPX ((8XT #!5!!TPT P(8XT !5!5!!#TP(P48XT!!#!XPTP4X 5!3!(( (X !5!3!@(P (X !5!3!!((4PX !!5!3@(TPPX 3!!5P@ ((X !5!3!TPP (X !5!3!!P(4PX !5!3!XPP48X !5!3!!#((( ( 8X 3!!#!5((T ( P8X #!5!3!@((4(4P8X !5!3!!#((P4P48X 3!!#!5P(@ ( (8X #!5!3!TP( ( (8X !5!3!!#PP( ( 8X ##!5!3!T(P4P (8X #5!5!3!!#P((4P48X 3!!#!5!3@P(T( P8X 533!!#!5(P@4P4(8X !5!3!!#P(P4P48X !!#!5!3@P(TP4P8X #!5!3!TPP P (8X 3!!#!5PP@4P4(8X !5!3!!#PPP4P4X@#53#53X(((XT#53#53XPPP8@ ##@((( >>8h ##hxxx >>X|!!5!!XX((8| 3#3#((x(( 8X| !!!!@D(P(\8X@ !####|(P(@(  8X| !#+!!T(P(|(\D(8@| #!5!5!5@(|(P(8|@ ####5|(P(@ (8|| ##5!5!(T|4(4(X %3!!!(D\(P(X !3333X(P(  X  33!!T(TT\((D@ %!5!5!5!3@((P(| !53333|(P(( |  !53;!5!(P(TT((8X 3!!!!(\(P(\8X  33#+3T((P(( ( 8X  3##4333!(T(CC((\\(8@ #!5!5!5!@( (P(8|  ###533|(P(( (8|  #3632##!53|((tMC(4D4(8X| !#!=!X(X(\(P((8X@ !#####X(P(@(  8X| 5!##5!"%##654'43X(U(CT(((ww(\̈wX  %!5!%5!3!XX((P(\(X !533333X(P((  X  !!3!53#"56533X|tMC((D̉w(4wT\8X !5!3!!!!#!5!((T(\(P(\(8X ###533333##TP((P(( (  ( 8X  ##5)##33)533(T(((((\\((48X@ 3#"#46ddcQ(g@(Qc,ug8@@ 2#4&+5dug(Qcd@gu,cQ(@  =XXX "&53;ug(Qcdgu,cQ(8X 6"ʴ,8X 7X""8i  ' 7 C&""&"", 22,@!!,@(,@ 3#(( ,X@ D,8@, E ,T!!,TP,T 3#PP ,XT H,8T, I XT!5!5!!,,,(P8T 33#(P, XT!5!!,,,P(8T #3##P(, ,X !!X 8X!!XK}8X25!!X28X5!!X8X,!!X, 8X!!X8X&!!X&8X!!X8X !!X 8  !!  8 !!> 8w !!w 8, !!, 8 3# 8 3# 8K 3#KK ,8X !!,, 8& #'+/37;?CGKOSW[_cgkosw%3#'3#'3#%3#'3#'3#3#'3#'3#%3#'3#'3#3#'3#'3#%3#'3#'3#%3#'3#'3#%3#'3#'3#%3#'3#'3#%3#'3#'3#222222222222,222222222222,222222222222,222222222222,222222222222222222222222222222222^222222222222222222222222222222<8X #'+/37;?CGKOSW[_cgkosw{%3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#22d22d22d22d2222222d22d22d22d222222d22d22d22d2222222d22d22d22d222222d22d22d22d2222222d22d22d22d222222d22d22d22d2222222d22d22d22d222222d22d22d22d2222222d22d22d22d2222222222222222222222222222222222222222222222222^222222222222222222222222222222222222222222222222222222222222222222x8X  #'+/37;?CGKOSW[_cgkosw{ #'+/37;?CGKOSW[_cgkosw{3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#53#53#53#53#53#53#53#53#3#3#3#'3#3#3#'3#73#'3#73#'3#73#'3#73#'3#73#'3#73#'3#73#(000000000000000000//2000000000000000000//2000000000000000000//3000000000000000000//2000000000000000000//2000000000000000000//2000000000000000000//2000000000000000000//2000000000000000000//2000000000000000000//d0020000200002002002002002002002002002002002002002002002//0400000000104000000001B0400000000104000000001B0400000000104000000001B0400000000104000000001B0400000000104000000001t0040b041+0b0b0b0b0b0b0b0b0b0b0b0b0b0c1X !!X } 8X 3# KK 8,,!!,, ,8X,!!,,, ,, !!, 8X !!!,, 8X !!!,,,)8X !!!X 8X !!!X ,,X !!,, 8X !!!!,,,+ 8X !!!,,,2&3!2 2&3!%!!24\ (2&;4>;!2!"'./3!27>75&'./!2 8  ,8 <  (  * }"  ,8  ,<   *  (2& 753!%!!4\}} (2& !5%!5!!5%!5!!Z\\\\(YKK(KKK(K 2& 73##!3##!!KK(KYKK(K (\\\\(2& #'+/37;?C%353535#35353535#35353535#35#3#35##3!@KKKKKKKKKKKKKKKKKKKKKKKKKKKKKsKKsKKKsKKsKKsKKKsKKsKKsKKKsKKsK(KYKK(K 2& !!5+5%332 'ު\ުx ̥x2& !#75373& ͥxޥ (ުƪx 2& !$'+%3'5'7'35'7'7'?#'?#'!!E(D}UUUUUUDDDUUUUUUrDD`ED lD`DDUUUUUU9DDEEUUUUUUrD`DaD( 353735#53ת((2&,3!2,2&,3!%!5!24\,(3!, 3!%3#, (?,3!22,?,3!%!7!22:&\,(#5)5 #5% ! (N()7%'!7mAA(jj(T 5 T %5 y %充 %'7]n;{@y % y%'%uSCH#5 5:#5! l v:%'%#7'mAj99  99W    ?充757n@{;^ 7%^_75%HC#5! ,    #5%7' ,  8  #5 %'77' ,    #5 2#"&467"32654&'2"&546.'9:()9:+_^]Zkܛl:P::R8~]_]\(ڜomY? 77+Ҝ?&#5 "32654&'2"&546/_^]Zkܛ]_]\(ڜom #5%/7?GQ[en2"&42"&42#"&5462#"&546'"&5462$"&462462"$462"%4632"&4632#"462"&462"&$      R        +            "     X  2    z       b  a  #5 !2"&54667&'>4&0kܛ'$#P'$$LZ08*01ڜom)@Ch)hCo7`I_l_#5 )2"&46"264&'"32654&'2"&546.2IIhIJ4#32F22 _^]ZkܛJ34IJhH(1#$22F2]_]\(ڜom#5 2"&5460kܛڜom#52654&'2"&546-]Xkܛ>]\(ڜom#5"32"&46+[]pܛ\]moڜ#5!4&#"4632#"&K„]\(mnom ]Xkmn#532654632#"&K\]monm[]pnm#5 "3267#2"&546/_^]kܛ]_] ڜom#535"4632#"&J^'mnom Zkmn#,!"&5463,ooon,5!2,onoX!"32654&Ԙ*:9)(:9XX8R:9)(:XX 2#"&5467"2654&%!!/V~XY~\pܛeXZY|2monm#,XX5>32!#!#5.#"K\X#X#gm, Z|}Y , ikX, 3!33267%!#"&'5##mgX\,, ki Y}|Z# 0 ##5>73/ X{(hzW g, 9 '3#5.'-h({X(g Wz,9 %3>753#- X{(h(zW g#0 %#.'53/h({X((g Wz# 55.#"#5>32 X\(mg Y}|Z ki #53#"&'533267 (gm(\X ik Z|}Y2&!&  2&)& 2&3!22&!2 Q "2654&'2#"&46-""0""'9:()9:)"""#(:()9:R82&3!'3#2 (2&)!#& 4\2&7!!Z4(4 2&!!\(\( 2& 3!#332( \\#5 %2"&46 !,( (N(#5%!  (N(#5%!, (N(XX "32654&'2"&546/mlkgx0lmkj({|}|2& 7!#!!35Z ( ̾2& %3!3!%35#@\4( (2& 5!35!!5#\ (\42& #!5#!#3 ̾\ (#5 2"&46#32654&35(pܛX^vPtmoڜ)Vw_Wu#5 !"&462'>54&#"35(kܛXWv^XtPڜom)W_wV(Qu#5 !"&5462'53.#"%#>0pܛX^vKPtmoڜ)Vw_Wu#5 2"&5463267#7.'0kܛXWv^XtPڜom)W_wV(Qu2&3% !2:^y^2&! 2y^ ^2&) & :^2&3!%!!26^ (2&3!2 }K7!%!!}^%K^&}K7!}^K^2& !& ^  DD#5AS_kw#"/&54>32%2#".54?6#"/&54>327#"&46;22#".54?65462"&#"&46;25462"&"&=46 * *2 * * * *8< < f * *   < <   5JL55LL * *6 * *| * *   f * *B< <   < < LjLL55L/#7&54632>322#J#.V?';):<@l*(2 <23"&5462326=462>2&#"&#"&#"&#"%+  (  !  !  !  !  3' 2 X`E[[E    5 &6F72#"&546"32654&7632#"&54'7632#"&547632#"&543IJ00JH2!12 #-/  s  sZ  NZMG32I(1"!13!2\ \  2P(!%"/"&54?'&546376272I  I 53о  o  P(!=%"/"&54?'&546376272"/#"/7632'&547I  I 53O%' | 6ss6 о  o  P ]^ x%25432#"546;'6  I%  J Z+5432#"546;'7!"&5!2  I    J  + #5 $463""32654&'2"&546_^]Zkܛ  ]_]\(ڜom2& q2&3!%!!4>32632#'&24\   K  !\ ( u4 2&/3!%!!2#"/#".54?'&54>327624\h     ((    &&3&547#"&463!53#5#"&547&54P$I!#$f!$\4 $D( ($" 4 22#37+#3!2+PP$!f$#!I\ 4 "$((!"$ 4&&%-5=3&547#"&463!53#5#"&547&547!"3!35#"";5#";P$I!#$f!$ $ ) d d\4 $D( ($" 4 _7(7_2& 2'@22'/7?#37+#3!2+'!264&#3264&+#3264&3264&#PP$!f$#!I$ ܤ d \ 4 "$((!"$ 47_7_78, 8(@P`?%"/"&='&546325#"&46;5#"&46;546232+32+T  h T X X  X X h \1 < 1  T  N N  T  < P`+#"&46;5#"&46;546232+32+"&5 X X  X X   Z  T  N N  T   :;%#"&=46235#"&46;2+35462"&=#32+"&46;   d  d   d  dd  d   d  d   #5 2"&546'67654&'7550kܛ SS'xUΦWvA8TڜomYuY8GWԋWEZ;#5 $.#.46724&#2"463232654&'2"&46`[>/2BG/.=`pܛ  6  \(58TEI-](moڜ2& 35!%5!%5!2  dddddd2& 53%#55!%5!^ ddddd dddd2& 35!'53%#=!2dddddddddd2& 53%#553%#55!^,dddddddddddd2& 7#553!5!5,  dddddddddd2& 53%#553%#=!^,ddddd dddddddd2& %3+5373+53'!!^ddd dddddd2& 53%#553%#553%#5^,,ddddddddddddddd#5&2<7"5462#"'."&463"6463"'"32654&'2"&546TzT ;T<Q_^]Zkܛ->>- &&    ]_]\(ڜom#5&2<72267632"&546463"6463"'"32654&'2"&546>-^    ]_]\(ڜom#5&07"2654#"#"&'.3>4&'"3>4&'"'2"&546\\A./A%  Ikܛ1DD1 )*0! 0 !0! 0 {ڜom DD#5AS_kw#"/&54>32%2#".54?6#"/&54>327#"&46;22#".54?65462"&#"&46;25462"&"&=4654&#26 * *2 * * * *8< < f * *   < <   >XY??YZB,/CA/.B * *6 * *| * *   f * *B< <   < < Y~YY??Y-B?./BAI#%#"567>4&'&'432>54.'Ԟ&GPPG&BUC/0EW?jCDk=*97I#.464632#"&BUC/0EW?jCDk=*9햹 44 v A"32654&'.543226763232+"&=#"&46;5.546.2DRvTTtT   x2@KkkLKj(Bh3>32356732+"=#"&54>54&#"#"W29=Y ( & ($ &=FG:ou    14X0+2- 8>g;"&5#"&5467356323+632;2+"5454&U/B  I I H K8bU^]Bj^E.A4   H F YY1F  K%(Kc=nFR#+"547654'&5463235423>76;2+"'.'##"&5467"32654&Z <7 gg :; Z(f 2C bb 7< f*>J0-M<(31 34|:^2 eXX^  /Z>bb>L=  Rcc[ 2^:G+-MH2/A &1"!165:ga%2+"=#"&46;5.=#"&54?632#"/5"&54?632#"'6=#"&54?62"' }(w wXl 7 7   7 7   87 mV  ii  UP 88 y 88  u 88 PUVm -%2#!"&546;:#4.#2>  %&F(:!(77]A53/WN@CMX-(  E  %2,A' (86Xo)"&54&#"#"54632632#"5654&#"?  J56:QF;>5_BW@1)V` W\J8-IaLMbG.6L:h 8%2>54&"2#".5467.54322654&54-2M)rss-AHAH)8J0<]1 J@DGus,9(VopUVgRB,7nL7.5463232>7632#"'632X4>v`26d2=0U'-T+ +9m>. *- 5 &.**56RU G88#+(4 r 1+  ")"%  Wd -9Z%2654&#"23267#"&54632#".547"32654&%".#">32#"&54>3231 34V"2Y8j,NJ01J9`j<2^?1z31 34#,gE*.LJ0-N'=VU01]@11"!165V! `W L/-ML.YC #1"!165V"K0-MI1GlA(J:9D4632.546323265462#"&54>54&#"#"&264&#"A7# B,kuw-6-0 "-  E20H-5-kb-5-A67Ax&))& /(4DOJ)nn,Z@X*1*% 6AI./`BS$YrGAk;4CD+H+-"!->Xi]j4>7&54&""&54.#""&54&#"&4632>32632>32#".'#"&7>54&#"/?$:%   "     $ %!C))  <- /#    Q %-&<1(36JJ6V '(B>V ,T  "#>#%V`S^uOY+ ? .WdZFtjX$U 07!2#!"&46232+"=654&"+"&46;546+ CZw Aj@  z\(   \e  OHJM  _bWhP#"&54#""&54.#""&54&#"&4632>32>3232>7#"&46;2"&5/(&*4"  8   + # #$  #1% $: o  % >;@@T (3%T 6J  7 "#YOT"0 %  o V[+7#"&546;2"&="/#"&54?'&562c       d      S]2B"&463!2632#"&547"&54767>732654&#" ! M8K #jlK\xYSby ' /&9>Qm]&55   1&vo`ov=6*n - ;T(ZL[d;Q8q%".#"#".#"#"&5463232>3232654&54632".#"#".#"#"&5463232>3232654&54632(  .(5 9$)#*&  :#(  .(5 9$)#*&  :/9//9/1:1q CU0;0/8//8/8  ,@A/9//9/1:1q CU0;0/8//8/8  ,@AQq;##"&54767#"&46;&'&5463236763232+#"'&       $a  V  T  aa  T  U  aHC)%3!527>7#"&54>7#":!$7u7$!*D,=$9=< -25)=,D+A##A+B=+%=26X7.M01'6 +=,,@:.'.5463267632">54&#"#".'&-CY2#F3E) )92H,9(3!+3  7=9&.+3'   / =qtAI&4F=$-.E0.\G:+=:D-!'UIJQ'*..'"=TD &'67>7.+/:=80||0j.%xC'3B1l,WV(4(J:8%!5>7#"&54632&5462>32#"7 &8$z$9%  A4JC0 KjK   0CJ4Y/%&/# M55J-)3HH3)- J55MHC !K%3&'3254.'3263!527>7#"&54>7#".  !@Z+0:82-0*E!$7u7$!*D,=$9=< -25)=,Dm $OP(#(G.,E'$*&*O-+A##A+B=+%=26X7.M01'6 +=,,?>32.'.54632-H,2H+CE? CY2#F3a=9E0,\UWm6=qtAI&4FQD &'6(/:=C'3B1lJ: 5v%3.'32654&#">54&"&#"32>!5>7"#"&54632&5462>32#".. N  g.>6,Y,V,  ]",6>.+# &8$z$8&   4JC0 KjK   0CJ47!c  _3-+' (! /;;/%#'+-3(#9(( M55J-)3HH3)- J55M"6@3"&54632462'15#  4$%  !@$3"&54632462"&54.''15#  !((!  "*:4$%  '"2(G/ 4G*!6<"&54632%#"&54632'15#4$'15#R4$% 'a!$% R!6<"&546325%#"&546325%'15#4$'15#R4$% a!$% R!aMam| 4&#">>32462:H!& 5k\%TO  '@9@amMMh xY[ #53%++=+7m793=V\575375377#5#5577YY++YYYY++YY+W(!((!(>!8J 6462"!!!&&< |&&ZzJ$462"&462"!!!f&&&&]< |b&&&&ZzJ$462"462"&462"!!!&&L&&&&]< |&&S&&&&ZzJ#'6"&4626"&462462"&462"!!!&&&&@&&&&]< |&&&&&&&&ZzJ'+/6462""&4626"&462462"&462"!!!&&"&&&&@&&&&]< |&&5&&&&&&&&ZzJ'/37$462"&462""&4626"&462462"&462"!!!g&&&&@&&&&@&&&&_< |&&&&0&&&&&&&&ZzS$#!"'&542632!S!(L(( l!! #5&  Sp $#!"43!42!S((((6P8(2"&463!2#!"&5463!2#!"2654&#"B\Z]]n}|o2DF0/FE\\\\7΍(vw(D12DDdCP8 "U8U2#"&54?654'.54Rm+P+H1Rm+P+H1\LTSJs5 \LSSKs6 U4632#"54>7654/&mR1H+P+mR1H+P+\  6sKSSL\  5sJST-+2#y X' 3D%#"&547632"&46;2+";2# yHPPH97;5S   |bcH76L 3D 'OD[Y+#"5#"4;43230(c(cMV4.543!2#!#"54>s & q-V<.(nwI~#5"y+ -+K &X@H%26=42#"&=42342@_(x|(^()e|fYn #!"43!422#"&54I(,(IL.Yn .5XR-X7'#"4;5#"43'75gggnnXwwww((;{<;{R-X 0@RIX?'%32+'#"4;5#"4;732+nnPnn(>>>>>>>>@;@;(ww((ww( I%#!"=#"4;543!2!Invv(([q I 3R\ 32#!!2+3Ebb(^^Sz\ #"543!!"5433b^S(z}[2 #&' 6   >[  df}["547 &547563    >y AC -+[2 #&' 6'2 #&' 6   >   >[  df  df-+[%"547 &547563 "547 &547563 ?   >   >y AC  AC 0O/2#"&54323264&#">32#".'&5432>cdc32#"'.5432.#"32>32#"&54632>11:oMRrrR%D*n>cb^-* ,% %, 'Kgrr &$%$%%2%$$#&$$&$&$'$& ".#"&546327#"&5463272#"&546#2#"&546 $%$&'%$&%$%$&$%#94$$%~%$&$$$#&$%$%p 2#"&546&$%$$%$% 2#"&546'2#"&546%$%$%$%$>$&$&$&$& 2#"&546#2#"&546%$%$&%%$$4$$%$%$& #2#"&5462#"&54672#"&546%$%$&$%$%$%$>$%$&$%$%$&$& 2#"&54672#"&546%$%$%$%$:$&$&$&$& "#"&5463272#"&546'2#"&546 $%$%$%$&$%#94$$%$%$%$%$% #2#"&54672#"&5462#"&546%$%$%$%$&$%$:$&$&$&$&$%$% ".#"&5463272#"&546#"&54632'2#"&546 $%$%$%$e'%$&?&$%#94$$%$%$%?%$&$$%$%p 2#"&54672#"&546&$%$&$%$>$%$&$%$% #2#"&54672#"&546'2#"&546%$%$%$%$%$%$>$&$&$%$%$&$& "2#"&546#"&5463272#"&546%$%$e$%$%$%$=$%$%$4$$%$%$% #/2#"&5462#"&54672#"&546'2#"&546%$%$&$%$%$%$%$%$>$%$&$%$%$%$%$&$& !#"&5463272#"&54672"&546 $%$%%$%$%%2%$$#&$$4$$%$'$& ".#"&5463272#"&54672#"&546#2#"&546 $%$%$%$%$%$&$%#94$$%$%$%$$#&$%$% "-#"&5463272#"&546#2#"&54672"&546 $%$%%$%$&$%$%%2%$$#&$$4$$%$&$&$'$& ".:#"&5463272#"&546#"&5463272#"&546#2#"&546 $%$%$%$e'%$&%$%$&$%#94$$%$%$%?%$&$$$#&$%$%p 2#"&546&$%$$%$% #"&546322#"&546$%$%$%$94$$%z$%$% 2#"&546'2#"&546%$%$&$%$:$%$&$%$% "2#"&546'2#"&54672#"&546%$%$&%%$%$%$]$4$$%$&$&$%$% 2#"&546#2#"&546%$%$%$%$$%$%$%$% !2#"&546#"&546322#"&546%$%$f$%$&$%#]$4$$%$4$$%z$%$% #2#"&546#2#"&54672#"&546%$%$%$%$&$%$:$%$&$%$&$%$% !-2#"&546#"&546327#"&54632'2#"&546%$%$f$%$&'%$&?&$%#]$4$$%$4$$%~%$&$$%$%p #"&546322#"&546$%$&?&%%$##&$$&$& "#"&54632#"&54632'2#"&546$%$%$%$%%$%$94$$%;$#&$$$%$% "2#"&546'2#"&54672"&546%$%$&%%$%%2%$]$$#&$%$&$'$& ".2#"&546'2#"&54672#"&546#2#"&546%$%$&%%$%$%$%$%$]$4$$%$&$&$$#&$%$% "2#"&546#"&546322"&546%$%$f$%$%%%2%$]$$#&?$#&$$'$& !-2#"&546#"&546322#"&546#2#"&546%$%$f$%$%$%$&$%#]$4$$%$4$$%z$$#&$%$% #.2#"&546#"&54632'2#"&54672"&546%$%$f$%$%>&$%$%%2%$]$$#&?$#&$$&$&$'$& !-92#"&546#"&546327#"&5463272#"&546#2#"&546%$%$f$%$&'%$&%$%$&$%#]$4$$%$4$$%~%$&$$$#&$%$%p 2#"&54672#"&546&%%$&%%$:$%$&$%$& "#"&54632'2#"&546'2#"&546$%$%$%$%$%$94$$%$%$%$%$% #2#"&54672#"&5462#"&546%$%$%$%$&$%$:$&$&$&$&$%$% ".2#"&54672#"&546#2#"&54672#"&546%$%$%$%$&%%$%$%$]$4$$%$%$%$&$&$%$% #2#"&546#2#"&54672#"&546%$%$%$%$%$%$:$&$&$&$&$&$& !-2#"&546#"&5463272#"&546'2#"&546%$%$f$%$%$%$&$%#]$4$$%$4$$%$%$%$%$% #/2#"&546#2#"&54672#"&5462#"&546%$%$%$%$%$%$&$%$:$&$&$&$&$&$&$%$% !-92#"&546#"&5463272#"&546#"&54632'2#"&546%$%$f$%$%$%$e'%$&?&$%#]$4$$%$4$$%$%$%?%$&$$%$%p "#"&546324#"&54632'2#"&546$%$&$%$&%%$##&$4$$%$&$& ".#"&54632'2#"&5467#"&54632'2#"&546$%$%$%$X$%$%%$%$94$$%$%$%~$#&$$$%$% "-2#"&54672#"&546#2#"&54672"&546%$%$%$%$&%%$%%2%$]$$#&$4$$%$%$&$'$& ".:2#"&54672#"&546#2#"&54672#"&546#2#"&546%$%$%$%$&%%$%$%$%$%$]$4$$%$%$%$&$&$$#&$%$% "-2#"&546#"&5463272#"&54672"&546%$%$f$%$%%$%$%%2%$]$$#&?$#&$$4$$%$'$& !-92#"&546#"&5463272#"&54672#"&546#2#"&546%$%$f$%$%$%$%$%$&$%#]$4$$%$4$$%$%$%$$#&$%$% ".92#"&546#"&5463272#"&546#2#"&54672"&546%$%$f$%$%%$%$&$%$%%2%$]$$#&?$#&$$4$$%$&$&$'$& !-9E2#"&546#"&5463272#"&546#"&5463272#"&546#2#"&546%$%$f$%$%$%$e'%$&%$%$&$%#]$4$$%$4$$%$%$%?%$&$$$#&$%$%l 72#"&546%$%$$&$&l 6#"&546322#"&546$%$&$%$X4$$%8$&$&l 72#"&5462#"&546%$%$%$%$Y$%$&z$&$&l "6#"&546322#"&54672#"&546$%$%$%$&$%$X4$$%z$%$%$&$&k 72#"&54672#"&546%$%$&%%$5$%$%$%$&k "72#"&54672#"&5462#"&546%$%$&$&$&$%$|$4$$%$%$&z$&$&k #72#"&5467#"&54632'2#"&546%$%$X$%$&>%$%$Y$%$&~##&$$&$&k ".72#"&54672#"&54672#"&54672#"&546%$%$&$&$%$%$&$%$|$4$$%$%$&$%$%$&$& %#"&546322#"&546 $%$&%$%$=##&$[$%$% "$#"&546322#"&546'2#"&546 $%$%$%$%$%$X4$$%7$%$%$&$& #%#"&546322#"&54672#"&546 $%$&?&$%$%$%$=##&$$%$%$%$% ".$#"&546322#"&54672#"&546'2#"&546 $%$&$%$%$%$%$%$X4$$%z$%$%$%$%$&$& #%#"&54632'2#"&5462#"&546 $%$&?%$%$%$%$=$#&$$%$%z$%$% ".$#"&54632'2#"&5462#"&546'2#"&546 $%$%$%$%$%$&%%#X4$$%$%$&y$%$%$%$& #/%#"&54632'2#"&54672#"&54672#"&546 $%$&?%$%$&$%$%$%$=$#&$$%$%$%$%$%$% ".:$#"&54632'2#"&54672#"&54672#"&546'2#"&546 $%$%$%$&$%$%$%$&%%#X4$$%$%$&$%$%$%$%$%$& 72#"&5462#"&546&%%$%$%$Y$%$&z$%$% "$#"&546322#"&546'2#"&546 $%$%$%$%$%$X4$$%{$&$&$&$& #72#"&5462#"&546#2#"&546&%%$%$%$&%%$Y$%$&z$%$%$&$& ".$#"&546322#"&5462#"&54672#"&546 $%$%$%$&$%$%$%$X4$$%{$&$&$%$%$&$& "72#"&54>#"&5463272#"&546&$%$X$%$%$%$Y$&$&4$$%$%$% ".$#"&54632'2#"&54672#"&546'2#"&546 $%$%$%$%$%$&%%#X4$$%$%$&$&$&$%$& ".72#"&54>#"&5463272#"&546#"&54632&$%$X$%$%$%$e'%$&Y$&$&4$$%$%$%?%$&$ ".:$#"&54632'2#"&54672#"&5462#"&54672#"&546 $%$%$%$%$%$&$%$&%%#X4$$%$%$&$&$&$%$%$%$& #%#"&546322#"&54672#"&546 $%$&%$%$%$%$=##&$$%$&$%$% ".$#"&546322#"&54672#"&546'2#"&546 $%$%$%$%$%$%$%$X4$$%{$&$&$%$%$&$& #/%#"&546322#"&5462#"&54672#"&546 $%$&%$%$&$%$%$%$=##&$$%$&$%$%$%$% ".:$#"&546322#"&5462#"&54672#"&546'2#"&546 $%$%$%$&$%$%$%$%$%$X4$$%{$&$&$%$%$%$%$&$& #/%#"&54632'2#"&54672#"&54672#"&546 $%$&?%$%$%$%$%$%$=$#&$$%$%$%$&$%$% ".:$#"&54632'2#"&54672#"&54672#"&546'2#"&546 $%$%$%$%$%$%$%$&%%#X4$$%$%$&$&$&$%$%$%$& #/;%#"&54632'2#"&54672#"&5462#"&54672#"&546 $%$&?%$%$%$%$&$%$%$%$=$#&$$%$%$%$&$%$%$%$% ".:F$#"&54632'2#"&54672#"&5462#"&54672#"&546'2#"&546 $%$%$%$%$%$&$%$%$%$&%%#X4$$%$%$&$&$&$%$%$%$%$%$& %2#"&5462#"&546%$%$&$%$$&$&$%$% "2#"&546#"&546322#"&546%$%$e$%$%$%$:$%$&4$$%8$&$& #2#"&5462#"&5462#"&546%$%$&$%$&%%$$$#&$%$&z$%$& ".2#"&546#"&546322#"&54672#"&546%$%$e$%$&$%$%$%$:$%$&4$$%z$%$%$&$& #%2#"&5462#"&54672#"&546%$%$&$%$%$%$$&$&$%$%$&$& ".2#"&546#"&54632'2#"&5462#"&546%$%$e$%$%$%$&%%#:$%$&4$$%$%$&z$%$& #/2#"&5462#"&5467#"&54632'2#"&546%$%$&$%$X$%$%>&$%$$$#&$%$&~$#&$$&$& ".:2#"&546#"&54632'2#"&54672#"&54672#"&546%$%$e$%$%$%$&$%$&%%#:$%$&4$$%$%$&$%$%$%$& #2#"&546#"&546322#"&546%$%$e$%$&%$%$9$%$%##&$[$%$% ".2#"&546#"&546322#"&546'2#"&546%$%$e$%$%$%$%$%$:$%$&4$$%7$%$%$&$& #/2#"&546#"&546322#"&54672#"&546%$%$e$%$&?&$%$%$%$9$%$%##&$$%$%$%$% ".:2#"&546#"&546322#"&54672#"&546'2#"&546%$%$e$%$&$%$%$%$%$%$:$%$&4$$%z$%$%$%$%$&$& #/2#"&546#"&54632'2#"&5462#"&546%$%$e$%$&?%$%$%$%$9$%$%$#&$$%$%z$%$% ".:2#"&546#"&54632'2#"&5462#"&546'2#"&546%$%$e$%$%$%$%$%$&%%#:$%$&4$$%$%$&y$%$%$%$& #/;2#"&546#"&54632'2#"&54672#"&54672#"&546%$%$e$%$&?%$%$&$%$%$%$9$%$%$#&$$%$%$%$%$%$% ".:F2#"&546#"&54632'2#"&54672#"&54672#"&546'2#"&546%$%$e$%$%$%$&$%$%$%$&%%#:$%$&4$$%$%$&$%$%$%$%$%$& "2#"&5462#"&5462#"&546%$%$&%%$%$%$$4$$%$%$&z$%$% ".2#"&546#"&546322#"&546'2#"&546%$%$e$%$%$%$%$%$:$%$&4$$%{$&$&$&$& ".2#"&5462#"&5462#"&546#2#"&546%$%$&%%$%$%$&%%$$4$$%$%$&z$%$%$&$& ".2#"&546#"&546322#"&54672#"&546%$%$e$%$&$%$%$%$:$%$&4$$%z$%$%$&$& !-2#"&5462#"&54>#"&5463272#"&546%$%$&$%$X$%$%$%$$4$$%$&$&4$$%$%$% ".:2#"&546#"&54632'2#"&54672#"&546'2#"&546%$%$e$%$%$%$%$%$&%%#:$%$&4$$%$%$&$&$&$%$& !-92#"&5462#"&54>#"&5463272#"&546#"&54632%$%$&$%$X$%$%$%$e'%$&$4$$%$&$&4$$%$%$%?%$&$ ".:F2#"&546#"&54632'2#"&54672#"&5462#"&54672#"&546%$%$e$%$%$%$%$%$&$%$&%%#:$%$&4$$%$%$&$&$&$%$%$%$& #/2#"&546#"&546322#"&54672#"&546%$%$e$%$&%$%$%$%$9$%$%##&$$%$&$%$% ".:2#"&546#"&546322#"&54672#"&546'2#"&546%$%$e$%$%$%$%$%$%$%$:$%$&4$$%{$&$&$%$%$&$& #/;2#"&546#"&546322#"&5462#"&54672#"&546%$%$e$%$&%$%$&$%$%$%$9$%$%##&$$%$&$%$%$%$% ".:F2#"&546#"&546322#"&5462#"&54672#"&546'2#"&546%$%$e$%$%$%$&$%$%$%$%$%$:$%$&4$$%{$&$&$%$%$%$%$&$& #/;2#"&546#"&54632'2#"&54672#"&54672#"&546%$%$e$%$&?%$%$%$%$%$%$9$%$%$#&$$%$%$%$&$%$% ".:F2#"&546#"&54632'2#"&54672#"&54672#"&546'2#"&546%$%$e$%$%$%$%$%$%$%$&%%#:$%$&4$$%$%$&$&$&$%$%$%$& #/;G2#"&546#"&54632'2#"&54672#"&5462#"&54672#"&546%$%$e$%$&?%$%$%$%$&$%$%$%$9$%$%$#&$$%$%$%$&$%$%$%$% ".:FR2#"&546#"&54632'2#"&54672#"&5462#"&54672#"&546'2#"&546%$%$e$%$%$%$%$%$&$%$%$%$&%%#:$%$&4$$%$%$&$&$&$%$%$%$%$%$&p %2#"&546%$%$$&$& $#"&546322#"&546$%$%$%$X4$$%8$&$& %2#"&5462#"&546&$%$&$%$Y$%$&z$&$& "$#"&546322#"&54672#"&546$%$&$%$&%%#X4$$%z$%$%$%$& %2#"&546'2#"&546&$%$%$%$5$%$%$&$& "$#"&54632'2#"&5462#"&546$%$%$%$&%%#X4$$%$%$&z$%$& #%2#"&546'#"&54632'2#"&546&$%$e$%$%>&$%$Y$%$&~$#&$$&$& ".$#"&54632'2#"&54672#"&54672#"&546$%$%$%$&$%$&%%#X4$$%$%$&$%$%$%$&p %#"&546322#"&546$%$%>&$%$=$#&$[$%$% "$#"&546322#"&546'2#"&546$%#%$%$%$%$X4$$%7$%$%$&$& #%#"&546322#"&54672#"&546$%$&&$%$%$%$=##&$$%$%$%$% ".$#"&546322#"&54672#"&546'2#"&546$%$&$%$%$%$%$%$X4$$%z$%$%$%$%$&$& #%#"&54632'2#"&5462#"&546$%$&%$%$%$%$=##&$$%$%z$%$% ".$#"&54632'2#"&5462#"&546'2#"&546$%$%$%$%$%$&%%#X4$$%$%$&y$%$%$%$& #/%#"&54632'2#"&54672#"&54672#"&546$%$&%$%$&$%$%$%$=##&$$%$%$%$%$%$% ".:$#"&54632'2#"&54672#"&54672#"&546'2#"&546$%$%$%$&$%$%$%$&%%#X4$$%$%$&$%$%$%$%$%$&p %2#"&5462#"&546%$%$&$%$Y$&$&z$%$% "$#"&546322#"&546'2#"&546$%#%$%$%$%$X4$$%{$&$&$&$& #%2#"&5462#"&546#2#"&546&%%$%$%$&%%$Y$%$&z$%$%$&$& ".$#"&546322#"&5462#"&54672#"&546$%$%$%$&$%$%$%$X4$$%{$&$&$%$%$&$& "%2#"&546&#"&5463272#"&546&%%$e$%$%$%$Y$%$&4$$%$%$% ".$#"&54632'2#"&54672#"&546'2#"&546$%$%$%$%$%$&%%#X4$$%$%$&$&$&$%$& ".%2#"&546&#"&5463272#"&546#"&54632&%%$e$%$%$%$e'%$&Y$%$&4$$%$%$%?%$&$ ".:$#"&54632'2#"&54672#"&5462#"&54672#"&546$%$%$%$%$%$&$%$&%%#X4$$%$%$&$&$&$%$%$%$&p #%#"&546322#"&54672#"&546$%$%>&$%$&$%$=$#&$$%$&$%$% ".$#"&546322#"&54672#"&546'2#"&546$%#%$%$%$%$%$%$X4$$%{$&$&$%$%$&$& #/%#"&546322#"&5462#"&54672#"&546$%$&>%$%$&$%$%$%$=##&$$%$&$%$%$%$% ".:$#"&546322#"&5462#"&54672#"&546'2#"&546$%$%$%$&$%$%$%$%$%$X4$$%{$&$&$%$%$%$%$&$& #/%#"&54632'2#"&54672#"&54672#"&546$%$&%$%$%$%$%$%$=##&$$%$%$%$&$%$% ".:$#"&54632'2#"&54672#"&54672#"&546'2#"&546$%$%$%$%$%$%$%$&%%#X4$$%$%$&$&$&$%$%$%$& #/;%#"&54632'2#"&54672#"&5462#"&54672#"&546$%$&%$%$%$%$&$%$%$%$=##&$$%$%$%$&$%$%$%$% ".:F$#"&54632'2#"&54672#"&5462#"&54672#"&546'2#"&546$%$%$%$%$%$&$%$%$%$&%%#X4$$%$%$&$&$&$%$%$%$%$%$&p %2#"&54672#"&546%$%$&$%$5$%$%$&$& "$#"&54632'2#"&5462#"&546$%#%$%$%$%$X4$$%$%$&z$&$& #%2#"&54672#"&546'2#"&546&$%$%$%$&%%$Y$%$&$$#&$%$& ".$#"&54632'2#"&546'2#"&54672#"&546$%$%$%$&$%$%$%$X4$$%$%$&$%$%$&$& #%2#"&54672#"&546#2#"&546&$%$%$%$%$%$5$%$%$&$&$&$& ".$#"&54632'2#"&546#2#"&5462#"&546$%$%$%$%$%$&%%#X4$$%$%$&$%$&z$%$& #/%2#"&54672#"&546#"&54632'2#"&546&$%$%$%$f$%$%>&$%$Y$%$&$$#&?$#&$$&$& ".:$#"&54632'2#"&546#2#"&54672#"&54672#"&546$%$%$%$%$%$&$%$&%%#X4$$%$%$&$%$&$%$%$%$&p #%#"&54632'2#"&5462#"&546$%$%>&$%$&$%$=$#&$$%$%z$%$% ".$#"&54632'2#"&5462#"&546'2#"&546$%#%$%$%$%$%$%$X4$$%$%$&y$%$%$&$& #/%#"&54632'2#"&546'2#"&54672#"&546$%$&>%$%$&$%$%$%$=##&$$%$%$%$%$%$% ".:$#"&54632'2#"&546'2#"&54672#"&546'2#"&546$%$%$%$&$%$%$%$%$%$X4$$%$%$&$%$%$%$%$&$& #/%#"&54632'2#"&546#2#"&5462#"&546$%$&>%$%$%$%$%$%$=##&$$%$%$%$%z$%$% ".:$#"&54632'2#"&546#2#"&5462#"&546'2#"&546$%$%$%$%$%$%$%$&%%#X4$$%$%$&$%$&y$%$%$%$& #/;%#"&54632'2#"&546#2#"&54672#"&54672#"&546$%$&>%$%$%$%$&$%$%$%$=##&$$%$%$%$%$%$%$%$% ".:F$#"&54632'2#"&546#2#"&54672#"&54672#"&546'2#"&546$%$%$%$%$%$&$%$%$%$&%%#X4$$%$%$&$%$&$%$%$%$%$%$&p "%2#"&54>#"&54632'2#"&546%$%$Y$%$&$%$Y$&$&4$$%$%$% ".$#"&54632'2#"&54672#"&546'2#"&546$%#%$%$%$%$%$%$X4$$%$%$&$&$&$&$& ".%2#"&54672#"&54672#"&546#2#"&546&%%$%$%$%$%$&%%$Y$%$&$4$$%$%$%$&$& ".:$#"&54632'2#"&54672#"&5462#"&54672#"&546$%$%$%$%$%$&$%$%$%$X4$$%$%$&$&$&$%$%$&$& !-%2#"&54672#"&546#"&5463272#"&546&%%$%$%$f$%$%$%$Y$%$&$4$$%$4$$%$%$% ".:$#"&54632'2#"&546#2#"&54672#"&546'2#"&546$%$%$%$%$%$%$%$&%%#X4$$%$%$&$%$&$&$&$%$& !-9%2#"&54672#"&546#"&5463272#"&546#"&54632&%%$%$%$f$%$%$%$e'%$&Y$%$&$4$$%$4$$%$%$%?%$&$ ".:F$#"&54632'2#"&546#2#"&54672#"&5462#"&54672#"&546$%$%$%$%$%$%$%$&$%$&%%#X4$$%$%$&$%$&$&$&$%$%$%$&p #/%#"&54632'2#"&54672#"&54672#"&546$%$%>&$%$&$%$&$%$=$#&$$%$%$%$&$%$% ".:$#"&54632'2#"&54672#"&54672#"&546'2#"&546$%#%$%$%$%$%$%$%$%$X4$$%$%$&$&$&$%$%$&$& #/;%#"&54632'2#"&54672#"&5462#"&54672#"&546$%$&>%$%$%$%$&$%$%$%$=##&$$%$%$%$&$%$%$%$% ".:F$#"&54632'2#"&54672#"&5462#"&54672#"&546'2#"&546$%$%$%$%$%$&$%$%$%$%$%$X4$$%$%$&$&$&$%$%$%$%$&$& #/;%#"&54632'2#"&546#2#"&54672#"&54672#"&546$%$&>%$%$%$%$%$%$%$%$=##&$$%$%$%$%$%$&$%$% ".:F$#"&54632'2#"&546#2#"&54672#"&54672#"&546'2#"&546$%$%$%$%$%$%$%$%$%$&%%#X4$$%$%$&$%$&$&$&$%$%$%$& #/;G%#"&54632'2#"&546#2#"&54672#"&5462#"&54672#"&546$%$&>%$%$%$%$%$%$&$%$%$%$=##&$$%$%$%$%$%$&$%$%$%$% ".:FR$#"&54632'2#"&546#2#"&54672#"&5462#"&54672#"&546'2#"&546$%$%$%$%$%$%$%$&$%$%$%$&%%#X4$$%$%$&$%$&$&$&$%$%$%$%$%$& %2#"&546#2#"&546&%%$&$%$$%$&$&$& !$#"&54632#"&546322#"&546$%$$%$&%%#X4$$%$4$$%8$%$& #%2#"&546#2#"&5462#"&546&$%$&$%$&$%$Y$%$&$%$&z$&$& !-$#"&54632#"&546322#"&54672#"&546$%$$%$&$%$&%%#X4$$%$4$$%z$%$%$%$& #%2#"&546#2#"&54672#"&546&$%$&$%$%$%$5$%$%$%$%$&$& !-$#"&54632#"&54632'2#"&5462#"&546$%$$%$%$%$&%%#X4$$%$4$$%$%$&z$%$& #/%2#"&546#2#"&5467#"&54632'2#"&546&$%$&$%$X$%$%>&$%$Y$%$&$%$&~$#&$$&$& !-9$#"&54632#"&54632'2#"&54672#"&54672#"&546$%$$%$%$%$&$%$&%%#X4$$%$4$$%$%$&$%$%$%$& #%#"&54632#"&546322#"&546$%$&$%$&%$%$=##&$##&$[$%$% !-$#"&54632#"&546322#"&546'2#"&546$%$$%$%$%$%$%$X4$$%$4$$%7$%$%$&$& #/%#"&54632#"&546322#"&54672#"&546$%$&$%$&?&$%$%$%$=##&$##&$$%$%$%$% !-9$#"&54632#"&546322#"&54672#"&546'2#"&546$%$$%$&$%$%$%$%$%$X4$$%$4$$%z$%$%$%$%$&$& #/;%#"&54632#"&54632'2#"&54672#"&54672#"&546$%$&$%$&?%$%$&$%$%$%$=##&$$#&$$%$%$%$%$%$% !-9$#"&54632#"&54632'2#"&5462#"&546'2#"&546$%$$%$%$%$%$%$&%%#X4$$%$4$$%$%$&y$%$%$%$& #/;%#"&54632#"&54632'2#"&54672#"&54672#"&546$%$&$%$&?%$%$&$%$%$%$=##&$$#&$$%$%$%$%$%$% !-9E$#"&54632#"&54632'2#"&54672#"&54672#"&546'2#"&546$%$$%$%$%$&$%$%$%$&%%#X4$$%$4$$%$%$&$%$%$%$%$%$& #%2#"&546#2#"&5462#"&546&%%$&%%$%$%$Y$%$&$%$&z$%$% !-$#"&54632#"&546322#"&546'2#"&546$%$$%$%$%$%$%$X4$$%$4$$%{$&$&$&$& #/%2#"&546#2#"&5462#"&546#2#"&546&%%$&%%$%$%$&%%$Y$%$&$%$&z$%$%$&$& !-9$#"&54632#"&546322#"&5462#"&54672#"&546$%$$%$%$%$&$%$%$%$X4$$%$4$$%{$&$&$%$%$&$& ".%2#"&546#2#"&54>#"&5463272#"&546&%%$&$%$X$%$%$%$Y$%$&$&$&4$$%$%$% !-9$#"&54632#"&54632'2#"&54672#"&546'2#"&546$%$$%$%$%$%$%$&%%#X4$$%$4$$%$%$&$&$&$%$& ".:%2#"&546#2#"&54>#"&5463272#"&546#"&54632&%%$&$%$X$%$%$%$e'%$&Y$%$&$&$&4$$%$%$%?%$&$ !-9E$#"&54632#"&54632'2#"&54672#"&5462#"&54672#"&546$%$$%$%$%$%$%$&$%$&%%#X4$$%$4$$%$%$&$&$&$%$%$%$& #/%#"&54632#"&546322#"&54672#"&546$%$&$%$&%$%$%$%$=##&$##&$$%$&$%$% !-9$#"&54632#"&546322#"&54672#"&546'2#"&546$%$$%$%$%$%$%$%$%$X4$$%$4$$%{$&$&$%$%$&$& #/;%#"&54632#"&546322#"&5462#"&54672#"&546$%$&$%$&%$%$&$%$%$%$=##&$##&$$%$&$%$%$%$% !-9E$#"&54632#"&546322#"&5462#"&54672#"&546'2#"&546$%$$%$%$%$&$%$%$%$%$%$X4$$%$4$$%{$&$&$%$%$%$%$&$& #/;%#"&54632#"&54632'2#"&54672#"&54672#"&546$%$&$%$&?%$%$%$%$%$%$=##&$$#&$$%$%$%$&$%$% !-9E$#"&54632#"&54632'2#"&54672#"&54672#"&546'2#"&546$%$$%$%$%$%$%$%$%$&%%#X4$$%$4$$%$%$&$&$&$%$%$%$& #/;G%#"&54632#"&54632'2#"&54672#"&5462#"&54672#"&546$%$&$%$&?%$%$%$%$&$%$%$%$=##&$$#&$$%$%$%$&$%$%$%$% !-9EQ$#"&54632#"&54632'2#"&54672#"&5462#"&54672#"&546'2#"&546$%$$%$%$%$%$%$&$%$%$%$&%%#X4$$%$4$$%$%$&$&$&$%$%$%$%$%$& #%2#"&54672#"&5462#"&546&$%$%$%$&$%$5$%$%$&$&$%$% !-$#"&54632'2#"&546#"&546322#"&546$%$%$%$e$%$%$%$X4$$%$%$&4$$%8$&$& #/%2#"&54672#"&5462#"&5462#"&546&$%$%$%$&$%$&%%$Y$%$&$$#&$%$&z$%$& !-9$#"&54632'2#"&546#"&546322#"&54672#"&546$%$%$%$e$%$&$%$%$%$X4$$%$%$&4$$%z$%$%$&$& #/%2#"&54672#"&5462#"&54672#"&546&$%$%$%$&$%$%$%$5$%$%$&$&$%$%$&$& !-9$#"&54632'2#"&546#"&54632'2#"&5462#"&546$%$%$%$e$%$%$%$&%%#X4$$%$%$&4$$%$%$&z$%$& #/;%2#"&54672#"&5462#"&5467#"&54632'2#"&546&$%$%$%$&$%$X$%$%>&$%$Y$%$&$$#&$%$&~$#&$$&$& !-9E$#"&54632'2#"&546#"&54632'2#"&54672#"&54672#"&546$%$%$%$e$%$%$%$&$%$&%%#X4$$%$%$&4$$%$%$&$%$%$%$& #/%#"&54632'2#"&546#"&546322#"&546$%$&>%$%$e$%$&%$%$=##&$$%$%##&$[$%$% !-9$#"&54632'2#"&546#"&546322#"&546'2#"&546$%$%$%$e$%$%$%$%$%$X4$$%$%$&4$$%7$%$%$&$& #/;%#"&54632'2#"&546#"&546322#"&54672#"&546$%$&>%$%$e$%$&?&$%$%$%$=##&$$%$%##&$$%$%$%$% !-9E$#"&54632'2#"&546#"&546322#"&54672#"&546'2#"&546$%$%$%$e$%$&$%$%$%$%$%$X4$$%$%$&4$$%z$%$%$%$%$&$& #/;%#"&54632'2#"&546#"&54632'2#"&5462#"&546$%$&>%$%$e$%$&?%$%$%$%$=##&$$%$%$#&$$%$%z$%$% !-9E$#"&54632'2#"&546#"&54632'2#"&5462#"&546'2#"&546$%$%$%$e$%$%$%$%$%$&%%#X4$$%$%$&4$$%$%$&y$%$%$%$& #/;G%#"&54632'2#"&546#"&54632'2#"&54672#"&54672#"&546$%$&>%$%$e$%$&?%$%$&$%$%$%$=##&$$%$%$#&$$%$%$%$%$%$% !-9EQ$#"&54632'2#"&546#"&54632'2#"&54672#"&54672#"&546'2#"&546$%$%$%$e$%$%$%$&$%$%$%$&%%#X4$$%$%$&4$$%$%$&$%$%$%$%$%$& ".%2#"&54672#"&5462#"&5462#"&546&%%$%$%$&%%$%$%$Y$%$&$4$$%$%$&z$%$% !-9$#"&54632'2#"&546#"&546322#"&546'2#"&546$%$%$%$e$%$%$%$%$%$X4$$%$%$&4$$%{$&$&$&$& ".:%2#"&54672#"&5462#"&5462#"&546#2#"&546&%%$%$%$&%%$%$%$&%%$Y$%$&$4$$%$%$&z$%$%$&$& !-9E$#"&54632'2#"&546#"&546322#"&5462#"&54672#"&546$%$%$%$e$%$%$%$&$%$%$%$X4$$%$%$&4$$%{$&$&$%$%$&$& "-9%2#"&54672#"&5462#"&54>#"&5463272#"&546&%%$%$%$&$%$X$%$%$%$Y$%$&$4$$%$&$&4$$%$%$% !-9E$#"&54632'2#"&546#"&54632'2#"&54672#"&546'2#"&546$%$%$%$e$%$%$%$%$%$&%%#X4$$%$%$&4$$%$%$&$&$&$%$& "-9E%2#"&54672#"&5462#"&54>#"&5463272#"&546#"&54632&%%$%$%$&$%$X$%$%$%$e'%$&Y$%$&$4$$%$&$&4$$%$%$%?%$&$ !-9EQ$#"&54632'2#"&546#"&54632'2#"&54672#"&5462#"&54672#"&546$%$%$%$e$%$%$%$%$%$&$%$&%%#X4$$%$%$&4$$%$%$&$&$&$%$%$%$& #/;%#"&54632'2#"&546#"&546322#"&54672#"&546$%$&>%$%$e$%$&%$%$%$%$=##&$$%$%##&$$%$&$%$% !-9E$#"&54632'2#"&546#"&546322#"&54672#"&546'2#"&546$%$%$%$e$%$%$%$%$%$%$%$X4$$%$%$&4$$%{$&$&$%$%$&$& #/;G%#"&54632'2#"&546#"&546322#"&5462#"&54672#"&546$%$&>%$%$e$%$&%$%$&$%$%$%$=##&$$%$%##&$$%$&$%$%$%$% !-9EQ$#"&54632'2#"&546#"&546322#"&5462#"&54672#"&546'2#"&546$%$%$%$e$%$%$%$&$%$%$%$%$%$X4$$%$%$&4$$%{$&$&$%$%$%$%$&$& #/;G%#"&54632'2#"&546#"&54632'2#"&54672#"&54672#"&546$%$&>%$%$e$%$&?%$%$%$%$%$%$=##&$$%$%$#&$$%$%$%$&$%$% !-9EQ$#"&54632'2#"&546#"&54632'2#"&54672#"&54672#"&546'2#"&546$%$%$%$e$%$%$%$%$%$%$%$&%%#X4$$%$%$&4$$%$%$&$&$&$%$%$%$& #/;GS%#"&54632'2#"&546#"&54632'2#"&54672#"&5462#"&54672#"&546$%$&>%$%$e$%$&?%$%$%$%$&$%$%$%$=##&$$%$%$#&$$%$%$%$&$%$%$%$% !-9EQ]$#"&54632'2#"&546#"&54632'2#"&54672#"&5462#"&54672#"&546'2#"&546$%$%$%$e$%$%$%$%$%$&$%$%$%$&%%#X4$$%$%$&4$$%$%$&$&$&$%$%$%$%$%$&XX& yJXX 2"&546.'!355!#>1x}_a _^X{|}|__XX "2"&5467&#"7327'654'1x-H\ag?=IaaI=@X{|}|e=YI``H@@I^`J+-& y(0'332653#"&5%32+#"=#"4;5432(+z^\~+ginnnn[jlYef4([[(f(0 !"5!"5((H(z^(0 !42!420((^Eq %5'?'S显ded|S33R3?+!7'&54?'&547637#"'&'"?7_   e2_ 3b?+ N@?, N@@+ N"GF@*.#!#"/7632!2.  F^ SE@ SE@?+7'&54?'&547637#"/"_2_ >+ V@?+ V@?+ V"G7#"/7632354632#"=    5 ZF@2& 2&@2& &@2& 2&@2& &@#5%7' ,  8&  #5 `X#5 `#5@#5 `5@WX3!VXWX3!%!!VX("h53x"}}"h35#53(((xJ-U}}R0%!&&q[R0 !'%!5^1_&&qJ"+-E %%'7-ؕ(||#%O%%%ؕ(%M'!!Mו)&XX 2"&5461xX{|}|Y!'7,Y%7''7,8x'+x'77+}}~񤤭LM%'7.L~QB'+WWUBs~~N?'77+WWUU ?s~~11::D> hD@D> iD@c"%#"&547%632'#"&547%632  \    \          6jvwG @S#"'4&54632RL_ OS#"/&54632RL S;26=4&+"+"&=46;2|!!!!(55((55(X###D55DD55DS,37632+"&=463!54&+"#"546;2!";254#"YR?;\6''6,!!+26'!!];Q*)).[4E+D3?""804EW"M"4,S!&546323632  wSS-4%+"&=%54&+"32+546;2;>3#"325*26'!!Dm'66'w!) 1;QQ+L;H804E ""-E44E " 6!)^4S8%4&+"32+4326;2#"54326!NT;d6l6'13!`"^X0F4EhK.S3#"&=463!#"=!";2D6''6U!!=4EE4h?""S *7#"543232#"&546;54&+!#"325|j6''6*.3%4!T`444EE45-"2"?S235#"54?632+"&=46;2+";265#"54,!  =  (55('6]V!!!,˜!  =  D55DD4"""1S%+"&5432;26=432'66'!!yE44E3""S12+;26=4&+"54;2+"&54632#"/,!!!V]6'(55( =  !"""4DD55D =  !S(.3#546?54#"#"54632732#"54;4&+3%>%!3NIj6']4!RZ)BP4(03[L9#8/ak4E1"=b+ S *72+;26=!546;2+"&=%4&+"!P!!w'66''66'!!`)""UE44EE44EA""=S!732+432732#"54;5!7!54&+|;dq6'd;#=![)4E|)"S-354&+";26=#"54;+"&=46;2#"54P!!!!Py'66''66'y7#""""$32#"'32+574&'#"&46;2#"54;4&+"3$$<+"//"2]:4))46']4!!!$$"/D/-2n24E1"F).3"54;5463!54&+"#"546;2#"54326=!"H '6,!!+26'13!!yE4?""804EK.""S84!#"54;'&54632654&#"32#"&5432>32y 6deXMV!7-W0]MB X C36VhY",M)$)\Y>O Z S8C32+;26=4&+"32+546;2+"';26=#"54;#!"&SyP!!!!Py'66''6 En$00$Z#""""$00S 3%#"3257#"'%632#"&546;.#"#"543224) `P@L2(5*26&* c7,c! v| ?`T"K5D57+!/1>"}fS S8;532+;26=%546;2#"54;54&+"+"'32#"&SmD!!w'66'mD!!'6 "5/O"" E44E-"" E4 m"2S *!#"&=46;2;26=#"54;-54&+"6''66'w!!Py'`!!4EE44E "")AE4 ""S/1#"!232+4&#!32#"&546;2#"54;4&!,6' 4!!31'60$oFm"l4EZ"".KE40>S(+%6=4&+"54;2+"&=46;2+"73'!5((55((5!ss1*#5DD55DD5#+ S ~S S8 S-"+"&532+;26=46;2#"54;4&#/C46'd;!/C46'd;!$A84EI"$A84E1"S8J!"&=4&+"32#"&=46;2;26=4&#"5432+"&=32+;26=#4C/!!7-'64C/!!7-'66'yP!!8A$"",ME48A$"",MjE4/D"# "l S S8C#!"&=32+;26=+"&=46;2#"54;54&+";26=#"54;$00$nE 6''66'yP!!!!PyZ>00>& r 4EE44E<$""""#S8 &7;5432#"543265#"&53'>=|!R04!j6'B5"iK."a4EIzOOQS#5373+"&=32+;267'#"S--(55(yP!!2llD55DA)"#.rqcS#732+34&+"32+546;2#|;d-\!!Py(55(0)w""*D55DS:7";26=#"54;+"&547.546;2#"54;54&+"32n!!Py'66'?'66'yP!!87h# ")AE44EK$*E44EA)" #4%S$%#"54326=#"&532+;5#"54;-7!j6'yP!RPyyM,"4EI"WS *32+"&=%54&+"32+546 ;2656''66'!!Py'b!!4EE44E "")AE4 ""S%%+"&=46;2'&+"26%;26="(55((55(7WhW!!HyD55DD55DA5FF##pD462"#m#"'%&54632| -_`'m"&54?62"'ԅ    C\  dd  Gam+"&=3;26=$0r0$)dm>00>%%Gam&  & 8)%";26=3+"&546$.B()#16VU)).'&>0A;<98)&  S62>32".54632\M(" A3*1?X )\;?"&#"354632#"&#"32+32#!"54;#"54;546323*'?,D 3'HHHSMM?," r22%;;5K 2%;O;5K OM\$(32#!"54;#"54;54632#"&#"#KSMM?,D 3'O;5K 2%;OG \%32#!"54;#"54;5463#"32+MtSMM?,XX&HH\O;5K 2%;G\:>%#32#!"54;#"54;54632#"&#"354632#"&#"3؄+B<=VJJ'HSMM?,5)||;., X?`2%MO;5K4k3A sI't43232>32#"& B&E,)I`.56Zq'<$7#"&546;3>7#"&546;#!"&5463B] I8 %""V ( AR )  I3*  TP  </4632>=#"&546;#"'32+547'&< :?5 ^| ;>5 ^| 8,~  d6| 8,~  f4|<!"&5463!2+#"&5  Y     ] < &74632#"&!2#"&5.'.'!"&546_   +JW   #'   PW %&%   <%2#!"&546;>=.'.'#"&5463T'- MS &%(  %& #>)NY   (&%%'   <i!"&54?>=!54632!  I  +  ~ u-+< !.'72!4?#"&5463hi (%&'- E*K h&%( )#>))*K  <!2#"&5.'.'!"&546P+JW   #' PW %&%   *2#"&5.'.'#+"&546;>7#"&5463}13   $'|+ $0)Z  !G2 %'# ˂  !65  H"54;543232#c3BW&1:W&3BW&&i1:W&&i<&<8&<'<0&&2<&<&@&&& @&V<8&<&<i& 0<&&<&<8&f,<&g42&18&<&3:&i&,@W&<0E&<E&<E&<i"%#"'&=4632>=#"&546; I  :?5 ^|   8,~  d6|o)-32=63232=>54&#"";264&# D=>PMX^GbP(?> E%D)"?2+E%D),L8EUA,,FF5E+Z- +  Q$iR D2 $      V  6   % V1  H       `N @ $  !" $& 'n*-d   2    Copyleft 2002, 2003, 2005, 2008, 2009, 2010 Free Software Foundation.Copyleft 2002, 2003, 2005, 2008, 2009, 2010 Free Software Foundation.FreeMonoFreeMonoMediumMediumFontForge 2.0 : Free Monospaced : 16-9-2010FontForge 2.0 : Free Monospaced : 16-9-2010Free MonospacedFree MonospacedVersion $Revision: 1.215 $ Version $Revision: 1.215 $ FreeMonoFreeMonoGNUGNUhttps://savannah.gnu.org/projects/freefont/https://savannah.gnu.org/projects/freefont/This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.htmlthng?@O<V9NormalNormalNormalNormalNormalnavadnoNormlne1KG=K9NormalNormalNormalNormalnyNormalnormalusisvidjsNormalemenengahNormlStandardNormalNormalNormaaliStandaardnormaloby ejnNormal=>@<0;5=Arrunta2   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  softhyphenmicromiddotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccentGcedilla gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflexKcedillakcedilla kgreenlandicLacutelacuteLcedillalcedillaLcaronlcaronLdotldotNacutenacuteNcedillancedillaNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracuteRcedillarcedillaRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9yoghtailuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233dotlessjuni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cepsilonlatinrevhookepsilonlatinrevcloseduni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276 omegacloseduni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289 upsilonlatinvhookuni028Cuni028Duni028Euni028Funi0290uni0291uni0292ezhcurluni0294uni0295uni0296uni0297uni0298uni0299 epsiloncloseduni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4dzcurluni02A6uni02A7tccurluni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AF hsuperior hhooksuperjsuperrsuper rturnsuperrturnrthooksuper Rturnsuperwsuperysuperprimemod primedblmod quoteleftmod apostrophe apostropherev ringhalfright ringhalfleftuni02C0uni02C1arrowheadleftmoduni02C3uni02C4uni02C5verticallinemoduni02C9 acutemodifieruni02CBuni02CCuni02CD gravelowmoduni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6minusmoduni02DEuni02DF gammasuperlsuperssuperxsuperglottalrevsuperuni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecomb circumflexcmb tildecomb macroncomb overlinecmbbrevecmb dotaccentcmb diaeresiscomb hookabovecombringcmbhungarumlautcmbcaroncmb linevertnosplinevertdblnosp gravedblnospbreve_dotaccentuni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031ahorncmbuni031cuni031duni031euni031funi0320hooksubpalatnosphooksubretronosp dotbelowcombuni0324uni0325 commasubnosp cedillacmb ogonekcmbuni0329uni032auni032buni032Cuni032Duni032Euni032Funi0330macronbelowcmbuni0332uni0333tildeoverlaycmbstrokeshortoverlaycmbstrokelongoverlaycmbslashshortnosp slashlongnospringrighthalfsubnospuni033Auni033buni033cuni033duni033eoverscoredblnospuni0340uni0341perispomenigreekcmbuni0343dialytikatonoscmbypogegrammenigreekcmbuni0346uni0347uni0348uni0349uni034Buni034cuni034duni0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035anumeralsigngreeknumeralsignlowergreek ypogegrammeni questiongreektonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrho sigmafinalsigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosbetasymbolgreekthetasymbolgreekUpsilonhooksymbolUpsilonhooktonosUpsilonhookdiaeresisphisymbolgreekomegapi StigmagreekstigmaDigamma kappascriptrhosymbolgreekuni03f4uni03F5uni0400 Iocyrillic Djecyrillic Gjecyrillic Ecyrillic Dzecyrillic Icyrillic Yicyrillic Jecyrillic Ljecyrillic Njecyrillic Tshecyrillic Kjecyrillicuni040DUshortcyrillic Dzhecyrillic Acyrillic Becyrillic Vecyrillic Gecyrillic Decyrillic Iecyrillic Zhecyrillic Zecyrillic IicyrillicIishortcyrillic Kacyrillic Elcyrillic Emcyrillic Encyrillic Ocyrillic Pecyrillic Ercyrillic Escyrillic Tecyrillic Ucyrillic Efcyrillic Khacyrillic Tsecyrillic Checyrillic Shacyrillic ShchacyrillicHardsigncyrillic YericyrillicSoftsigncyrillicEreversedcyrillic IUcyrillic IAcyrillic acyrillic becyrillic vecyrillic gecyrillic decyrillic iecyrillic zhecyrillic zecyrillic iicyrilliciishortcyrillic kacyrillic elcyrillic emcyrillic encyrillic ocyrillic pecyrillic ercyrillic escyrillic tecyrillic ucyrillic efcyrillic khacyrillic tsecyrillic checyrillic shacyrillic shchacyrillichardsigncyrillic yericyrillicsoftsigncyrillicereversedcyrillic iucyrillic iacyrillicuni0450 iocyrillic djecyrillic gjecyrillic ecyrillic dzecyrillic icyrillic yicyrillic jecyrillic ljecyrillic njecyrillic tshecyrillic kjecyrillicuni045Dushortcyrillic dzhecyrillic Omegacyrillic omegacyrillic Yatcyrillic yatcyrillicuni0464YuslittlecyrillicyuslittlecyrillicYuslittleiotifiedcyrillicYusbigcyrillicyusbigcyrillicYusbigiotifiedcyrillicyusbigiotifiedcyrillic Psicyrillic psicyrillic FitacyrillicIzhitsacyrillicizhitsacyrillicIzhitsadblgravecyrillicizhitsadblgravecyrillic Omeghatitlo omeghatitlotitlocyrilliccmbpalatalizationcyrilliccmbdasiapneumatacyrilliccmbpsilipneumatacyrilliccmbuni0487uni048auni048buni048Cuni048Duni048Euni048FGheupturncyrillicgheupturncyrillicGhestrokecyrillicghestrokecyrillicGhemiddlehookcyrillicghemiddlehookcyrillicZhedescendercyrilliczhedescendercyrillicZedescendercyrilliczedescendercyrillicKadescendercyrillickadescendercyrillicKaverticalstrokecyrillickaverticalstrokecyrillicKastrokecyrillickastrokecyrillicKabashkircyrillickabashkircyrillicEndescendercyrillicendescendercyrillic Enghecyrillic enghecyrillicPemiddlehookcyrillicpemiddlehookcyrillicHaabkhasiancyrillichaabkhasiancyrillicEsdescendercyrillicesdescendercyrillicTedescendercyrillictedescendercyrillicUstraightcyrillicustraightcyrillicUstraightstrokecyrillicustraightstrokecyrillicHadescendercyrillichadescendercyrillic Tetsecyrillic tetsecyrillicChedescendercyrillicchedescendercyrillicCheverticalstrokecyrilliccheverticalstrokecyrillic Shhacyrillic shhacyrillicCheabkhasiancyrilliccheabkhasiancyrillicChedescenderabkhasiancyrillicchedescenderabkhasiancyrillicpalochkacyrillicZhebrevecyrilliczhebrevecyrillicKahookcyrillickahookcyrillicuni04C5uni04C6Enhookcyrillicenhookcyrillicuni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFAbrevecyrillicabrevecyrillicAdieresiscyrillicadieresiscyrillic Aiecyrillic aiecyrillicIebrevecyrilliciebrevecyrillic Schwacyrillic schwacyrillicSchwadieresiscyrillicschwadieresiscyrillicZhedieresiscyrilliczhedieresiscyrillicZedieresiscyrilliczedieresiscyrillicDzeabkhasiancyrillicdzeabkhasiancyrillicImacroncyrillicimacroncyrillicIdieresiscyrillicidieresiscyrillicOdieresiscyrillicodieresiscyrillicObarredcyrillicobarredcyrillicObarreddieresiscyrillicobarreddieresiscyrillicuni04ECuni04EDUmacroncyrillicumacroncyrillicUdieresiscyrillicudieresiscyrillicUhungarumlautcyrillicuhungarumlautcyrillicChedieresiscyrillicchedieresiscyrillicuni04f6uni04f7Yerudieresiscyrillicyerudieresiscyrillicuni0510uni0511uni0512uni0513uni051auni051buni051cuni051duni051euni051funi0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556ringhalfleftarmenianapostrophearmenianemphasismarkarmenianexclamarmenian commaarmenianquestionarmenianabbreviationmarkarmenian aybarmenian benarmenian gimarmenian daarmenian echarmenian zaarmenian eharmenian etarmenian toarmenian zhearmenian iniarmenian liwnarmenian xeharmenian caarmenian kenarmenian hoarmenian jaarmenian ghadarmenian cheharmenian menarmenian yiarmenian nowarmenian shaarmenian voarmenian chaarmenian peharmenian jheharmenian raarmenian seharmenian vewarmenian tiwnarmenian reharmenian coarmenian yiwnarmenian piwrarmenian keharmenian oharmenian feharmenianechyiwnarmenianperiodarmenianuni058A shevahebrewhatafsegolhebrewhatafpatahhebrewhatafqamatshebrew hiriqhebrew tserehebrew segolhebrew patahhebrew qamatshebrew holamhebrew qubutshebrew dageshhebrew siluqhebrew maqafhebrew rafehebrew paseqhebrew shindothebrew sindothebrewsofpasuqhebrewupperdothebrew alefhebrew bethebrew gimelhebrew dalethebrewhehebrew vavhebrew zayinhebrew hethebrew tethebrew yodhebrewfinalkafhebrew kafhebrew lamedhebrewfinalmemhebrew memhebrewfinalnunhebrew nunhebrew samekhhebrew ayinhebrew finalpehebrewpehebrewfinaltsadihebrew tsadihebrew qofhebrew reshhebrew shinhebrew tavhebrew vavvavhebrew vavyodhebrew yodyodhebrew gereshhebrewgershayimhebrewuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10f9uni10fbuni10fcuni13A0uni13A1uni13A2uni13A3uni13A4uni13A5uni13A6uni13A7uni13A8uni13A9uni13AAuni13ABuni13ACuni13ADuni13AEuni13AFuni13B0uni13B1uni13B2uni13B3uni13B4uni13B5uni13B6uni13B7uni13B8uni13B9uni13BAuni13BBuni13BCuni13BDuni13BEuni13BFuni13C0uni13C1uni13C2uni13C3uni13C4uni13C5uni13C6uni13C7uni13C8uni13C9uni13CAuni13CBuni13CCuni13CDuni13CEuni13CFuni13D0uni13D1uni13D2uni13D3uni13D4uni13D5uni13D6uni13D7uni13D8uni13D9uni13DAuni13DBuni13DCuni13DDuni13DEuni13DFuni13E0uni13E1uni13E2uni13E3uni13E4uni13E5uni13E6uni13E7uni13E8uni13E9uni13EAuni13EBuni13ECuni13EDuni13EEuni13EFuni13F0uni13F1uni13F2uni13F3uni13F4uni16A0uni16A1uni16A2uni16A3uni16A4uni16A5uni16A6uni16A7uni16A8uni16A9uni16AAuni16ABuni16ACuni16ADuni16AEuni16AFuni16B0uni16B1uni16B2uni16B3uni16B4uni16B5uni16B6uni16B7uni16B8uni16B9uni16BAuni16BBuni16BCuni16BDuni16BEuni16BFuni16C0uni16C1uni16C2uni16C3uni16C4uni16C5uni16C6uni16C7uni16C8uni16C9uni16CAuni16CBuni16CCuni16CDuni16CEuni16CFuni16D0uni16D1uni16D2uni16D3uni16D4uni16D5uni16D6uni16D7uni16D8uni16D9uni16DAuni16DBuni16DCuni16DDuni16DEuni16DFuni16E0uni16E1uni16E2uni16E3uni16E4uni16E5uni16E6uni16E7uni16E8uni16E9uni16EAuni16EBuni16ECuni16EDuni16EEuni16EFuni16F0uni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBClenisprosgegrammenipsili perispomenidialytikaperispomeniuni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCC psili_varia psili_oxiauni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDB dasia_varia dasia_oxiadasia_perispomeniuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECdialytika_variadialytika_oxiavariauni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCoxiadasiaenquademquadenspaceemspaceuni2004uni2005uni2006uni2007uni2008 thinspaceuni200Auni200B afii61664afii301afii299afii300 hyphentwo hyphennobreak figuredash horizontalbardblverticalbar underscoredbl quotereverseduni201Ftrianglebulletonedotenleadertwodotenleaderuni2027uni2028uni2029uni202Auni202B afii61573 afii61574 afii61575uni202Fpertenthousandminutesecond primetriple primereversed primedblrevprimetriplerevuni2038uni203B exclamdbluni203Duni203Euni203Funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064 zerosuperioruni2071 foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni207Auni207Buni207Cparenleftsuperiorparenrightsuperior nsuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferioruni208Auni208Buni208Cparenleftinferiorparenrightinferioruni2090uni2091uni2092uni2093uni2094 colonmonetarycruzeiroliramillnairapesetarupeewon afii57636dongEurouni20ADuni20AEuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5leftharpoonaccentrightharpoonaccentuni20D2uni20D6uni20D7uni20DBuni20DCuni20DDuni20DEuni20DFuni20E0uni20E1uni20e2uni20e3uni20e5uni20e6uni20E8uni20eauni20ebuni20ECuni20EDuni20EEuni20EFuni2100uni2101uni2102uni2103CL afii61248uni2106uni2107scrupleuni2109uni210Dplanck planckover2piuni2110Ifrakturuni2112 afii61289lbbaruni2115 afii61352 recordright weierstrassuni2119uni211ARfrakturuni211D prescription servicemarkuni2121uni2124uni2126uni2127uni2129uni212Auni212B estimateduni2132alephuni2136uni2137uni2138uni2139uni213auni213buni2141uni2142uni2143uni2144uni214buni214duni214eonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217auni217buni217cuni217duni217euni217f arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBharpoonleftbarbuparrowleftbothalfuni21BEuni21BFarrowrighttophalfarrowrightbothalfuni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5arrowsquigglerightuni21e6uni21e7uni21e8uni21e9uni21f3 universaluni2201 existentialuni2204emptyset Delta.mathgradientelement notelementuni220Asuchthatuni220Cuni220Duni220e coproductuni2213uni2214uni2215 backslashmath asteriskmath ringoperatorbulletoperatoruni221Buni221C proportional orthogonalangleuni2221uni2222dividesnotbarparallel notparallel logicaland logicalor intersectionunionuni222Cuni222Duni222Euni222F volintegral clwintegralclwcontintegraluni2233 thereforebecauseratio proportiondotminusexcessgeomproportion homotheticsimilar revsimilarlazysinvsine wreathproductuni2241uni2242uni2243uni2244 congruentapproxnotequaluni2247notalmostequaluni224auni224Buni224cequivasymptoticgeomequivalentuni224Funi2250uni2251uni2252uni2253 colonequal equalcolonuni2256uni2257uni2258uni2259uni225Auni225buni225cuni225duni225euni225f equivalenceuni2262uni2263uni2266uni2267lessnotdblequaluni2269muchless muchgreateruni226Cnotequivasymptoticuni226Euni226F notlessequalnotgreaterequaluni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279precedesfollows precedesequal followsequaluni227euni227f notprecedes notfollows propersubsetpropersuperset notsubset notsuperset reflexsubsetuni2287 notsubseteqlnotsuperseteql subsetnoteqlsupersetnoteqlmultisetmultiplymultiset unionmulti squareimagesquareoriginal subsetsqequalsupersetsqequalintersectionsqunionsq circleplus circleminuscirclemultiply circledivide circledot circleringcircleasterisk circleequal circlevertbar squareplus squareminussquaremultiply squaredot turnstileleftturnstilerighttackdown perpendicular assertion truestate satisfiesforces forcesbar forceextr notturnstile notsatisfynotforcenotforcesextraprurelscurel triangleright trianglelefttriangleftequaltriangrightequalorigofimageofmultimaphermitconjmatrixintercaluni22bbuni22bcuni22bduni22BE righttriangleuni22C0 narylogicaloruni22C2 naryunion diamondmathdotmathuni22C6uni22c7bowtie NameMe.8905 NameMe.8906 multiopenleftmultiopenrightuni22cduni22ceuni22cfuni22d0uni22d1uni22d2uni22d3fork equalparallellessdot greaterdot verymuchlessverymuchgreaterlessequalorgreatergreaterequalorlessuni22dcuni22dduni22deuni22dfpreceedsnotequalfollowsnotequalnotsubsetsqequalnotsupersetsqequalsqimageornotequalsqoriginornotequallessnotequivlntgreaternotequivlntpreceedsnotsimilarfollowsnotequivlntuni22eauni22ebuni22ecuni22edellipsisverticaluni22EFuni22F0uni22F1uni2300houseuni2303 caretinverteduni2305perspcorrespond ceilingleft ceilingright floorleft floorrightuni230Cuni230Duni230Euni230F revlogicalnotuni2312uni2314uni2315 propelloruni2319uni231Cuni231Duni231Euni231F integraltp integralbtfrownuni2323uni2324option deleterightclear angleleft angleright deleteleftuni232cuni2336uni2337uni2338uni2339uni233auni233buni233cuni233duni233euni233funi2340uni2341uni2342uni2343uni2344uni2345uni2346uni2347uni2348uni2349uni234auni234buni234cuni234duni234euni234funi2350uni2351uni2352uni2353uni2354uni2355uni2356uni2357uni2358uni2359uni235auni235buni235cuni235duni235euni235funi2360uni2361uni2362uni2363uni2364uni2365uni2366uni2367uni2368uni2369uni236auni236buni236cuni236duni236euni236funi2370uni2371uni2372uni2373uni2374uni2375uni2376uni2377uni2378uni2379uni237auni237cuni237duni237euni237funi2380uni2381uni2382uni2383uni2384uni2385uni2386uni2387uni2388uni2389uni238auni238buni238cuni238duni238euni238funi2390uni2391uni2392uni2393uni2394uni2395uni2396uni2397uni2398uni2399uni239auni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23AFuni23B0uni23B1uni23B2uni23B3uni23b4uni23b5uni23b6uni23B7uni23BAuni23BBuni23BCuni23BDuni23beuni23bfuni23c0uni23c1uni23c2uni23c3uni23c4uni23c5uni23c6uni23c7uni23c8uni23c9uni23cauni23cbuni23ccuni23cduni23ceuni23cfuni23dauni23dbuni23deuni23dfuni23e2uni23e3uni23e4uni23e5uni23e6uni2400uni2401uni2402uni2403uni2404uni2405uni2406uni2407uni2408uni2409uni240auni240buni240cuni240duni240euni240funi2410uni2411uni2412uni2413uni2414uni2415uni2416uni2417uni2418uni2419uni241auni241buni241cuni241duni241euni241funi2420uni2421blankuni2424uni2440uni2441uni2442uni2443uni2444uni2445uni2446uni2447uni2448uni2449uni244auni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469 lthorizformuni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000 ltarcdnrtformuni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblock shadelightshade shadedarkuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxsquareuni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EE largecircleuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2603uni2605uni2606uni2607uni2608uni2609uni2610uni2611uni2612uni261auni261buni261Cuni261duni261Euni261funi2626uni2628crossuni262Euni262funi2630uni2631uni2632uni2633uni2634uni2635uni2636uni2637uni2639 smileface invsmilefacesununi263duni263euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264auni264buni264cuni264duni264euni264funi2650uni2651uni2652uni2653spade heartopen diamondopenclubspadesuitwhiteheartdiamond clubsuitwhiteuni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2680uni2681uni2682uni2683uni2684uni2685uni27c0uni27c1uni27c2uni27c3uni27c4uni27c5uni27c6uni27c7uni27c8uni27c9uni27cauni27ccuni27d0uni27d1uni27d2uni27d3uni27d4uni27d5uni27d6uni27d7uni27e4uni27e5uni27E6uni27E7uni27E8uni27E9uni27EAuni27EBuni27f2uni27f3uni27F5uni27F6uni27F7uni27F8uni27F9uni27FAuni27FBuni27FCuni2800uni2801uni2802uni2803uni2804uni2805uni2806uni2807uni2808uni2809uni280Auni280Buni280Cuni280Duni280Euni280Funi2810uni2811uni2812uni2813uni2814uni2815uni2816uni2817uni2818uni2819uni281Auni281Buni281Cuni281Duni281Euni281Funi2820uni2821uni2822uni2823uni2824uni2825uni2826uni2827uni2828uni2829uni282Auni282Buni282Cuni282Duni282Euni282Funi2830uni2831uni2832uni2833uni2834uni2835uni2836uni2837uni2838uni2839uni283Auni283Buni283Cuni283Duni283Euni283Funi2840uni2841uni2842uni2843uni2844uni2845uni2846uni2847uni2848uni2849uni284Auni284Buni284Cuni284Duni284Euni284Funi2850uni2851uni2852uni2853uni2854uni2855uni2856uni2857uni2858uni2859uni285Auni285Buni285Cuni285Duni285Euni285Funi2860uni2861uni2862uni2863uni2864uni2865uni2866uni2867uni2868uni2869uni286Auni286Buni286Cuni286Duni286Euni286Funi2870uni2871uni2872uni2873uni2874uni2875uni2876uni2877uni2878uni2879uni287Auni287Buni287Cuni287Duni287Euni287Funi2880uni2881uni2882uni2883uni2884uni2885uni2886uni2887uni2888uni2889uni288Auni288Buni288Cuni288Duni288Euni288Funi2890uni2891uni2892uni2893uni2894uni2895uni2896uni2897uni2898uni2899uni289Auni289Buni289Cuni289Duni289Euni289Funi28A0uni28A1uni28A2uni28A3uni28A4uni28A5uni28A6uni28A7uni28A8uni28A9uni28AAuni28ABuni28ACuni28ADuni28AEuni28AFuni28B0uni28B1uni28B2uni28B3uni28B4uni28B5uni28B6uni28B7uni28B8uni28B9uni28BAuni28BBuni28BCuni28BDuni28BEuni28BFuni28C0uni28C1uni28C2uni28C3uni28C4uni28C5uni28C6uni28C7uni28C8uni28C9uni28CAuni28CBuni28CCuni28CDuni28CEuni28CFuni28D0uni28D1uni28D2uni28D3uni28D4uni28D5uni28D6uni28D7uni28D8uni28D9uni28DAuni28DBuni28DCuni28DDuni28DEuni28DFuni28E0uni28E1uni28E2uni28E3uni28E4uni28E5uni28E6uni28E7uni28E8uni28E9uni28EAuni28EBuni28ECuni28EDuni28EEuni28EFuni28F0uni28F1uni28F2uni28F3uni28F4uni28F5uni28F6uni28F7uni28F8uni28F9uni28FAuni28FBuni28FCuni28FDuni28FEuni28FFuni2A00uni2A01uni2A02uni2A03uni2A04uni2A05uni2A06uni2A1Duni2A3Funi2b00uni2b01uni2b02uni2b03uni2b04uni2b05uni2b06uni2b07uni2b08uni2b09uni2b0auni2b0buni2b0cuni2b0duni2b12uni2b13uni2b14uni2b15uni2b16uni2b17uni2b18uni2b19uni2b1buni2b1cuni2b1duni2b1euni2b1funi2b20uni2b21uni2b22uni2b23uni2b24uni2b25uni2b26uni2b27uni2b28uni2b29uni2b2auni2b2buni2b53uni2b54uni2e17 lowcircumflex colonmodifier shortequalsSaltillosaltillouniA900uniA901uniA902uniA903uniA904uniA905uniA906uniA907uniA908uniA909uniA90AuniA90BuniA90CuniA90DuniA90EuniA90FuniA910uniA911uniA912uniA913uniA914uniA915uniA916uniA917uniA918uniA919uniA91AuniA91BuniA91CuniA91DuniA91EuniA91FuniA920uniA921uniA922uniA923uniA924uniA925uniA926uniA927uniA928uniA929uniA92AuniA92BuniA92CuniA92DuniA92EuniA92FEngsamiffffiffllongs_tuniFB1DuniFB1EyodyodpatahhebrewayinaltonehebrewuniFB21uniFB22uniFB23uniFB24uniFB25uniFB26uniFB27uniFB28uniFB29shinshindothebrewshinsindothebrewshindageshshindothebrewshindageshsindothebrewalefpatahhebrewalefqamatshebrewalefdageshhebrewbetdageshhebrewgimeldageshhebrewdaletdageshhebrewhedageshhebrewvavdageshhebrewzayindageshhebrewtetdageshhebrewyoddageshhebrewfinalkafdageshhebrewkafdageshhebrewlameddageshhebrewmemdageshhebrewnundageshhebrewsamekhdageshhebrewpefinaldageshhebrewpedageshhebrewtsadidageshhebrewqofdageshhebrewreshdageshhebrewshindageshhebrewtavdageshhebrewvavholamhebrew betrafehebrew kafrafehebrew perafehebrewaleflamedhebrewuniFFFD @H]-./0abcdpqrsijklBCJKLMTU\]denovwFGGHHIJKUVXYbcefrsuv !"'((),--.      dgrekhebrlatn.ISM $LSM $NSM $SKS $ccmp ccmp&dlig.liga4locl: (082tP6",bqcr28RX ,>Pbt     .     / $(,28DHLRX&8Z| IGEC ca_] usqo JHFD db`^ vtrp SQOM TRPN   BHNTZ`flrx~     @\grekhebr latn*markmarkr~ $*06<BHNTZ`fl):D)10 "*.028>BGIJVWXcdestuV\bhntz 4"JJ*. %D**&f  F&\  -- ! "(.4:@F*FN (RX^djpv| $*06< 3631>36363>303,4^363636363.43,36363.3,4/3.3.3.3.3':##[[.L'#&-3(3u $=DDFFHHLMOORR XX!"bc#qr%' jk "%& !(((*+ &,28>DJPV\bhntz&/89,,YȷDarkRadiant-2.0.2/install/ui/fonts/FreeSans.ttf000066400000000000000000025633301245424655700213720ustar00rootroot000000000000000FFTMT GDEFb2? d8GPOS7 THhGSUBt j3rOS/2)s@VcmapTcvt 6i fpgm/f\egasp d(glyf s&$headO<6hheat$hmtx+!Rkern_loca8Li$Rmaxp55 name! ULpostf k,prep\nchRX_< Ȼ Ȼ r+Zr:du/]1 B0GNU @  8,`XX|c4,,!y40MIM&(H2WM.W,+,f,", ,,#,+,.,%,&nnH-H2H2,M"O0YZcZ ,SdO,PAKL &[ &]0cU c@,,M,*,6,,(,,FB:DAF,F,$,6,ME",A N+dNHKz,4,,C, d,+Mr%-H(M.M^H2^^M\,A0WM'^Em(.e=e=o,` 0ZZZZG L & & & & &H_ UUUU [cC,*,*,*,*,*,**,(,(,(,(),$,F,$,$,$,$,$H2c,A,A,A,A+6,*,*,+0000Y,Z,(Z,(Z,(Z,(Z,( ,, ,, ,, ,,S,F',_TdBO::,F@,PB,PoD,PD,L,FL,FL,F.l,F &,$ &,$ &,$+$]ME]ME]M10"0"0"0"ccc U,AU,AU,AU,AU,AU,A  ccc,V0P,6T00?0O,64&Z/0c", yFBYO:Y0A@,F &&5$&$J0,6[0"cMccUpA U ,cc c  ",",@,6drdH2|YY  P PDLL F,* &,$U,AU,AU,AU,AU,A,(,*,* * ,, ,,O: &,$ &,$c 5YY  ,,v[L,F,* * c,,*Z,Z,({| &, &,$]M]M-U,U,A0"c S,Fc,*Z,( &,$ &,$ &,$ &,$ ,*2;,6 `Z,(,($("$"!T,,, ,F,F,F BDjDAFAFAFRTF7F,$ $.M M t MEMETs"6"6"+*5Tr"B , 5(4,/,/,/0 &F"o.F&&FZ,/,/ DUD-:wM M &g(J11WWWMMOMMMMM3M3MMMMM\MdMMSM#MgMgMzM{M M M M MMsM=M9MMMM:MMN(((((HHMMM1M3M.MMG:M nM M M=&1=)2,+5w XU}>e9CC!2h:Qk|;nn1LnMsMV<qAM OFR 5ZtS &dOAKLvA &P[t(c 4 4 T0'$382T024$'&$ (8<'< "$k92#"l"2.; *$2"$2$D64M l49$,,69 &H0PPFP00d8SStPPe SPPFP,"P 0PPxP!NPP.PP0ce ]0Pr8>PSPIjPP*P(&&&FFZ#&$7F7FFjF.F&&-FAF&$a&BF0FFF F$F%&%&AF&$F-UFAF7F.F<* 0&& PGF P<FYPFM  OPF >*"PFPF GP:FPF"P(F*0&0&c B L ~0 0v<0vPF/$/$P PF  P.FP;Fv<0ePwFP(&(& o"P#&/ /  0$c (P7FP7F.&& 0&& 0&&*$e e e r80FPFjPF0" &?$sPFFF<<F2FFFAFFTF#FI2A(<S- [(FBA-FFA-Fo<F-x-(MO5MMM MAA'F<#9A"AE#aF'A8F9#(FFF#)FF#8A(,AF#'A#AA& A!AHAoA(A(#-FtAB,#* FZM  fn @&y>Fn:O:V&n?>_'o?`=:&&9X%o?m0>z3_=K$?98? N3^>#%<#><8,X7X8423,jjjrTrW>>>#9>kkmIdsXakk>>~Ikc,}  >1?<F$X ;E X  Nl8c`4*Q(88B, 2T|L\3^sG,  c,rqxqvs?Z?q?X?d?N?e?e?"??mj.,8?Xc,"=4/XtD#s#e:+ Y3?- R5w@'/6J/d )RtAM191`$yy(! m+ew_0\@eYZzuzvqpelrf]B-" !|!nn@M <R8 .b obYfz #hYs lN;l?l%5 <, &-r)t.O_) aef K<l<</<X<S<<}Pn<U<<Z<[PPK<o<YP<O<W<,<[<NP<T<P<TPx<Q<tKoxv<N55\5y* $5}5 5O5Gg 32 5.p5  #B\5x]J J x$2r553n  , n q#4275Fi555'[ %$m\$J Y2522222222222222222r2r2r2r22r2r2r2r222[22I2I222222!2222222*22222222222222222222r22r2r22r22222L2222222222222222222222222222W2W2W2W2P2P2P2P2P2b22P2`2222222222222222i2i22222P2P2P2P2P2b22P2`2`222`22`2a22s222a22q22i2i2P2P2P2P2P2b22P2`2P222P22P2P22b222P22`22Z22Z2K222222222222d2<2<22<222222222222222d2<2<2d2<2d22<22<2<22<222p22 22 222p222l222l22l2l22}222l22|2252m2522;2;2[222h2h2>2>2>2V2V2V2V222222222222222R2222222|222222222222222222t2222>2>2>2>2>2>2,2,2,2,2,2,222W2j2p2121212128282828222222222222222P222222922222 2 2 2 2 2 2 22P22k2k2k2 22k2k22P2P2P2P22222 2 2 222 2 2 222222222222222222~2~2~2~2~2~2~2222222P2P2P2P2222212121212v2v2v2v2222222222222222222222222>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>22222222222222222222 2P2P22222222222>2>22222222>2>2>2>2>222>2>2>2>2>2>22222>2>2>2>2>2>2a2a22222222222>2>22222>2>2>2>2>2>222>2>2>2>2>2>2>2>22222>2>22222 2>2>22222>2>2222222222262r2k2 2$2"222"2222 2 222 2 222222r22222P22P22222>2>2222,282|282|2282282222222 22i2i2Z22622?2?2222,!,22Z22222P2(22v22222222?2c2,*O,6O,6O,60Y,Y,Y,Y,Y,Z,(Z,(Z,(Z,(Z,(cZ ,,S,FS,FS,F,S,FO:O:O:,P:,P,P,PAKAFAKAFAKAFL,FL,FL,FL,F &,$ &,$ &,$ &,$[,6[,6]ME]M;]M;]M0"0"0"0"0"ccccU,AU,AU,AU,AU,A   ccc,F+*,*,*,*,,*,*,*,*,*,*,*,*Z,(Z,(Z,(Z,(,Z,(Z,(Z,(SN_9 &,$ &,$ &,$ &, &,$ &,$ &,$&5$&5$&5$&5$&5$U,AU,AUpAUpAUpAUpAUpA    T0T0T0T0T0T0T0T0''''''rco$$$$$$$$ UU,8BA"$"$"$"$"$"$w22222222_$$$$$$$$oT0T0''$$8"$"$22$$T0T0T0T0T0T0T0T0><U\C;$$$$$$$$PUKN$$$$$$$$jh5&)T0T0T0T0T0T0T0@MtMtM M $$$$$AkSRBM  xDQM 2222929222  1;""M $$$$$AAP.4MRMvM,dM.M.,,8K6kA@A@M0M1M/M1,&,&^2^FWstW P 111111x 11nb,|,M,;;#H 5NNyNXMBMB|,.0 (?;(z<;$<W1<<<<\<<<^*^^^^^^^^ ^ ^o^Nh-^^E^^^^^^^^^^ ^ ^o^LknhE ^g&Y c,,AFG%[]o2e<6$c:"'Z[! 6wxx)2142wrCP)0Bf)[)0,30@00+(!g.,<V):^)L<rX4[ &R]B]]"c 4 O"o,(2-)L)8:P:V&Cd$:0kFRP ,,P,P $eEeeEeeeeEeeEeeeeEd,dBddd,P0YAKBBBB    BD,AF [-1[-    0-  |8# -|8{  ['-[,['D ,+Z7  H7H7H-H7H7-7i7i$)H(H2H2(H]HK 8KT[[((,ddd,__HKHK=K%H3H*H(H(H2H2H2HIHI*H2H2H(H(H-H---*H-H-H-H-HHH-H-H(H(H-H-H7H7H7H7HH6HH6(|4|P|B|B|E|E+++++LXL`L|>|>|>|>==W@>H(H(|B|B7'bH_I,,d;;II(((,,XXX77, ? 3 3 G = G 5 =         O Y Y Y Y ? G Q ?  D [      Y, k##########|||||||k 2 2 2 2 2 2 2 2 2 2qq d d  |#|#|^|^{^{]|#|#|^|^{^{]$$$ ' ' ' ' ' ' ' ' ' ' ' ' ' ^ 2 2 2 '  ' ' '^2 2 2 2 2 2|#|#|#r 2 2 2 2 ' ' ' '        Br"#S"#r"#S"#M7+777By<2"'''==H(`(h8h8HHH 000HHT6HH>HHh8h8$H0<H 4H6X:0x<D6 HHZD6&?|6h8h7H <8h8h786H8H0H<<6H<6HM.FFF F FRFFFFFFFFF F F:F:F F FFFXFXFXFXFFFFF8FzFeFFFF FHF FFHFFFFFF FFeFFFFFFFF\F6F#FSFSFFLFFFFFdFdFHFF FFFFFwFwFF1FFwF8FzFF FFF FFFFF|FFF@F@FFF@FFFFFFSFzFFwF/FFPFFFFFFyFyF-FBFqFwFPFFFFFwFwFFFF{F FIFFF F FFiF/FRFFBFF F4F4F(F`FF(FeFFLFLF,F,F,FFFF`FvFFFFFFFFFFFFFF FFFSFFlFFFFYF FFwFFFFFFFFFXFXF>FF>FFF\FFFF4FF%F^FFFF-FFFFyFFFFFFFFFOFFlFlFFFFFF-F-FFFF!FFF\FjFFF#F#F#F#FFFFFFFFFFlFzF&F9FF FFnF,FFCFF+FFfFFFFFFFF0FFFFFFFSFFFFFwF0FMVV222{2;,,^LL)&NS'pA/iM' 24 G&-!# T 5 0MK/:w#2"5xFxY|O   } +8:8:r+++++KG]q!:!VwX X  ,1`?n?++!-Z-PP@@  nmq  Dh~3   gHk[[+yy+.VX_HjjezSCO O/Hhh0%%   .F:+O} ?--  +pq+t+ rq    ? q  x _CoJ$3* CGt:+ O3} ?- Hy+ yyWaa n2FHcq8|ULL' a\vuo?]c')B'iN)g'>>|)C|2bxjjrtJ**jUU  5]Jk5])u# = '!|||LLLU,LD[8c?z]s*U QY)*; b(.&bNE9EoE8c(EE9E3E[b& A  r H uK;,(v,/./6h[Q*^KXh[[u2 +*)L\33\ ,G:<01,T$q0`.^)V2[/X1*K*Kb obYfz #hYs lN;l?p% a T 1 @ > [ B g RQ1rr{uojmugZ hZ]Cl a b _ aL AAA AA:18K%z:P&h? 9R%i?%#H2<<<<:::O:V&n? _ `=&&9X%m0z3_=?98?N3^>#%<#>O:&98?H  a?\J.d>-a|,dqV 2C#I C oM}#pn_C1a\<K9I&776OF09057^1F?:9Y=&259\FV9#OHI+N8d03DN/0r7HJ1<n6A8L.`O N7777777H67777&77@7u77M7A7R777 77777b77,D, D~37ouz~asV_ ,J 9 N U r    ( 0 3 6 9 < B H M Q \ ^ u EMWY[]} d q ! !$!3!"I"M"P"b"e"k"s"}"""""""""## ###*##$$$i%K%l%&,&g&o'@** -e-o.+6<>ADO $7Ptz~p|1Ya0 < P X y     * 2 5 8 < > G K Q Y ^ f  HPY[]_ p t !! !&!5!>!A!J!M!S!!!!!!!!""""""" "#"4"<"@"M"P"`"d"j"m"z"""""""""### #)##$$`%%P%&,&`&i'@** -0-o.8>@CFsqgYQO93" $"! @4uig]WOLE#"!  {vsgfjh X ~b~$377Potuzz~~0\ceagps|IM1VSY_ya ,0J 9$ < N^ P Uq X rw y                       ( * 0 2 3 5 6 8 9 < <" > B# G H( K M* Q Q- Y \. ^ ^2 f u3 C F O R h o q v      5      E HM 2PW 8YY @[[ A]] B_} C b      d p q > t @ [ ` n t u !! ! !$ !&!3 !5!< !>!? !A!D !J!K !M!N !S! !! !! !! !! !! !! !! !! """ #"" $"" &"" /"" 8"" :" " <"#". ="4"4 I"<"> J"@"I M"M"M W"P"P X"`"b Y"d"e \"j"k ^"m"s `"z"} g"" k"" u"" v"" "" "" "" "" "" ## ## # ## #)#* ## ## $$$ $`$i %%K %P%l)%%F&,&,&`&g&i&o'@'@*** * -0-e-o-o..+A68<>>@ACDFO1Vd       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a rdei xpk vj Y ;s \ ]gw $ 1 /M El|6cn 9T U 'm} b :  k   y f|qxyzz}{g,K*PXJvY#?+X=YK*PX}Y ԰.-, ڰ +-,KRXE#Y!-,i @PX!@Y-,+X!#!zXYKRXXY#!+XFvYXYYY-, \Z-,"PX \\Y-,$PX@\\Y-, 9/- , }+XY %I# &JPXea PX8!!Ya RX8!!YY- ,+X!!Y- , Ұ +- , /+\X G#Faj X db8!!Y!Y- , 9/ GFa# #JPX#RX@8!Y#PX@e8!YY-,+X=!! ֊KRX #I UX8!!Y!!YY-,# /+\X# XKS!YX&I## I#a8!!!!Y!!!!!Y-, ڰ+-, Ұ+-, /+\X G#Faj G#F#aj` X db8!!Y!!Y-, %Jd# PX<Y-,@@BBKcKc UX RX#b #Bb #BY @RX CcB CcB ce!Y!!Y-,Cc#Cc#-KPXYF+X!YKRX!Y+\X E+D E+D E+Fv+DY+ R]]((((T$ 8tdLXl8 P H L | , ` |8t4Xt$x <4$xpPTp$88x0Pl,tt  , | !!!t""""""##,#D#$0$H$`$x$$$$$%@%X%p%%%%&&x&&&&&'4''''(((0())))))**(*@***+ +$+<+T++,,,,D,\,t,,,--(-@-.P.h......//(/@//0 0$0<0T0l001x111112 2$2<2T2l2223<3T3l33334 4X4p44444555L5d5|555556 6@6p666667777788 888P8h89|99999: :$:<:T:l;8;<< <== =8=l===>>>4>L>d>|>>???????@@(@@@X@p@@A AABBdBBCHCCD DtDDEE EEF<FGGGGH@HHI$IIJJ`JK8KLLLMDMN<NpNO,OpOPPXPPQ$Q|QRRPRS SXST4TTUU U\UlUUUUUUVV,VDV\VtVVVVVWW$W@W`WWWWXXX4XPXpXXXY8YYYZZ Z[ [$[<[T[l[[[[[[\`\x\\\\\]],]D]\]t]]]]]^^^4^L^d^|^^^^^_ _$_<_T_l____`L```a<aaab$bbbcc,cDc\ctccccddpddeeefdffglgghiiDij`jkkkllllmmtmmnLn`no<ooppppqXqhq|qqr,rxrrs(s<st tdtuu0utuvDvvvvvwDwwxxy,y@yyyz4zz{({<{X{| |||}~<~D|,HDXl(8Px X8\p(<PpX4L`t Hh$8L`|<\$8L`8Th|$8XDp88L`tL,@Tl0H||4H\0L` 4H\p (\l $4D\thx8H|h,D\td,Ll|4<X0H`x \0H`4DTl|LhxDH D(\ ` lH\8(8\l<pp td| |$<Tl@P` ,Ld|8x0È,Ĉ8hŘ8ƌx@tȼ@ɀɼ(\ʐt ̤$͘H΄θ4lϤdФ Ѭ@ӄӠӸ$t\՘D|ָ 8Ph״l؄؜4Ld|ٔ٬ټ,D\l|ڔڬ $<Tlۄۜܤ hDވ8ߤTT<( |\h,(pL0T@8Hp$Hd h` p$lP$`dH0|0x , X|,D\x0HdD,`@ (X0(t@h4d        0   P   0 l   4$hPD,dTxP$P(X, 4|8T $  !!"\"t#`$$%&@&'''(()*,**+p+,D,-,-..\.t./,/00T011,12D2\23<344455<5560667X77788d889(9D9d:l:::;$;l;;;;;;<<,<=>?\?x??@,@A ABBBC<CDD D8D`DEEEFXFG0GH HI IJKLLLM\MNO0PPQQQRSSTlTUV\VWTWXXY$YpYZ@Z[4[\\x\]H]^P^_(__`0`h`a,aabb@bcc$c@c\cdLdehefgh`hxhi@ij,jkXkltmmmnpnno(oppHpq qqrrsdttuTuluuuvlvw wwx|yypzzX{{||}$}~0~xH8Xlx,X|PX(X4 t H<LX,|xx H0H`@00d|p@PPLd t$l l$L8\4(DX<l<X$D |4 ÄT\ŰxxȄ0ɔʨ`̄pdlЄ$,0Ӵ0ՠ,xHذ p ژڬۈ۬@ܴh0ބ޼(ߘH<P<00dh8dPdx0Tl,p\<D|L $HT$8Pp,D\t4Tt(Hd0H`4Lt ,D\,D\|@\$<x0H`x(@Xx   8 P     ` x     ( @ X p        0 H h     8 P    4Ll @`x @`(@`x0Hh(Hh$x$<4Ld|D,h $<Tl4T$<l$<Tl ,Ld|l`   x  !h!!"","D"\"t"""""##,#D#\#t#$$0$X$p$$$$% %$%<%T%l%%%%%& &$&<&T&l&&&''<'x''( (L(d((()0)H)))**4*d**+ +8++,,,<,\,--t-.4.L.d../@/X/x//0 0$0<0T01,112L223 3`3x334,4\4l444445 5,5D55606677h7778 8$8D8\8|899:`:;<;;<@<<=0=H====>,>`>>>??4?L??@@4@h@@@AADAAB BhBBBCC`CCD,D`DDDDE,E`EEEEF(FXFFFGPGGH HLHIITIIJJ J8JxJKKLKdK|KLLPLLLM M,MMNHNOLOPPtPQTQRLRS,ST,TU8UXUhUxUUUUVVpVW8WPWX(XYYZZZ[h[\H\]D]^(^__x_`t`a8aaabbXbccdc|ccdDdde e$e|efDfffg<ghh|hilij0jjjk k`kkklll4lLldlmTmnLndnohopqqrTrst tuXvvw(wx,xyhyzhz{`{|}}p}}}}~~~4~L~d~|~~~~~D|4xH4Ltt8pH<h`(X|$xl,Xd4($\t4Ld|\(H`(@Xp $<Tl $<Tl,D\t4Ll<Tl,D\t,D\t4Ld|4Ld| $<Tl,D\t4Ld| $D\t4Tl,Ld $<Tl4Tl $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld|”¬ $<TlÄÜô,D\lĤĸ(@XpňŠŸ0H`xƐƨ 8Phǀǘǰ(@XtȌȼ $<TlɄɜɴ ,Hdtʄʘʼ,D\tˌ˸8H`̀̐̐̐̐̐̐̐̐̐\`΄μ,dϰШ(DtѤ (҈0`Ә 4hԸDtֈ֨,Hpנ$8l4`Htڐڨ(<Pdxی۠۴,@Th|ܐ0ݨތߌd| $D,<lD(@l $HDXt,<(p(Lt$dt0xPd<   8 L         0 P h       ( @ ` x       ( H X h x      0Xp0dD(D$Lt4L\,tHp$x@d4ttt@Tx,L<L  (   !(!@!"D"\###$$ $t$$%%(%&,&t&',''((,(H(d()$)d)x)*,*D*\*+8++++,,,,@,,-T-..,.@.h.../ /4/P/l///00,0X01112@2223343h3334 404d4444455$5D5X5l555566<6d666677<7\7|77788,8T8|88899D9d9999::4:T:|:;;$;<4= =>,>?d@4@AAAABB@BpBBBC C<CXCxCCCCDD,DHDdDDDDDDEE0EXEEEFF,FTFhF|FFFFFFGG,GHGdGGGGGH H(HDH`H|HHHII(IXItIIIIJJ,J\JpJJJKKKHKtKKKLLL8LTLhL|LLLM8MLM`MtMMMMNNN`NOOO4OLOhOOOOOPP,PHPdPPPPRVYY(Y<YXYlYYYYZZZ0ZLZhZZ[[`[|\H\\^^0^T^p^^^^__8_d_x____``,`T`h`|````aa$a@aTataabPbbd8deXeeeeffdfffggggghh,hHh|hhhhhi<ihi|iiij(jPjxjk k(k<kXkkkll,lHldllllmnoop pqhqqrs,sxst,ttu0yyzz z8zz{{T{{|4|p||}}4}`}~~P~~0<h <@@p@lDHtd$,Px P<(`<xHTp(pH4$p4\HlX|dLDl44TP@X,XtL|$tLDlHx,XØTĔŌH4lthht,| `@ψ(pѰdӠ8\ք\؀<ڀTܸ8pެ߄Tl@DDP$lt48lL`HxDLHd H8t\Xp   `    (  \HLl,0 LHH$\Dd@ @ !<!"t#$#####$$$$L$$$%%,%L%l&&`&'0''(8(()T)*`**+`+, ,--..//T0 0012X23L334t45D556x67X78,8H89H9:(:;8;<<4<===>4>>?@`AABC$DDEFGTGHIPJJK0KLM8MNO(OPQ8RRS`T0TU|V(W8XXZZ[\]^_`abLc$cdefgh<ijjkl8lmnpXrsttv wwxylz|{|}`~<x  0H<xx P( 8 xD@Dh\pLhh\t xT$\4TœØ<, $\,ͼx\ЈL8d@0ܼ݌ޠߘd@4x`,D tHDX,@p<8 D\\ ht P  <  t  \8h(|( p<p !"#$&'@(()*+,-D.4//011234578899:;<=d>P?(@BBCtDEFGI JDKMMNOHP8QDR8SU4VXxYZ[@[\]$]^_d`D`apabcLcdeXefg|hhiijjjkklmm|nnoop pq<qr@rsttuuv@vw wxxDxxyLyyz\z{|}4}~X$|8LT \t(D<0`4$8`pT``T\\ `dl$LPxhTL$Dl00¤4àXŘ08|Șxɸ,`ʰˌ@̈ d$ΐ4pPӀԔTՠ <x,4ڰXPܤ<ݰXެ$ߜh<`8,4d4L|4L@LhXd||<,`,tLXd xD ( <D   8  p (  T`p@(0pl(4| l !!""# #$d%%D%d& &'x(T()t)*+++,<,,--h--.L../L/h//0x0120234X456L67889X9:x;;<,<=h=>??@,@A\ABBCDDDEdEF FlFG(GGH@HHIItIJJJKPK|LxLMNOOOPP P8PPPhPPPPPPQQ(Q@QXQpQQQQQQRR(S STTTTUU U@V,VDVW4WWXPXYYLYZZZ[\|],]^^^^_,___`,`x``a,aPahaaaaabb b8bPbhbbbbbbcc(c@cXcpcccccddd0dHd`de eHeef4fg$gghhhihij8jjk kxkl@lhllm mnpnnoloppq8qr4rrsDst@tuuv0vvwtxxhxyXyz z|z{t||`|}d}~ ~XpTdh8x4,(< Td|8$X(8 0d$p8d,8(hL4$Xd3!%!!X Gf'HI| #'#5'STRhh41 3#'73#'4]']'ooo3#3##7##7#537#537337#3$]jiu'L&|'L&erly$L$}#0| }DDDD!.4;%#5.=3&'&546753#.'%5>54&'oi;emO $]!Ge`;[gO@243"81ZzJ716[ $02"&46"32654&%3#2#"&46"32654&HcdedF)<<*)<;oBuBHceEGddF)<<*)<;dIEdeeF;*)<;)+;^'VdHEdedF;)*;;(+;4}*3%#"&5467.54626=3#>54&#"'322 ;D\qE]/"d\?2Eljp&;Y$]]$Y;&2 ##5#5353FF FFWmh 73#5>=#Wii#32#"& 3265+.@;!wqrvvJFWYM0ܐf[#5>73#f>:X? .R;"632!!>?654&#"2e~dA8u(Ro\`P< t\R6#B-Wu?47U9L $"#632#"'332654##5>54&L9Xesc@8mXHHEN% _OCxSEh[l'ODexMJKCK,A8A %!533##5GBAiiXު]4O6#!!632#".'332654&#"#;Hfk)E-%XrHSTG):Q5W+ip)/wXLO[%+%4>32#.#"632#""32654&+"3G?#Qk X >.LQ:i_zeARR>=PJC^R3bW38O~chSBD[WCGS. #67!5x^(|JϪ W%("&547.5462&"32654"32654z҅y6*ww*spCC87D9RQACSu:waz{av:"@1SjjS2@=32=<24M|NM?>&##"&'33267"&54632"2654&"3G@#Qk X >.LQBze=PJSRk^R3bW38O~chMXCGSTAE[n 7#5#5hhhhhhhhnm #53#5>=#hii#< hh\x&&4-75% -vEOO2oa!5!5aFFFF25-5v EOOM#54>54&#"#4632#5%45%Z%54%F:I8UolatZ%.J1-9 /7%B00=#3?RJswhhh"r5A332654&#"327#".5467>32#"'#"&546322654&#"SZ @hя؟Orpr|yTJBYVLn`BLF]eT&A[6(?b:#X}ꝏ C*kmbC54&+ova(=Z-eF?}/1>D?^r$;;p/T+49E04>32#.#"32673!".00GyL+_^Wj{mZ``!KwG/d2bjO4NNej3Ni`Y3!2#'32654&+YlpplRZe !!!!!dLRRRZC #!!!]t\LRR,$326=#5!#'#"&54>32#.#"$9^]&#&=4&+#!2'4&+326 +q:>]Pks6+LCJEh&0* ")8.IAC?e^>RH6<0m0%2>54/&54632#.#"#".'3V8N%x~X^WJY6BJQ(>gA)KN8%X+U;*)S#0%cswkGMD7*01`C9=. #7\<64Q##5!b]<yRRU3#"&533265(]]eUXdnoOOTJ!#33ddci !# #333ffhdhWPP # #33sqqov0vc #33]socG !!5!5ELfTRR5R@,#3#ggHH#/7,53#53ggHHS,I3# #IEzyE,PB!5B~22P#'`<䔔*)4632327#"&'#"&54>7>=4&#"26=Aad- #()T^O] -<$1&=8:<SEXeJ<6qIF)? %(MTG& &(-0I*^  -P,6 3632#"'#"32654&6S9ihx|hk;KBPPBDUSVZCoooY^p#.#"3273#"&54632T@4DMNEkTp^k}j[m\7;ob]j~`kb#5#"&54632"32654&J"O6jz{fl5DTTEBPP'E1+}Qp[\on[^o(%!3273#"&632!654&#"~+Sf#TvZnmJq&T=?RH(DiV`J@7,AYW###5354632&#"WSFFA: : D8DY8?E5R&("&5463253#"&'3326="32654&\|{db>M0_I\nUqT>#K!CNNDBLK}[LJKeV*TJX_a2,n^_mk^bmF4&#"#3>32#C)@NSS%K8LYSk70aP0'MBtB#7#5SST  ii& 3#"'53265#5FS  $SS mG'%ii: 73##kgQSU޵PD#T'F!3>32>32#4&#"#4&#"#FM"K4a,%H4IOT3.3HT3.3HT J/*P,$KGwi27P9i27P9F3>32#4&#"#FM#Q:LZS:2@NT X70NAtk/8aP$ 2#"&6"32654&q}np}~oFPPFEQOMmmm\an6& 3632#"'"32654&6M;lhy{ea@BPPBDTSO^}NoooY^p&##"&5463253"32654&S9ihx|hk32ATTTM$C( Jg _;3"$732654&/.5462#&#"#"'z5E7C&+N]InbXf3<.3PNFuc/7-%" C>IWTMT+$# E:LZ#327#"&5#5353V'14GGS DF+(DA !#5#"&5332653K%P:L[S:2ANSI4,NA/8aP)  !#33[^^ W !# #333*_je^\kdfgh^e hh #'#373$a__~~^ & 3#"'5326?3Z)^ Y l KSh !!5!5EV9 JIKxI+,!#";#"&=4&'5>=463%$.R%.49",,"94A'EF&x'AE>E< E ;F>Ed,3#d<<S, 5326=47&=4&+532#%RR%/4:!++!:4A'x%&x'AE>E< E EK "#>3232653#"/&/571u5i'*bsNFKE%&?z3 J 4t673#5.546753#.8`TjW*euue*XcT9XEg tZmab wz ZYcV254'#53.54632#&#"&3C;?!h(+*9J+#580E8nQ"e5>,X@M ,> 7+'RD'B8.%B;V.&(791![{ 1W9FC'&%'#"''7&547'76327'"32654&:5(<5)380 687,5:(;97,>?,+?>65391+;9-7575:7)42/>V==*,> !#3##5#535#5333着XUUb3M33M3cBd,3#3#d<<<<oo++4?32654/.5467&5462#54&#"#".57654/=)+571+27,kaT5,&3 =0mkP.4'oII' E50&2&u"J12G33E`bO/70%"^'J6s)"4 H`*J0{'?=3m-<(d4&yYy%0#"&54632#.#"327 #"&54$ 32654(!@(VlmX#G -(9DE8V<ᢚ8@$fi2+]OHb|ߞ✞%/M#-!5%#"'#"&5467>=4#"#63232'3265@"/1808DYC";~zTS.9%6b33_,++4,11 , l^z /(-j 757757-jj5jjYzSSSSyYzSSSS(V w!#5!(FNw.8#58HH#.9#&54574&+#32'3254&+& #"&54$ 32654O"F΍K#(=<ᢚh/ -#%($ ~"*C# ߞ✞w.!5.FF 2#"&46"32654/>YY@=YYfN87&(8Y>@XZ|Y98&'87('2o ##5#5353!5FFFFFFF"#6323!>?654&$>@R`?! 3H:;1 F8R/ #:IL& / +B%"#632#"&5332654&'춮&.#?@K9GUFHO>,-*0 3@.)-,@8;L=IJD.++&'3# $\P-3#q<A$  %#"'#"'#33265332 !S;h6$SS:1ANS-1? SS/8aP)L)0O .546;####an^9@R@^e@JWKy'*32654#"'73632#"'< ! . *& &)B9/N%\8# +2"E #57>73#c6$ +>D.0W(/D!52"&546"2654&:DJKKKC'--N-,b33ZTOZZRQZ4@78@?79@.jm =Q #57>73#3#%#533##=c6$ +>:<:.CC>D.0W'x; 5d=L *#57>73#3#"#6323!>?654&c6$ +>:<:$>@R`?! 3H:;1D.0W' F8R/ #:IL& / +D%)47"#632#"&5332654&'춮&%3#%#533##=.#?@K9GUFHO>,-*0 3@.):<:.CC>-,@8;L=IJD.++&'3# $5'x; 5d`' "] #k$#j$#f$w#|$q#j$#z$ %!#!!!!!!#Ug+n`dRRR(_0*7%2673!632#"'732654#"'7.'.54>32#.#"zZ_`! &)B90M. 8Xy܁!4@r!q3=HFYkbR"6$ f2zK*"ksD*"jsD*"fpD*"|qD*"jp D*"zlD*U/;B%3273#"'&5#"&54>=4#"#632>3226=%!4&#"01e%TvY88e;L\*FGf$vp Tʀ/\6IpFZgG86&P@?R4K%iUak:4TG&9$ N]R&,J@7pQe  ,('-GYW*5.54632#.#"3273#632#"'732654#"'5N&j[mT@4DMNEkTt\ %*B9/N.  8=P,b]7;oc]j^m!# +2!)%("kvH("jxH("f{H("ju H"k)"j"f "j $*4>32&''7&'77"&"32654&$-<8'';a$U4,%Ja(Z*F+"||FPPFEQO@e<' (1-'(,/-%)#MLs>Rmmm\anF"|tQ$"kmR$"jnR$"fnR$"|nR$"jm R2 !5#5#5&hhhFFhhphh##"''7&54632732654&#"?,}og<= B0~oeA:\+?FP)EFPGIm>EJGsAA0m_B 4m_DA"klXA"jlXA"foXA"jh X&"jQ\6& 3632#"'"32654&6S8ifz{ea@BPPBDTSP}NoooY^p&"jV \f#i$*"inD#x$*"xnD3"&5467#'!#3#327 h8L3. KMcx7'H%0px4*$:',6 - L+3T4?632327327#".5467&'#"&54>763>=4#"26=Cad- LH&*:1%9QaO]%(@5)1%u:;QEXeJ<6qIF)?=7 - ,!( CMTG"3" N-0I*^  -P,0#j&"jnF0#f&"fcF0#y&"y\ F0#g&"ggFY#g'#qG #53!2#!326&+3YEE]kppkSCCSC-!3##5#"&546325#5353"32654&??JFbf|{ea@SDTTDBPO5;R|N5LnnlY\mZef#i(("isHZe#x(("xrHZe#y(("yq HZ3"&5467!!!!!!#327@8L3.=ds7'H%04*$:RRR,6 - (4.6%327#"&54>?#"&632!32?54&#"&)(&"&)?L  (pmJq~01e%T=?R)B,(0 - 0( J@6b4K%iAYWIZe#g(("g|H,cf @7 *&"fuJ,#x*&"xaJ,#y*&"yX J,'R*&#JS#f+F#f2K'!5%53!533##!##5w,]w],,]^,ZZHFLF4&#"##53533#>32#C)@NS??S%K8LYSk70aPX5LL50'MBt0i#|,"|f#i,"i*#x,"x3"&5467#33278L3.^7(H%04*$:',6 - 3"&54673#327#5r8L-(S 0#H%0T4*!8 *6 - ii_s#y,T #S  d#-,B&;#ML #f-&&fO'4.:'N: 73 #%#k0gS  F#j/@#jOP' /B'OOP'\/DP'\OP#y/D#yO( 7!!573{(PP]yLzR9M8u 7#573BBS??S3@392@2`L#j1F"jzQL'>1F'QL#g1F"gtQ._&\Qxl$".#5232654.#"#3632(B?l)@>Dm]]:)VR5-LVGNt;dMM\%HRtc0F&#"'532654&#"#3>32 &:2@NTM#Q:LZmG'/8aP X70N&f#i2$"ikR&#x2$"xlR&#}/2$#}R+-4>325!!!!!!5#".7327&#"+(=RM'y>HUNCu(MR<'])94};;|59'dXT6XLRRRJ^5QZIn?' xex'@n$*1%3273#"'#"&54632>32$"32654!4&#"01f#TvY>?q||q=e=Jq،PPFEQX&P@?R4K%iV`ggj28J@7pm^`ml^a3GYW]#j5EK"jU]'H5EA'SU]#g51P"gU0m#j6""jWV0m#f6""fVV0*mJ%2>54/&54632#.#"632#"'732654#"'7&#'.=3V8N%x~X^WJY6BJQ;wT&)B9/N.  ,YgX+U;*)S#0%cswkGMD7*01`C(ED+ # +2"(%E[64"*@732654&/.5462#&#"632#"'732654#"'7&'z5E7C&+N]InbXf3<.3PNF4.&O&)B9/N. /7-%" C>IWTMT+$# E:/N # +2"(%G0m#g6""gTV+Q"32654#"'7##5!##632#"' ! . * < &)B9/N%[RRy7# +2"%/32654#"'7.5#53533#327632#"'B ! . &(*GGSVV &)B9/N%S*$DDF/# +2"Q#g7#^WQ535#5!#3##x<]eHRRHe #3#327#"&=#535#5353VOO'14LLGGS DHF+(HDUi#|8A"|pXUf#i8A"ilXU#x8A"xlXU#z8A"zjXU#} 8A#}XU3#"&5467#"&53326533279L"'9,]eUXd]%44%H%04)/ pOOTJ4W9046 - A4  $327#"&547#5#"&533265#*$'>J`%P:L[S:2AN ; -2+>1I4,NA/8aP)#f8:#fZ #f<&"fV\ q#j<G#j="jZ]Gq#y="yP ]G#g="gX]3##5354632&#"SFFA: :DY8?E5-!533#632#"'##5"3264&YS@ae{|fbFJ?$COPBDTTLL5N|R;X5m\Ylnn0* 0%2>54&+4+3%"5463!2#!#"3263J1>D?F{=G~=Z-eF?vaR1 R+49EM!1N$;;p/TB^r:OPpx6  "32654&!!632#"'BPPBDUS9ihx|hk;oooY^p3IVZC732654&+332#!'@RQA]]dƀRR=@PhxfcË3 "32654&3632#"'#'CBPPBDUSS9ihx|hk;K]oooY^p VZCË0 &0(4>32632&#"#.#"32673!".00GyLHP _^Wj{mZ``!KwG/d2bjO4O;ORNNej3Ni`.,"632&#"#.#"3273#"&54632R T@4DMNEkTp^k}jT>ER7;ob]j~`k0L!%32654&+"5463!2#!#"3263glppl{=GoR1 Rǚ1N:OOo754!35!5!!".6;#"Ot=Y-] 8''8R'+EF:.)-,6  "3264&#5#"&546325!5!&FSUDBPPK;kh|xhi9p^Yooo3CZVI&;$ A6Ze !5!5!5!!5!sdLRR'R/'0m/".547&54632#.#";#"32>=3MQv<ix~X^WJY_?XlC`%N8;U+X6Y\+GG&}1-lcswkGMD7.[RT.)+47Ji5&C!!!!#"'532Zt\QH DL%RRG58Q&##"'53265#5354632&#"W &FFA: : DmG'DY8?E5R,.326=#5!#'#"&54>32632&#"#.#"$9^[cEgI>K57FA+#"&54&#"#3>3232>54&'7/714C)@NSS%K8LYI-F&5Hf1?';d+(/70aP0'MB/#1=+.t3&}; Pv:34632&#"73#:A: :kgQe8?E5޵PS #5333##||T}}TSCCC,"273267#".' #'527.#76*:o0!! z`%6 !$5_LMFb\tMbR @ !#5#"'#"&533265332653S"K4a,%H4JT_/-3C_[3C_J/*P,$LFV27O: iO: &33##"'532Le}XiMG DL%T'OD58LF83>32#4&#"#FM#Q:LZS:2@NT X70NA3/8aP& #"&632.#"!26^pm ԌaVԐ}|Fu& ""2654&#"&63232>54'7t菎>lB @%k=򥤄΢V$$ 6+8]a$5w !"32654&7#"&63232654'FPPFEQO%\%np}~n8R mmm\an+8VEg# & #"2654&#"&632632#4&#"t菎qVT`SI^%&*X򥤄΢V8=gTM5i$8 #"32654&#4&#"#"&632632FPPFEQOHT"'#4np}~nT8@>F@mmm\an]M'*I|))I0#3264&++##"3263#"5463!2gCKKCq[]R1 {=GluDxD]q:O1No6&  ""32654&'632#"'#4632&#"BPPBDTS;lhy{ea@T>9 :oooY^p^}N?9>E[3264&+#332#&=4&#AIIA]]hxVI+q;=DxDxqct:+o.IAC?0m0%2>=3#".546?>54&#"#>32G;U+X%8NK)Ag>(QJB6YJW^X~x%N;46<\7# .=9C`10*7DMGkwsc%0#S)*"$%3#"&546?>54&#"#>2326sXcuFNP3.<3fXbnI]N+&C7E4ZL:E #$+TMTWI>C "%-7G 5!!!!5 fmTRRR&= "2654&#"&4632327#"5i%%2%$2II29B& $$$#IdHD8T'Gm&.5#53533#327#"'53265),GGSVV &+$DDmG'Q4>7!##+"327#"?2]+R16 {Z4+RytO3#327#"&5#5354632&#"VV'14GGA: :^RDF+(DY8?E&Q#5!#327#"&54'%]eUXd]X+8f SnoOOTJ Ao#5#"&5332653>54'J%K%P:L[S:2AN]+8kHI4,NA/8aP)  6U".5332>=4.'3N7MM(](('GF3 4)+l,aJ - '=a?8ciDA &#"#3632  ]s֭-A  i#@  &$!#"'5326?3632&#")^ Yr)^l KU hAl KG3#!!5#537!5EMWfTCRRCR 3#!!57#537!5{SEV]} JCIKCI E7!5!#"'332654#52>Ef ,1|X Qj ҵRT +F,dyMAK  E3"3273#"&'454>7'5!! jQ X|1, f KAMyd,F+ TR q '5!!#"32673#"&546Ə܏0NEHHXmaJIKCKJMxeXc"6 )#"&#"327#"&543232654&+57!5!,aW=6Wb]Baa`\0aSH0Pb &E"LBO40+;KIJ"632'!!>7'57654&#"2e~W(A8u(I_S'`P< t\{O$MD#B-Wo|9"MB7U9L@#%#"&5332654.=#53533#x]hsO?H?H&66&GGSVV&66&]c|nD^8:)5=.DD-"&D6&  !>54&#"#3>32#O'? 7*haTT=_NBW%FGa;' h9$A6F"))P;%^N1aSDB&d,_d,"_n_2,33#3###535#53<<FfFCFfF|Y#?'Y#@'#@,GP#-,/P&#M,/D&w#MOLn#-1L&k#M1F&#M,Q#g$*"gpD"#g,"g&#g2$"gnRU#g8A"goXU#j"8qA5"jn"XqmxU#j"8vA"jn"XvU#jp"8gA"jn"XgpU#j"8CA"jn"XCI( H)#j"$q*9"jp"Dql|#y"$q*!"yl"Dqnd g#q*U#q,-3267#536=#5!3##'#"&54>32#.#"$9^M $5kL\nn^_mk^bmX(4$@2,}[LJ[3468TJ,#g*&"gZJO#g.:s#gfN&#&"&5467.54632327"2654&8L-)Nd0#H%0t菎4*"7Ξ԰eg*6 - p򥤄$#&"&5467.54632327"32654&8L.*\e~nq}qd0#H%0FPPFEQO4*"8vy*6 - mmm\an&#S#q$#"qk E#gyq"g_2&&gY#='Y#]'#],G,#v*&#vJ[D!>54&#"#3>32#O'? >#)k5__=_NB^#.S8d"+9$A6F"!*/!P;%^N,[EP.BL#C1F"CNQ#z b$@0v*#v #v*U#v=#v #v#$#D#$*#DZe#(#HZe#((#H{#>,|#?*#;,#%&#=2#R&#-2$#R]#!5A#|U]#5-Z#kUU#8#XU#8A#X0m'*6"'VQ' 7'lW )"#632'>54.''67654&L9Xes1b0;PX> @[{%LCxSEh[1O1{/O3:WB\$) "K20<8Az("#4632'>54&''67654'5VbOL`"F52\:8 #ZE9.Ja,80PfXD(: #]4,$J "5E' )QS#g+Fs#gK(G!#"'5326=!5!5EL &)fTͽmG'JR5R( )5!5!!#"'53265u9E &KxIJmG'#y$*"yl DZ1e&32654#"'7#!!!!!#632#"' ! . 'ds &)B9/N%URRR1# +2"(/832654#"'7.54632!3273632#"'!654&#" ! . 'esmJq~+Sf#TmT &)B9/N&T=?R%VzJ@7pH(DiR_1# +2"AYW&#q+$9"jm"Rql|&#q)$;"qr~&#y2$"yiR&#q&$""yi"Rqke S#q<&"qT\& 3#"'53265FS & mG'* DA$ #4&#"326"&5463253327#"&'OF?HUC@DKplZBS- #(+&JWySQxwvzPBL)? %+$"# 2 6  ""32654&4632&#"632#"'BPPBDUSA: :9ihx|hk;oooY^p3e8?E5VZC F  -%265.#"7#"''7&54632#.#"676328D-][mN800D0j[mT@4DMW)+-6 M,0I)*<6Ilb]7;obN0H  7&L $"32654&#"&546323327#"5 DTTEBPPY"O6jz{fl5S"' p[\on[^ox1+}Q&GmF $"32654&7#5#"&5463254632&#" DTTEBPPJ"O6jz{fl5A: :p[\on[^oE1+}Q8?E(732#"&'332>7'.#"(mnZvT#f.3!R?327332>7#"#".Y8?R!,#f#TvZd?YE '    -*O=E#m0L0# MSW-D%iV`>]T r-GB^&=0G""#%3#"&547&5462#&#";#"326sXcuVAnbXf3<10>J+;@6E4ZLV&%KIWTMT+$!5L6%-7$":>732654&+532654&#"#>327332>7#".'&'#"'z5E6@;+J>01<3fXb[`7UE (!  -**">AVuc/7-%6L5!$+TMT0OT r-(SE:>K%&VLZ!(>32#"&547"32654&+532654&"az\p",*rcyoG?GO6=;+5)01?WI(5;-LZYsm_-%6L5!$+&  33##"'53265#53lSMM &NN HmG'#K1\|{db><9 0_I\nUn^_mk^bm^b2,}[S9>EJKeV*TJX& /"32654&"&54632>2&#"#"&'3326=CNNDBLKT\|{db<$> 0_I\nUqT>#Kn^_mk^bm}Y#. H%KeV*TJX_a2, !326=#53#'#"&54>32#.#"vMb.`,Lln$8^;]vV C?UVajUB=HV|#HO;'ZR3,k 254''4733". `4ZZ47L0#/(*/NB(F<+4  #/2632#4&#"#"&5467&"#>32>54&4:;5>`L2 (+<-.=^8)%.4LbE-! ,??Af@%6O)Zf)?.Y)T}mG?3'1gF3  K, F4&#"#4632&#">32#C)@NSA::%K8LYSk70aPe8?E60'MBtF&%4&#"#4632&#">32#"'53265C)@NSA: :%K8LY &k70aPe8?E50'MBmG'#5533##5#5TSPPSKii_HHB 327#"&5'14 UF+( 3#3#53#IIRR HHH|"#>32332653#"/#&~/571T 5i'*T"sNFK2 %&]533##"54>5"TT?*("Mq&$R(D& 3327#"DT& mF'GDqJ#"'732654#"57!#3!Yam5I7)ENTT cXexg.KCK=JF  P@ F8 !##"'#"&533265332653M"K4a,%H4IOT3.3HT3.3HT/*P,$KG27P9I27P9IF&*3>32>32#"'532654&#"#4&#"#FM"K4a,%H4IO &3.3HT3.3HT J/*P,$KG mG'27P9i27P9& 3>32#4&#"#"'53265lM#Q:LZS:2@N & X70NAtk/8aPrmG'F&@3>32327#"54&#"#FM#Q:L[& :2@NT X70NA('Gm/8aPF ##3mSl c c$ 2#"&6."!26q}np}~MN)N|NRZ[QFNXX$ "3275&#3#3!5#"&6325!FPPF_&$n7Np}~nN8Jmmbb LL&%/%4.#"326=332>%4>2#"'#"&c-EA*x3:7,T/3(4,G|{G,$<=!`0.b^`:T1 qsIc9!"85H5)JU=('=SL*Fh4ZZ.8`   UM   7>53#5#"' TTTM$C( IJg'_;3 &` 7>53327#"=#"' TTT&  $C( IJg'Gm;3E8A #3>32ATTTM$C( Jg(_;3E&A327#"53>32ATT& M$C( Jg'Gmy_;3Tt 3#4 #4&'T T""mm!%%8. 4&'#54 ""T U%%!mm6 #'##324&+32RCgET,@![6%[wHL 0/#.'6   "(0332654&/.5462#&#"#"'327#""X5E7C&+N]InbXf3<.3PNFucN/& k/7-%" C>IWTMT+$# E:LZL'G&#"'532654632&#" &A: :^5mG'8?E&##"'53265#534632&#"W &FFA: :8DmG'@D-8?E5&!4#"5632327#"5u: :A& 5E?8'Gm& &3265&#"4>324632&#"&'#"&\#(0#<"#M/8 31A: :"SGVLg  *5 e8?E5 HpI W&#327#"&5#5353V'14GGS DF+(ODF !#5#"&=#53533533#!326=K%P:L[IISSNN:2ANI4,NAxHHW/8aP "F *#".5467#5332>54&'531?';d>Af9& ?1nH5%N4,E'5H&};54&'7714SI-F&5Hf1?';d+(U/#1=+.t3&};54SNH9rB4+Ht &"_6)``KxIJ->5   q #"'332654+57!5!4YamXHHEN0 cXexMJKCKIJ4v )4&'#".54>32654+57!5!"3267&,Ya!%nI)</8  '0##(-G E cX H /2&&*5   KIJM$/"#632#>54&L9XesC8T_OCxSEh[9f,A8A/.#"#&'.54632=H:CO_T8CseJNA8A,pJf9[h/ 40+4>32#.#"32673!".500GyL+_^Wj{mZ``!KwG/d2bjO4NNej3Nh`1&&2F "$#"&547&54632'";#"32654&nzcrVAp\~^3?10)5+;=6OG?ZLV&%KIW|/+$!5L6%-_msY[ *326=#53#'#"&54>32632&#"#.#"vMb.`,Lln$8^;c;N :V C?UVajUB=HV|#HO;'27E533,kF &!#54>323&'#"&73265&#"LS/8 31S"SGVLM#(0#<"#ii*5  HpI* &7 NF| 333FT @L&F $"32654&54632&#"##"&54632 ETTEBPOU<9 S9ihx|hgp[\onZ^pI9>ES/"#6323##5#535>54&L9XesC8mmTii_OCxSEh[9fHHX,A8A/.#"3##5#535&'.54632=H:CO_iiTmm8CseJNA8A,XHHf9[h #"32654&%!!5#"&546323 DTTEBPP'E$"O6jz{fl5S!p[\on[^o?JIE1+}QI[q*6#"'732654#"57!#5#"&546323!%"32654&Yam5I7)ENJ"O6jz{fl5SDTTEBPP cXexg.KCK=E1+}QJ p[\on[^o 7:"32654&"32>54##5!5#"&546323!354632 DTTEBPP &"ISNH"O6jz{fl5SrB4+HV#p[\on[^o   )6)``E1+}QJ->5'^1732654&/.5462#&#"#!"&5#53533#2H&+N]InbXf3<.3PNFvb05GGSVV6.$" C>IWTMT+$# E:LZ+(DD &#+#"'5326=#"&5#5353354632&#"#32 &s14GGSA: :S^5mG'C+(DY8?E7A#327&54632#.#"354632##5"'#"&5#5353"32654V a.j[mT@4DMNFB4+HSNHP: YM14GGS 7 DFib]7;ob]j->5=6)``*+(Di   90#"'532654&#"####5354632&#"3>32JF &:2@NTSFFA: :#Q:LZ58G'/8aP8DY8?E5RX70NDz(7#332654&/.5462#&#"#"TT+F7C&+N]InbXf3<.3PNFuc22&5-%! B>IWTMT+$# E:LZD- !!3ET$ JII_-/Z*)Z*)wh!#5!#!#5!#FFFFhCC߉CC: 4&#"563232653##"&5l& C)@NSS%K8LYN'Gm(70aP!80'MB&c%327#"&=#"&54&#"563232653 : :A%K8LY& C)@NS\5E?80'MB'Gm(70aP! 0K) 0) |M)&{U)pUpfp>=3327#"=#"'776  Y,1 K0Cz.GG(Sr \qfrZ);q\)1 1'  W #5433ii#<x&&4W 3#5>=#Wii#<x&&4W #"=<#ih4&&xC_<5OC "3"&546$44,,4$#45"#>32#5>54&2%9IEBK,$7>3+6-JKC<%B u*%*5.#"#5&'.54632(/&+3>7$,KBEIg03*%*u B%3#'#!c&MN&3>dM-O33#'#t_`?QO@``O2#'373_`?QO@O``LQw.q\P-vPCd#53HHt/qS7$C=#7jg"/qL"qg"3g~?"rz_!{_, B7533!5Fx۷FF BtM' nB %##5#53533ByFxyFxyyFyy B-!5B-FFU< 332673#".;T(0; $<4B" @sd#5hhh=1 2"&546"2654&,>?V??+$>,+=>+*?>93 "&546733278L3.F7'H%04*$:,6 - e?23273#"&#"#>[X :Jd :-%%h&%16N\3#%3#=q<q<䖖A:57332>7#"&'JE/# -*-NcKN&r-_UGID0 ?q):rO)1}V);q[)65)( #!5H H( #!5!5HV 3H( #!5!HV nHj( #5!5!HV H3( )5!3bVHHH^3!HHO_HHf#3!HHOfI86gQ. &qcq1. 37dM&.7d#.b$/c:znkn'kkl'jje cC|nAMA3##PHH#5#5HPH 8B53!53HHdd 8B!53BHHd$M!'&/76?M%33%h +00+!PCPvOfe|wq=us!5sHHUx&dydj4}#532654&#"'632,, %(04F@ 2&$31zO3}Og1Ly#53HHLL&L=N#'##'`<=`<䖖U/#ycxU x1)G +2A 3#5265#X/)-I+/*,A #3"&=|-)/J*/+I+A8C8v3#5#53HH3SH5G!#5#FwC +53>54'%-I+8pT  &xs$853533SHSHSSH8##5#5.SHS-HSSH ##5#5353.SHSSHHSSHSSXdwM}U&- '3#"'53265SS &-mG'&X- 5327#"=& -y'Gm[Zy^jzzrW 3+52=#d4.77Lg8A&N*zi3{ E;!#5##FFx8|9kew.qIq9Ch3#YLLhC3#YLLZzPw!!75#}'D}}R4632632#4&#"#54&#"3%&'$3,,%34$3 ''7'7N __ `_ __ _GHGGHGG!FR5654&547w61%&h%%", g7 ,  eMcQCP\|2AXV[@Q/&,&Hɻ3#5#=S]WS#7&#"#>32733273#"C+ :-!%'>1  :J4G%16@T%hh4#y0#y|cF=,#|_| G  Y #5'67&'9 4.8+ A , -19% 5 !c:M'3 #y xuPQ~j#~P{$`& 57'5%3#'#鼼K!c&MN&uJ:;;=_/|%yJmR37''7'7/PQ5'./&4QPDT,CFFC,0Ib2>32#".1#"&54>32>7".#"2654&#"W   & 2$  $2 &!  *    1   "8   8" \(     &M(&     " 37#7#A%9?' e_9N267>73"&'.'33232653#"/&3C+WL**,"C,317 =A%*$FKE +); ?xNU+ 5!'7'7E%9YY9%E.?3@?3@9dDBQ:JHCQ?UL?Q:HRCQ:L XCQ;^FDQ:VXGCQ9XPK:Qm7j B@82>73#"=3 !1JL*OQO,nm sPDdlM  3#'#5!#5Za:SES USSSS V #5h hh&#ze '%5&'se" D '60"F$Oo%R6!#!6|`{5)3!bt{;Ze(G=S+&!5!#"&632%"2654&)Pt菎@R1VԂ򥤄d,O.3#3#tcxh'uK0L1Ac !5!!5!!5!S9gI"SsSaS&2P!#!#!^^0y[i3(^ )55!!!^tU#RRQ7 <%"&5463532##4&'>={|Q}{SoVWnVon_}yQQx|_vVk c r{ lUYq;4%##5#"&5;332657"^"zvZKWVWKZlaaQA7AQ7kb4!%>54&#"!53.546323!;D.qmiMOZhTL /MwAqnc#LH.ei,H##j' #j20G#>'"{BJ#D8+"F2"`R0G(4>353327#"&=&5#"4&#"3260 1S4o3H +%#_BxRBJFHN!CJ9%FRW E  8Nni[f2:)4>32#"&'#4&#"32654+53262*Q;_iho_;F!VH?4;)qAE2*?G7RE$dXw%_w$3?)jTJDJI: #5&#"'4632 V $.'v F #7~$-74632'5!! #".7";27>54&$v_    y =A1FRPD/ %RsHH%$/$8]gO[]]5Rb'$%#"547&546732#.#";#"267 mgffpf ch LV;@@..?AHrXPB_`Q?CO'%U/(;(/,(%'&>".5467#5!'654&&7L=+gdqED&L" .T6BH<@ℎ.A7aE!#J4&#"#4#"'632632'.>X  $CaR[Xn{lLH6SU.v8 7327#"&53 .,<@XQHE< !##373l>XXr < ".#76323267#".' #  6 !$0!! z`') R !0:JFb\<8"&'#332676=3#5+6XX 8)*=VP; "x##*17j>%%  Y>/%2'654&+".54>7.5467#5!#";#"jI'J#&8Ca1'3"6D, dt*@LXRnJd^F*C=^V"!78.H) K9+HFFT0+E@RxD$RR %27#"&5###5!#$ 0.,^F(@@ >0FT:FF28"4>32#"'#2654."20B>!r>D+Gc5X>\11410/1=_8% wlm&G\l8Q)*RpR*"J&4632#4&#"'>54&'.'."tc|[JB01(H;/H@0Z -(FI2.9vu_@F'L4.B%  -<,n P %p"N4>32!##"&732654&"",KO,@qsZ[=IOLLMo9RRf{|k[lZVpr "&5#5!#3272I1! #CQ3II+O 2 7327>53#".531S<# XjnEZ.XbHD<$~V:H7F.8 #"&5467;32+#54&+3267yZF*3CiNXyn X]OK] nZ$D!d;NiŘznOhf ,<+"&/#.##56323327<$=ah   B `Ã$ 3&hN<$*8l %##5"&53332653luVtZGUVUGZlljn6YQNQY$'%2>54'7#"'#"&54673>=3.4(4lP*F$<=!`0.b^`<4Pl3:7,T"55H/u"NFh4ZZj<)lIc7 "jF2"jhR$#L2"qR$#V6-4"34&454>323##".'33265C# $8$,! CC 1L24N, P>-AIGSJi 46_5D# " 3'@*#HAeX8 &8SG+;^@v452>32&#"#54.'&4Df>! PK> '&'@2&`.&-`3ZQ3^E$. 9\xETp_+4 "]4#j]98!463532##5"&73"4&#269Xz?nJXzTa_b^_ae[uy8^M+xSk|oOSki$+%2>54'!3>=3%##"'#"&5467#5.4(4NM3:7,T#>#$<=!`0.b^`!>"55H/eeIc7 ߞF0y6Fh4ZZj(3F(  2733#"'5326=&5#7654&# cgjϐ &Ɣh:ka Tc}NqmG'OFc8*0!>3273327#"&5#7654&#"Z1;Ocgj-#/,6]1=Oh:%.+(9_e}NF9F.4>32#"'3263"#"&572654."90B>!r>D+Gc54)-1'-Dm>\11410/1=_8% wlm&GR4Rl3[\l8Q)*RpR*&a0%"4>3"3# 1S4CFFBN!CJ9%LVLBJVP[&|CP[&|jl2+53254+##5!#)J[ 54Rc9B]WE,? BBK9PPP9#jz0 .#"!!32673!".54>327^W^x lgZ``!KwG/0GyL+NNsR~ej3Ni`12bjO40m6d,#j,-S'!##52>=!32#'2>54&+,F.%ua 1>M@{Ch_T,^!DNteGtY^rR+48FS!!#3!332#'2>54&+^]1]|w` 1>M@L;uZ\rR+48F2#4+##5!#)J[]B]WE;9PPPn&jP#C [#xSy !#5#3!3P^v^y'$Pp%#!!!3 4.+32>p-Y=t] 8''8$FE+R.*,-Pp%P93#!!]tR"y %!!>=!3#5!#5KE*[PPR5hv ٥qчP[(  # 333 ##nEt]tEv]Dwb44D0m1%2>54&+532654&#"#>32#".'3V8N%`ClX?_YJW^X~xi(>gA)KN8%X+U;*).TR[.7DMGkwscl-1}9=. #7\<64P 33##PX}eXi['VP#xPn 3#33 #]]1oz|2M!R!#52>=!#,F.%^RDjaV-^"FPvgG'P0P+.2P!#!##^1^y'P^30&Q7 [3#733qqo{0-#/;32##5".54>;532>4.#" &CcF3'?6K._.K6?'3FcC& _0H5''5H0_0H5''5H0|7jH6W8( ^^ (8W6Hj7]%JdJ%z%JdJ%;Py %33#5!3#^CP^Rqчy8"#"&53;3#MX]L]]\A)9t'P %33!333^b^^R'yPy1)333333#o^^^CPyyq 3#5!32#'32654&+Dd@RQARxfcRR=@PP %#!33232654&+#pd]=@RQAm^cxfR=@Ph'Pp %#!33232654&+pd]=@RQAcxfR=@P* 3267!5!.#"#632# `Zgl x^W^_+LyG0/GwK! je~RsMO4Ojb21`iN3!P#"&'##33>32%"32654&v^]yr|}rq~|aŗ좡^ 463!###"&6;5#">vaI]oneqQ7>53"32654&w,oq}np}$F2?)/J1%S(:FPPFEQOFLU  ( N=mmm\anF %4+3265'4&+326'2+y[*1.;bb;.DRFE2.TGF+$,)P4Q"5!3#5!#573#W0"S@FnFݬ@4xx t;&H 73#'#5#'35kjSjk $#732654&+532654&#"#>2#"'|5E6@;+J>01<3fXbnAVuc/7-%6L5!$+TMTWIK%&VLZF 33##FTlSm ccF"xvF 73#'#`jS   !###52>5lST !2  b%F$ 33###FhhT2T FkCF 3353#5##FTTTT &RF !###FTT @F&S&F$ !###$tT L@& \&&;&2632#"&'##"&5463253"32654&!"32654&-dflmd1>#S?5egke^1S@CC@CFFdCBBC@CB^#+-&^lll\`nm^_lk]am [F$ 33333#5FTT=F @4x0 3;53#5#"&50T"TT;V B9Fn %33!333TTTL @F )333333#dTTT32#"&'33267#53.#"*m[j}k^pTkAM I:4@\\ck`~^TMIP;7F#4>32#".5##3%"32654& 1W7q}n7W2! ^TTJFPPFEQO51D8'&8H> יmmm\an 4>;#5##7.7;5#"F!@,TEgCR[[*1w/0L=F+$&&Cr&&jy]'4&#"##53533#>32#"'5>5B*BKSTTS *;#KZ7PP 5{\70bNT@EE@!JD?k@#(|\F|"j&%#3273#"&54632#.#"3_MAkTp^k}j[mT@4:I T^~`kb]7;PI$VFL "j&M  72>=!32+##%#32654&SqmkaF'B8||:81P,yCXEVa6,+(F1 !#5##335332'#32654&TTTqmkbk||;72 BXEW.))4&#"##53533#>32#B*BKSTTS *;#KZS\70bNT@EE@!JDF"jAF#C&"xD\F !#5#333:FTTxx @!#&53>53653#&'6fKpdFG-*6dBKPRd)EB&f[38~ٹTW^둕o߾@ӽ 3#&3>53653#&'^Rk31RkdR^C#"+pijwy<5*8l U0 #"&632.#"!26^pm ԌaVԐ}|Fu& 2#"&6."!26q}np}~MN)N|NRZ[QFNXX'{|'* ''7'H'HA$''#7'57'573@87;?K7MCCBBc 53353#5#HHHcCBU+<`@ f4@C"#46323".}' @[QJFN (N>~ '$I]!)!;  Y&F'FDy'Fy'F3'FF'Ff'FF33Uk "/<IT_3#5265##5463"37'654''&5477#"'7327''7632&#"#"&5335532#4&#X/)-YX/)-?3 ?3 >4"  >4" I+/*\I+/*JI+/*\I+/*>4" >4" ?3 !?3 X/)-ZX/)-Py 332673#".333#5##;U(0; $<4X}eCPKiB" @[qчVF- 333#5##332673#".FTl7#!#53533#32&]vaYY]\\1M+4^rFxxF| %4+3267#!#53533#32[)2[UF>>THHvphN* CS~FHHFKLP^ 654&+327'7+#!2KC62L$0]-lu<:2!6a@TM;lhys7U^poo@2?2CNO^P993#!53!]]t`Fmu353##FTT i@ > 3###535!!jj]KKtFYFR ~ 5!#3###5H6DDT>HLxFFPR93#!!32+532654&+]t\]]\40+55+RfZZfR/-'-/Fq 26=4&#"#!#>32+)C$*=3T'A9I>YLF079.[Vd L0'IFBM y%3#5### 333?@P]nEx]xJчDDwb44* %3#5#%#5# 35373JF!Sg0kSk@x*3g:%#"'53254&'.'332>54&+532654&#"#>32gv6L80%H!uX+U;8N%`ClX?_YJW^X~xi\x "7*4 - 6% t64*).TR[.7DMGkwscl-1"32732654&+532654&#"#>2#"'53254&'&'z5E6@;+J>01<3fXbnAV_S6L80%H!/7-%6L5!$+TMTWIK%&VDX%5*4 - 6&Pyn%3#5##33%IP,]]1oJчM2F %3#5#'#373@F$SS`@x P'#375373#%#0]]0FxvtF)*MR?F 7'#375373#'#1SS1FgkgF) 1k%gqt* 3#3 ###5353``kxdn]UU]oF;D)Fj 533#73 #%##5ASGGk0gS<..FjF> #5!3 ##Dkxdn]R;D #5!73 #%#̸ k0gSLPy%3#5#!#3!3CPQ^]v^JчL;F$ %3#5#5##335332+9)C$*=3TTA9I>YLF079.[Vd@ 0'IFBM02?"&54>3"327.54>322>5#"'7654&#"c#K^~{mm 1:1JD_cz  J-T741?Ls6/%+?ƜPyFR0HZBui (!*wKnT-fK8y&p%."&5463"3263&54632327#"'7654#"vt}KiFL ?[4AS< ;: KA6.-):7$xM^fuaDegjeOGC$&Dh+hvA9d03,#"'53254&'.54>32#.#"32673L80%H!Hm:$ 0GyL+_^Wj{mZ`` 5o*4 - 6&CUlL"2bjO4NNej$&3'#"'53254&'.54632#.#"3273jL80%H#Xfj[mT@4DMNEkT\N7o*4 - 6&qb]7;ob]j~Vh $yQ %3#5##5!#bCPP32'Y8?R01f#TvZj~PN3*$+: " c0L0# .MSW4K%iV`xU>9A-'!%+m&=0G"/;r <.#"#>3 !32673#5.=.54632#4&"3 &C-Vu_ 3>Z4,{jW^_(HAg>)fgM?7AP.C0!-9"f[ :17'MO :Ne\.uSN];7 4*6B$;/6%3273#5.'.54632#&#";>32%!4&#"01f#TbJH[lPN3*$+: " c0L0# 'X9?R4K%iL^ nU>9A-'!%+m&=0G"DMSWP#^' #x}#xPR2+5326=4&+#33\]]\40+55+]]kxdwfZZfR/--/;Fq %4&+#37372+5265qC)lSSkMLYYL)CY70 MBzBMI07 y!#52>=!3#5#,F.%GPURDjaV-^"FPvgGqч !3#5###52>5dS=FK !2  4x0)CXDG.PAAqQDPR!!#3!3+5326#^]v^^\40+5L;9ZfR/Fq 26=##3353+)*ATTTYLF07 BMPy!#3!33#5#$^]w]GPTL;qчF% 33533#5#5##FTT=FKT 4x=4#"#632>3226=%!4&#"01e%TvY88e;L\s3$vp Tʀ/\6;W1FZgG86&P@?R4K%iUak:4TGQN N]R&,&9VL0Qe  ,('-GYWP[#x|&"xr/ #7326?# !654&#"#632 &C-Vui/GwK{jW^_+LyG0!-9"f[h1`iN3eMO4Ojb /#j' "jp( #j&}#j0m#j~$"jJ Ey(q 2Pg#iF"ivP#jF"jx.#j&"jw0&0#j7&"jm8*#j$"jQ [g#i&"iT [#j&"jV [#}&#} 8"#j0"jXPy9 73#5#!!CPPtJчRF| !#3#5#F6=FK LxP#jFl#j0m1%2>=3#".547&54632#.#";#"G;U+X%8NK)Ag>(ix~X^WJY_?XlC`%N;46<\7# .=9}1-lcswkGMD7.[RT.)*"#%3#"&547&5462#&#";#"326sXcuVAnbXf3<10>J+;@6E4ZLV&%KIWTMT+$!5L6%-7RI!#52>=!+53265,F.%^\40+5RDjaV-^"FPvgG'R\R/-q !+5265##52>5dSYL47 !2  BMI(b%&4$&T : ZPn3#37'373#'#]]ru2Ko}hu(z|β](K}U MF 7'373#'#'#qXu.`Z`u ljS qH.YOl F%2653'#"&53YrO_W;[ 1z^&:Ipv]De$$c#6"(Fy2#54.#"!!#4>aRp=_'O=1D&/_&>e-XlIRQ:LA)LE8];ZR4<&%##5#".54>3234&#";k_?_1:kLBd9# n^K5J*/@U8:MZ5$*:4TSq=RR_ #K:rO_ 8m+VmL^8HC"pvQR/F^<+Fy%26=3".53!!YsN_%=dDSr=_/ %:LovQQ9XR6!+XlL] 6"*2.32#4&'!#5332>54.#"3!54>32(4+{S!$YZZ ;[O:,GF"YE]E}Y:hH=! 37,BvI=Y-siQLud65}F %#33#@`OOMFy#54.'"!!4>32y_'O=9I& &>eDRp=9KBAM9W;ZR4-WlF 3"2=#".546;54&'#"#4>;23#E.4Y_5pQ8Q-Wx?U,1_.KL)i66p8^U8%AC''>7$iBAE:- :U+q\KNA|%"&=4673533#2675#"mjm\c`EHAE[po^~\oK~:O=QkFx4.#"#3>32#%I8Jg ^b y/Ts>^8MA45%:"-ZlKGF^333F_^F%2>=3#".=##33$#-+_Tp9k__ %II,`K,YjL@9KA #".3!2.#'#"&54>7'"=4&#"26v\^$ A~'8fC4Qkpk`Fy%".532>=3#5dTr>^$G2.C) _a \,XmL)4C'!">.)L$42&'"#.'%6,%' /t-g.0" 82O/8"'54632&'"&54672>=4."327&KD[_oteV I/(9OFA:$55?U)2#5 2*WG=BXo?c< ( "''K*>C+ (Y,+D%0#9A|23#4&'"#546.ja=QCK_q\@K@F3&'7672''"j+;?)/<  ?BwC,@<+XA 13/ `y^,G  9=C5/2f (L_><%2>53#".53\8J%j>qSRp=_NK BL7]MmV*-XlIXvo-&4#"&5332>54.+53254&#"#4>32)Bny](2 )##!5-X45G`.[?5T2! cOds{S!35!-= Ms:35,77"&31y ".'#53326=3o=&9%sN_< 'UmQJ^X!6")ovIjY(,467'5'"2>=3#".5(nRXK*=)`q;_8%MsTaS[R[ F2@FY%7A3Fy#4.'"#4>32y_'O=9I% ^&>eDRp=b9KBAL:c;ZR4-WlBG#%5>=4.'"547632G-JT-n61!GW_@Ks>c5$ 32t_,+'a^&>eDRp=bBV0 Z*+;ZR4-Wl-9674.#" 632#4&'!#5332654.#&'54>32 )*HL+0L, _(4+{S!$YZZDk>gI)n)>iB2K?:UH?\."3A5]thH=! 4793'4Y#GP<(%7F3##4.'"#4>32yKN\'O=9I% ^&>eDRp=Q9KBAL:c;ZR4-WlFy%2653#"&53YrO_:sTz^$GIpvbFh\0c(3E)A %".=332>=33#5_Tr>^ &:&.C) _Z \,XmLed !9)!">.)^$-g.%4.'4632#.'"#".53326 0M^`O6kHl4[VRJZ2Oa`O2qFnB+YHi(3'O9\i(5D&C>75$0)O7\z 2D> ?Fy#54.'"#4>32y_'O=9I% ^&>eDRp=yx9KBAL:c;ZR4-Wl<9(34>32#"&5332>54.#"'67&62654.#"O.bFX)Fsq]WI)-"#/$h#jJU[RxP1;!: 9<$e% kNb}w`?M6#%95A `@79(3FY33##F__Pu-'-%.54>7532#3674&'\<^E42D]=^;\L8!9@H4^,=/"^ob0,?tIGp>,77 (?vL54. =E2"n)OM0!3C=eϚz '?pI~5;5#"#".533'".546;32C/,..--Ym")flAc7# ]-48#ih_.j~0D ?+hGG_{$4-mp ;)X=pbOC_5 53'65=^35mfP9G"NL73X7iLA2>32327#"&#" 6=,0../8%x"0705PC L14>32#"533254#"# #E/:C4*U7%Hn721?/,3a)7e*=3'?3! TJQ=2TP7A !%2653#5#"'#"5332>53(E;XOT4t=cX$8()X*B_ZI$0[[h?@ A.19<F8%#54.#"!!#3632X &KXO323##4'"#3 !BLddXNGEXS   D>>6\_K A%2=3#5#".57!!WO:k$9% XQ/AaJU'!1BDG#8;7"&54632533#2674&#"Wrqf7GRc1HC:CACEAmu+6g;LTitKVtrFM %'5#33#&LVJwBA8"!!3632#4.#I_O323#2=#"aEBHYB=>:(? VNT%B^+)(PH $G^JC>XA79&7.A,"$81P=#"#mbYbb}_1O. '4 z hDfz%9KE"FQ;F8"#3632#4&'*-XX>]dOX4"H3GhaI?>F8 #3X9eF8%253#5#".5'##33XO9l1D$XX+?"JV%D7-}BF#$#"&54637&'4734.#"32"e}~P=U3;^+ZJBIy\Lvu*C=64(2@D8I1ce[mF8%2>53#"&'3 *-XX=_fKXG"H3, Eia ~F"#3632#4&'*-XX>]dOX4"H3GhaI?>#&42#5#"&54>74.'47332>54&#"  KVM D9dx1HJ>@D)HEF*: H9=R- _?3v4bH;0 -. PUs.J8Un}A8.23#4'"#3>8)=dQwXRB*)?2\ W$,747'767!%4&',@1>fh1':eb ()#1@2{T0'F],IT=A-4.54>;#"#5#"&'332>7u+3+-,MT6**T) !!AQX$*,: 6&@&$D%&+9O8G6-+2*8 2>53#"'7& X9I*{ !^X KF%273#5#"&54>;"_XPWOAQ%M3A_@1?FS]F49B-=7>#3(3.+53(E;XOT4t=cX(()X*B_Z,$0[[h%) A.19<&7#5;#"54>54.54>">54&A].7*kƅ%+%!0/!))4 9/%%(9.GB#," "?H0#2-$+L4.G) JB@!7(*@)79R&ERA72>4&#"#36323# GD:4XO%2>533#"&'3*-XV=_fKXG"H38 EiaG~A8&%253632#4.#"#5#"&53U.&/ LXpaHSTA8"#3632#4.#XO5#"&"32654.#wj\;Q "1J/0<'UA1)89Wiu5W.-8V-/sJ?:)>*/ ;),.;1-D?`f;V*ai7R+F 3#~ 6B A88)%2673632#4.#"##"&53M;T32'"254&umQ15VddQ E;%HG+4LE:@g}ABLLBFA47kvU_HfV^# %".54>32"32>54.+NL. 1C>!m"1E; 1/]<2/01 9pM>b;&wDh:$ +U9ka-U98S+*8o#+2"&54>;32##5#".533332654#'35"Ia!=I/>=Yl*:7-W/(9/!NW%DD5638PC*; ߆i<_9%7#JnlS-%!F ".53326=33#5+> V%*GHVO>-# `-+KDBR$Z5353Zdddee^dd &27"':'0AU+Y  " P&f']&&&zzn&W&&__ }P3# GG3>Wd 3#GGGFn  :FX##5467'36=3>Q;f&,WPJ[sCVL(CJ)LLX%#73'.#52#BuQ3G36TC82X˧2C L,V9&X#!5!W  LL?:X #.'#53@{lWAZWXamtQ: Lw>X33>WX'(X##5!WW  LL?;X 4&+#!2#aJW\Wt=[X}a=:X%26=4&#"5632#"&53?Y Rzd[Zz5c:X3:WWX#&8X 2#4&+5iWaJXY7>=!53!!'.2W%,4 [W5V+, *bD?Rn(*@5?;X 2!4&+wxTX_X+@U@0:X4&+##532!53uWA:X:N{wAT L`L>8X3>W 3FX 2!534&#GqRVX^L(>Z=9X  "&5!24&+3265ڑtWWTWPL[[zvhrJN>ZY?$X737>737xYs# W +C:C  &!X5:9'LO98 X4&+;#"=32#N]y,@"(~}WtTD1Lsk?X*2+532>=4.+;'.=Aj=*(GqA753 [UWc#WKc/6 +3X!5!3>=3 f<&Fd0-W@jL 4'>8&X#53>7!5!#&l|>7$5#ooWlbL)Lr%X 2#4&+5uWO\XuitNJL<X6753+;2653#.53bWpFd x>WBW{R}W,YG^8\nLRXZW#{X4+#5265#5!2#$ityMI<yWtukLDM/Lqm>jX!3!3XXXX<_X3354.'33##:D! U ;!,kWHV,,54'* S*IC25^H7Z,MuG)5!5!5!ZXa #"&547'!5!73#".5'2632 tmM 8#&'f Z-=Z #}a%#"&547'!537373#""&5'2>33 tmb(M  6?'f #Z-=Z#} kq#532!5!4654&#yyB\oF(TS 1)Z a Q/k2!5!4654&#\oF(T 1)Z a Q/m".5463##'2654&#"2>+_UdY /\&44*&>9'X<_,EX!gOI14XY+6Ld !"&54632"3264@bz|`ay{1bNQ43J~WZ|}Y[zQK/2KHbV[s.54632'>K"2X ): 3_2@(HdfO"!#'#'!53547O$JzppssZ\r_ '!5!73#_J.DZ,>Z__ '!5!73_JZ,>%'!5!5jieO`ZS #/;U2#"&5462#"&54632#"&546'2#"&5462654&#"".546335'##" ! K" ! " ! K" ! h&44*&>9.2>*_Udj[ /> ! " ! " ! " ! "NI14XY+6LO)V;_?ObD,EX!ga(%#654#"%632Z\@DtaE\I;@ؕWHO]qZU;I@np)5!7pHfUJZCkv )##5!5#=SO^Xk?ks'545):5-AASXDfm(hj7&$ "&/.(# #xOaI8UZ-_Y+M Y :1 0#`n2"6E2632#"&+"''7.'&54676>54&#"3">=4&5):5-AAWT<  "dH*h "  7&$ "&/.(# 1#xO_J.2 H+".1` +M Y :1 0#`(2%#"&'!5%277327kF3C$&8,A(E,71D1Z)m+>CK@ %"&546?!5!'7327SdVF9? >"pA0(F)OL8F3Z!."$@ #"'!!32654'./;Vd%>  ?)F(0J""LOZ@3*$"$#!5!".54735'#"&'i)t6/i #% W||W Z8V|9_ SI>O] "J?<9!& 3"&'#53!'5#@F5AdGUdk`#532!5!4654&#{{n\oF(TR 1)Z a Q/!#"'!5!'#5!3/\  ;;ZZYck%"#"&54>732632&\ n69KN(Gn*i :((/C9Ee*lSJ*+99&T''7'77''7' &%Y(,$"5'=d+jA!577''7'77m &$Y(+#"5(>+jA!5,O3#3#,####s*/'K7K/'K7Kq5 2#"&54'2#"&546.! !n! "! ! ~ ! "* '7''7'78!8 8KK7^_`]_ 77'7!9 8 8KK7^_`]_3#'3#r####K}/'|KiK@KL[ 535#53#3HHIIL"< <" D 535#53#3 HHII"< <"Ov 2#"&546>" ! B ! "6{ 2"&546/537$/++U y!;9 2#"&467#'7yi.++-$ w";8jv 2#"&546>" !  ! "fq#53qbb]jv 2#"&546>" !  ! "Ov 2#"&546>" ! B ! " x 2#"&5472#"&546).! !7" ! V !  ! "w 2#"&54672#"&546?" ! ! "! ! " ! " #2#"&54632#"&546'2#"&546" ! " ! K" ! t ! " ! " ! " !4632#"&74632#"&2#"&546"! "! ," ! n! 0"! 0"E ! " %N,`H% RHf7!#7777''7''7''7''7'$"$$#"  ; ; ;> ? ? @ @ ( D C C C B @ B A V  )3533##5#6#"&542#"&2#"7#"432V'SR)U, , ,  OO%QQg, z- ,J%J'72673#"&'3&IDI+FIoKLnG*!AICI-6N]_L+>M'7[TZ\T\?)'&&XQ23275#5354&#"#"&=3326323##"#"'"&'73254&#"'254'"'4>8P9T"/hm! o(8A]5DLGJ)J;.)5PC*,HG5; 3IeS32: hVJ,/eE.;-)5PC*,7AHI3;7\):Q9W@ II A*(<e@23275#5!####"#"'#".'73254&#"'22674'"'4>32.'"'46322674&5XN4*""&R* XN4"ZH39 "0d-'D",,5)NhkM62 ;$F_vE] `IIM ; ,R?8"-[ 8+Fe+4&'!5!##".'72654&+'326 ~Fr+7,/hK(N<9'!?*Ed072D0aHDEEIIC2A(U1OZ';PIL+&dd3&4LI$e=2'>54&'"#".'72654&+'32654&'!5!!6{325!5!!674'432")::PCJ7(J,b %-2 VF5|{F7 %,?>:R71C *?ԟ;oN8DFIII4 J)!-d$Ae>.54632675!5!#327#"&54>54&#"#54&#"sh2-AuX@Q+K_89'77'*(9';DFd'77'7%&4J2,)@@SDa73cIIf J20Q4+'!=)M;%;**>& )/"FU >{?'gB3{X72674'%#5!54&#"#"&=3326323#'>75##'& *J# m$75##'' *%U<1Y7 M7IIF3 ( @={#2674'%#5!#'>75##'#'7' *%U<1Y7 K;R:3(!/f# r&;A`7DRMGLK(.dF.;%8?Q=2-6BGN/;6\eU:A* I1"!0'M57 TJ MMHMI(;K:.)6PD*,6AHI3:6[eO@A*&I:J ]m #)<'P:3 <7.CI, 0+WD23275#53%7'73####"#"'#".'73254&#"'22674'"'4>:S9T"/h1d?UMGLJ)+`I1;r[SC*,7@HG5;6\eY6A*&I6$J 8MN#P;2 <50CI, 0+e<7267!5!!632'>74&#"#5#"&54>32."#"%H9I8]yFT.#7IH+@m"L2 % #/>(  IIP[9X0m1!,/' $`D'O:P4)4- eA%#".573275#5!##4>32&'"3275!#'32675#"&{";9eE9" < 2' HI#*  =L($D)0/$8X2(94D:Pq7)@PLD%$."-IIX1F: 7Λ&3::%:(3.D e#".54735#5!'# E.(; GH :DII$Ne).547#5!##5#".54547"327!;"6ENIIoW2=*(2.*Vx*IM*^I0%IIܼG 9&6-$P'(/Le/346;5!5!##32>2#".573254#""&#531>6.>.,"9="4lRB$34P_-q H6y__y"!`II1= I 4L(6MQ7."FX7p"]le%2675!5!##5"&547#5!#8e $lGIt5@NEiY&;,`:IIEFb-#46 uIIg)9PCHnX%*-g'ie0C%"#".546;5!5!##5#"'.'"'46322674&7##"3>3232C YN4"HI7T&-'D",,5)NέH 7. '&)E] `II|-F ?8"-[!8+.M ( e(6323275!5!##5#"'"'73254&#"pN*)'II3%D*Ur0INpK4 & II!2&V:Fv95 8e746;5!5!##"327#"&Ag68z)5+6(_3DV{lMmpIIL()A$V*te&732654'7#".546;5!5!##"s(1'FB96LzX6_<"`Hl$ %;#197'1*iP`.HS'De}II#ce/46;5!5!##32>2#".573254#""&1>cY6.>.,"9="4lRB$34P_-q H6yy"!`II1= I 4L(6MQ7."FX7p"e%.74>;5!5!##"&54632#"&>54#"1A+m)2YM>4#5 #:<g>(2.7@,hII>.?i'-4B,& *= L);31`e####"&=#5!26=#`GJMC@U*`[-$?YU>I)1V4e4>3!5!5!###"'.*1'\4GI?%4 !! 84+hIIr;>6 !*+04*e3%275#53##5".'3254&'"327"54>320rahHI!&*5eC)(15.B; "3+K^-II  0FH {)6.0Cs 0 eEAe&46;5!5!##"34'432#&'".*E4H!(F&,/b$In?' &?W`II+!C&1*M >B)93(Qe/%2675#53##5#".547.54632#54'"63"e9`HJ_r$: 7-5G3.CI(1:0S ư89II_ & ;*W*0HG(%0"R ES48e463!5!5!####"*JY8GJ B(%IIOX 8e'^X6Le 7"&=#5!##5'275#Mh*IH*I<7;X@II'J7%-e'7"&=#5!!632'>54&#"#5'3275#Mh*D1E^{E"S955H2;-;8ۦX@II?WDV0j2)&&1#%-0e$%67!5!##5".54672&'"327'M HIA=5L#YF G8+'7.#$ IIܮ/)<0Eg PN,6vBe&235#53####"&546;54&#"#&546.IhHI b )4N Fc/7II c r!/0=e46;5#5!####"&%5# )^HI bg "II NpI,e4'#5!##5#"&'326275#9,HJ=Q`$)5LPD)A54)II5xd ,Q,30ZLe#"'.'732=!5!#dK6 :y3 "'0?;J>O3BT 6")3D[)-).IIhe'^Te%73".54632675!5!##'47&'"s4F?%NN8cLYCBHGJ/b B&1./F$K3!@-Fe0E^GB|II`r*!!(. ,:e/;>75!5!#"'#"&5463232654&#"'.#"32>P >%A,RK^'(`HS\DWR:-"+(( I3)VV' `4kIIn 1;,UfY]gVQh'NK0+<  *Amu- e'^We&'"327!5!##5#"&5467202,.!"B<^I@CGfWHFl9'( <!IIܮ4j?Dh e )&'"327#%72>7#".547#5##7E'(d+yP2./6@,28:.bMGM*!z8EW45( =(*6&5IGe 7"&=#5!##575#327'Mh*IH**:.EʚXAII'&,)e#)###'#"'.'732=!5!5#GK&D 2a,3 "'0?;J>&%,Iw.6")3D[)-).Ie57".547&546;5!5!#!"632'674&#"{Y=_R;AK#K&:!99!;,=09X{7K< *I-98K>&`II ; 7' .! :#53__O]K##".'732>54.546;#"?ZZ?bK)\A+3Z`.)?[[?>3 N +;470W2"'632#"33254k@ 6=S&7 rP\G wBxA!.:)'AS`]L527#".54632#.#"B6.9)(@R.SQ4a^(%42>7#".546;#" &)D;='E9aTC9 <*8%8IG6&A!/46;#"63>767#"32>7#".547&E9aTC.!"&)D <"  ')E=:$C{8IG6$ <* !  ;)6#0#$J;2673#"&'3q+FIoKLnG*!-6N]_L+cEX#54&#"#"&=332632E?# p$L7#-H###53'2673#"&'3MHMq3@HoLLlG1/H6.N\^L%1\###53/54&#"#"&=332632MGMX? l&:B\5CH2 0'M58 \ ###53'73MHM==YH:3###53%7'73MHMB1d>|RH7#^9'39!W se##3MHd8b#53"&533265232>32#"'732654'"##".5732654'.#'2>54&#"'4>{RR}zFR96];P5" C7ECRPB:* %!+Q#(1G( /3(S<29{Q)(.%$>3' 8*YLTqqT6FE7ZAF& 2;2o\Ys1G0@/ .- -@!3HK2!/"3 G0 ()  (.2 6#5D6*2!5!&3,M2.#"676322(1(! 0!R +1$&;<>32&#"!0 !(1(A;&$1+ jJ!!72673#"&'3t+FIoKLnG*!F-6N]_L+e'^9h e'^: e'^x;e'^m@hce'^mEhe&F^Ee&O^Oh,e'^ESDeH%"327#"32>7#".547&5467'#5'%&'"'>325!5!!7'432+ML>88O#7( &)B=<& +4)H+b"+$o?|B-&A-=8:% <*7#5$&>/C )=ϛ9lM7 S]-HH5J* -eZ.54632675!5!#32>7#"32>7#".'47&54>54&#"#54&#"pg0,?rV=O,Jhr4="00",1 '*H="'*E*4)";"10"3$%7G,"2=>SE\61`HHd L3*G-'+/ <* " =)1 8$&>$>-+6!$(%DR"0x@f77.5463267327#".54>54'"#54&'"J& /WA.=6,= %.%"$0&'9 '.'K'6%#.a/>4E*'$ #B(.#, # 9&34"3>'v:SfO7.54632>32327#"32>7#".'47&54>54'"#54&'"J& 0XA0= /&2'/'$#$$  + !8&.,'.'K'6%#.a/B(J*."?14 $,  .+*/;'34"3>'s'C;eE&P{Z] #"&546322654&#"i]^fi[\j:CB;6E@'aigc`kmG>:DF<>Cqe 2##"&'463254&#"M]I#9J\i8!a?"$5egRX7YFI^,/\'26Xe>32'#"'472>74&'"X}/Z}#72<eB;/0SN?5^#.qU4W7 +J4/q97D/de3%4&+'3254'"'>32'&545463226b6A,kpfO-'%66!@&W?P7osB/B1?KMDB  ;(T!"8!HX t0>*ENe#,#"&547.5467>74.'3254k_GE[eZD-?(d,CJX$9X]eDUiWI@OOCHW?L3 B $=]+L ) FKK9ef2#'#"&547327.54'%XML-5Og:D E.- ?I*n[_m"f0G=8^ee0;#"3274'432'"#"&'47.54632&#"V$HZ/@@0 @!'8C8" RjV43_BH!)G(+DIH)(7 V(1'#_K`2K(74&#"3L#fP +! $ WR"+ 2'^/e%7,H_ *  1BY%%/Y*#jQ) 2#"&54>32654&#"1I49:" (,!))A42F0 #n+",!E#53x ;'g)e'^7'^j'^;@,e 4'#5!##5#"&'326327'5#9,HJ=Q`$)5<6#]<2p)4)II5xd ,!,L+,8e463!5!5!#3!5!##"*JY8GG B(%IIIIX e&%4.'5!5!5!#3!5!#".'7326v*GGA.#T97b@% ;>b-#46 uIIII*)9PCHnX%*-g'Xe>32#52674&'"X}/Z}&;?HOmN?5^#.qU3Z<&{A7D/ce/46;5!5!##32>23!53.'73254#""&1>cY6.>.,)P0\,34P_-q H6yy"!`II1= I P/II#hD."FX7p"e(327'67!5!#3!5!5".54672&'"s7.#$ HH[A=5L#YF G8+!,6vI IIIIq/)<0Eg Px#"&'3274632#".: @#,M0& !8GVN#h " +( 3254&#"'7#"&54632V&/"2*$;(1C9%5D&)!6*_1)@42&C"0 !-72654&#"7#"&54632'2654&#"7#"&54632 3%k4&(AA"D_ 3!o,.90@#(8c80$?3;'1080FB,$4@.%!5!##5'#".'732654&#"'632>G3R4C;aA* 3{F(7?()/S<^2 [?33\~I:bi:=-'N< ek={6&'##5'#".'732654&#"'632!5!533##4-3R4C;aA* 3{F(7?()/S<^>   3JJ3:\~I:bi:=-'N< ek9 [?3 M3 >3!5!654.#"#"&54732632'&/32654&#"'>32nX $l6J0 42Q9HR@o'";+*9(EA4*?&547#"'73274&#"'4632>3'23!5!4+"&=33G)..48+5G"3'!=513>(.^J(c>.]:E1+$hkUUkr:d F;#%d1[0N +.N)#,5=33?,J23!32?67#".'32>54'#"&=#5!6=4&#"5473V-BS' 'fP9^8)32R.(< "  7.>f- 7W6E3)2 (/!ZoD_|V'!jwU#3)*%( +-3 f01@/C23#327#".'&'32>54'#"&=!5!4&#"#"&547326h.DU2@S'AA#QE3313-$B'2"<>)%-TSR- ==T7H3"p9u2J%VL^R#/ >*4S:3.8.21X092675333##54&'#5&/67.'#"&547^O>393TT3 632$eo  L&*'"$pC; #8"6#'%y\3j;D+t`N8H4 21& G/3$ t5y;2>54.'&547#"'7>54.#"&54>:F55&8,7 F.6R^R6d,* , %* &-#gK>!+;%4 2J.1&6($*R8Mi*1+ %'/!9-#;.2#.#"#"&547326324&#"327#"&546(23GG ORR,BI>F, #;3O9H_5A@1:'+Sz %/9#LYG#4.#"#"&547326324#"327#"&54632654/&5467LW3 >.DTQ,2BTD.+ #7# %\Z%*IhiIW((/G_A5@1/1+T#x"+'8(0:&9(D$)!*"I>2#".'732654''254&#"&54632/ "2)(H75%)3 5Q]L#".'732654''2654#"&54632654.'&547QP5,"2)(H75%)3354&##5.'7z86H0/")( [63 Eu6")C`*.33.&N4#B%'6MfXOMFX/+33##5./>4'"&54732677W$Ld3443:3:*4(%1( &'=5FaV3R,1-45)*%/DJ+{+2533##&#"32632'>54#"#"&5469M.3443V^!F O",&"'*I N  W15HM3`7#)"5"% O %1^.%27#'47#5!##5./7#"&& !&')At533JN &H $ #a133AAZ (R8  8B>32#"'326?#".'732654'#"547&'74&#"32 I4 '.',69(#)ZJ>g@&3"5R0<3% =!o#>(<$UE$) W<P-JcM|B @ykAE.0,"4!W>1 .72>54.'&'#5!!2#{#bDLgH"L6: G5Yi 33=.(L./:.#532654&'#"&=#5!!22654'#"'%8/$22D"9rGWw%.\30%[ML  C1  ;) %> $@t3\2&?^.33! (/K&Y.@7".547#5!!327&547".'32?#"&'&5332654'(3 KYK9<10 #BP2$*%,SAH3(4&"@(2.a1337'!kmHTjN]X !!# B!-"')!3_x+FS}A) 6'$&3$675!5!33##5.'#5.#7p_ 63JJ3(3+@Y+)Ca,+3AX3=W8?-KV1:CY#"&'#4&#"#"547326324&#"327#".5463267>32'"2654&#"532654&0g,[3EG g!}/69`:, @*  "#! *7%!/,=j7_-X83%'/(240gCI:E9 C<9*#S )5. $ $>Ab!>-4lxE49!,3%F'223!32654#"'632#"&5#5!654'".5473.I;d&!"-:c4,'E<[ #,!*a7>54'#53&5472654'/2CfHFV2 P6&):4I<"G0,N73k*EFHZD N=%3]G54#"'62,'M 35% *>.9d?'33q 6Y1&"!=8[?#327#"&54>32533##4&#"r, )F>)3& 3553Y$5@?3^+1:('c3W+w=&U.+/&54>32#".'332654&#"%5!, 8&KcfS5+# 3  $2BLF57va '" '{y 1&@)I%%7;X/:\IFa!w33033##5./67654&#"32727+"&54624\%jI3QQ3";,C&,n'B7) ? (V~Q8P)YX3I% 58<"*$3- 2DJ.'#5!!67&54Mc3Og,./j2"33!PO_ Lcb-5%"753##5./7&54632&#yR3GkMp^),*' yU-J1& DJ3VGK)[F=8Y325!5!##5.#"c4#4,b333B$&3"&D/F"f33BE--,  s&>32533##.''654&#"72767&#" n6F4==4* $%.% # 3#43B1PE3:H "&!$ 9 ,+2&) S.(3254&##5./67&'#5!!32#"' I<38b($f4R9>(69vKZr7 #1?ZFA_ %M#6@33*8&1,'aOaP'% .%.#'675!5!##*M!~/3%Y*6b++33IX,G5.,0#".'32654'#"&54632&#"326%5!%`K9bC:"9%T,P"5R3O)4! K%3|5 #!9 @s1Jm_:Q?3Z7?#00:233.!.'5#5!##54&#"#"&5475>N)33`#B2U)D>=79.&!"33C+P,],82N.67.+5!##5.')9Ye 633)9?Y7?J"1#9CE33LCR F7'2j."675!5!##5.#754632#"&23*@Z+09twF&A^6&33Y8?., \'".&3"&546326325!5!##.#"4&#"V+8>FG;1.+&k33 3%'9#.%&;0S>@R0+ 33!JL0)56#"'73>54&#"563263533##4&#"327#" 4$E5N3::3Q$!, <X&)-1=8k_  $W3^s/6 +.&'#5!##5./6&'5-~:3BdE*I;0|UL#A33@]G:%3(?+7qc{.(6325.'5#5!##5.#"#"'7326s@5"'2 B_$53 :'30A,-84EK7"33N4?4j" E.#2&/32>54&#"&546'5!6lY&_:&: M$B0dY:o2[p!H9!(# $<"%*9+K33_ 4632#"&"i2".$5!&/32>54&#"&54635-AY&_:&: M$B0d/3NK+o2[p!H9!(# $<"%*9+K{.+532533##L)Rb3BB3.38M33###53'>32&#"BIC3G9* DXV#BUe33:IdNJ&Ww)$23###53.#"'67."&546ц AA3@@f,[o -@Hi)m33Rv$ *!$%H*iL"'2654'7&'#"&5463267&#"0 *:()(0M9< */)?/*8BA9/"9S @$463'7&#"327'#"&B1. !+1( )3&0b)5?"!#&r/%)?+dsj2QG~8Q%) 7'?'/+dZi!j2QG~8l@~8/.7267#"&5467#5! CL^O<&[rD3  :fK$31n5qL,7467#534&+"&47326323#3267#".(GA-Y)*3,2 K@<G>=0 C0H"Q/342H #6M3j@~  :9TD6{'5J4'I/Z'7+{({ 13"'654.'&54632#".'732654+9 &-0 J[g7_G:OC# & /8- Li 4 ,#H/5.PBTA4(84'  >426323###5374&"#"&547c)B&GRR3VV3(B`T*4(,33$63!,7).1<%"&=#5!!>7#".'32>54' 4632#"& %) S(4wY=a9'3Q)=#   * 6(33[%p"YoIg]$$6-2(   4 a.(3"&5#5!!32654#"'6324632#".#4C9e"(Hv!- /733h0C# "mP_-!. '!##5&/674632#"&eW83C,=,E$y/(" !%&]23Lp/8B*5j "fX '&R:2675333##54&''75&/67.'#"&547HpCD960O>393NN37ds42$eo  L&8!$/3#(8,8"6#'%y\3i=C+GT*8jU`N8H4 2!$& tyu2>54'.'#"'7>54.#"&54>32>54.'&547#"'732654&#"&5465,".]," #,* , %) &-# :F55&8,7 F.6R^R6BCT G0 .8(!*4F2!$19"  *1+ &&0!9-K>!+;%4 2J.1&6($*R83W )$8 3 %1   #&$,32654.5467#"'732654&#"&54632R=2GG2 LZL/D7#!+45,$/",( I5'9 &-  #("2'fAA 4&#"326'2#"&54>pA4>I@4O<8DR^IXncK*8. Ml,)%#"&546332654.'&547ls=.A?1   19O+$==* 1EE1Mc09/ M=4/!1 40 +0=b1#%#'&/&/33254./&'7^2a"HC39@!* R'u  H:''*"6E@~$@;#''=.V  *!&#-?,'2#"73>54&#"&54>&/;1!)BD$a3+mG$6O>$1: 3 #4X7A^/z C!*4#Dz%1= &,9C 262654'7>=&#"#"&5467.54>32\>s(>h%:r"B+%3~aGER'D@=&7/43(J/#C.@ $:O0", *1b8JL?'13M/%8 8&+61%23&5467."&546?6?&'>32#".'732654 Z #+) .! cI>jF+3=o@1BL2228* #3-(8.!(! A*ZwEo? Hm]E?`0;6363637&54&#"+"./57"#"'4632375' 89/"NF 6 l6(,x&CWL),*&v=g 4X:7 $  0"32>54&%#"#"'4'76326323;2?*-,;3N#dJ/%,$/-9/'   18#@>/#  JOg3"# >4%>5.'.547?654&#"3"&54632H('E6Q &1$&\xwR:)&:?G;7Kp I4%  - " *#/=pN` 3 0=+!7.258El: . '.+'675!5!##*9V$ %9!~A3@>e X,X.6b++33.!7.'77.+'675!5!##`:,n69!~A3H''%&&Q . I7 .6b++33$X,ba %.#529{M]M/b3=aOIf$ 3#2654'7#"&=#5354'80AA/F-,4_D99VV1$19F3Z/&R*."'<=sJXB3KNba 72673#w63/M]MOa=(K&$ %>75>54.#"&54>32%< 3@" '%*8(1[,Z :3+$'$. 4)34P: <1732>73#"&5463232654&#"&54>32#'"@8K}S5 3AR-2BY., " .9(7, ,!L;h7H# V]nѫ"D8#3(#3'(?=8N/' 73#"54#62i %*L9TG&7N#V.(7"&=4#563232>323#"&=4#"l + 2" *1&3 N?M?)" 34)51e+%72654.#"".=4>321K)! 2,# 1G$#G/98#`P(#3 $ "3 3 554<)"C.Qdt $326?63"#".'#"546326.,O+&?43473#"&53%/YHJX 7,( RlkS%0 wX 4632"&00!H $!&000'(m+82#"&54>4&#"3262#"&54>4&#"3262GC84F.e2&$ "!)C #+C86D 6k.  )("mD86DD8 ${&"3 ( 6%5CC8 #,| ) #'+h>26?53###"&54>5&'#"&54>54+5326766+;džAN/7 '$+$BJ;& G8\>]P "3[9'Ai JE>&9)H+&WI]7/$;"A /X8DaPB26?5!#####"&54>5&'#"&54>54+532>6+;@AN/7 '$+$BJ;& G8\YWP "3[9'AFi JE>&9)H+&WI]7/$;"A /X8 aJt05.#"!##"32>2#"&'67&'###53546323598G4׈iYK$>! c6\w@}}kc43 q-{L:bA!f# (asINagn@A:g)Q783567&'#5!4&#"#4>323####"32>2#"&-{MwZ2JC*@#B/am@_3LcPK$>! d/uA|T[gnAf>H&@;"g:A@>/!f# 'co@"@&"@'"?(h")X/@3>7%!2#"!##".5#54&#"#326} xJ[J0C]=Z5%biMFu'L54W?2! DY- +Z= '9S26F@Q0NCA41 *H8*AXo#Dk64 +EC]Ic>+A 8[0OG(5h"+%87"&54632>7!5!##&''327.#"Pny]cn-p! C A3 .% jZ#  7H7rSXkyEAA!-%3,3M:3"UD'9 $ J#%2675!4.'#532!53##5#"'763%T )@E ikY ȇABcL%0@Z=1 AA54'#53232>54&54632'*ʉA$0EA 3:p <>2SDHJ&)4)! A"Bd#'KANE.J3A'+c 'TZz.}'074>327654&#!5#5!!32#&'#"&7327&#"<>*>\4+B:M/E"_6,E")Y^D]@;*L;KHY+)265-"AAv/.NM1mH4SL8(?L!4632!5!5!##".'#"5!32>F3#<’pZ1MG*9#]O!;1S.?6AAsOd?zY~~f3&.74>3!5!5!#!"632#".54>3&>54&'#;$ 6 -t+o&tnrn,  "54&#"#"&5467'32>7;4=q86:;kb 2 ; (K'' &% )3!W- g\'"'(l*";%=KAAATW2OQ? &8, - 3M  KA!4%2;5&'#5!#!"3!#327#"&'.'".54[ K l>2O+#! ;+)X  @=;xx7AAA$,@ )70  h%#"&'6%5!5!#"32>32zM>k<1&,SAOK#)/#>"! euC!AA )G/3L )%4&#"32>".54>75!5!!wWPu2K, \VT3/[<4(5,0A1 4$".4>32!5!5!#!632#"'&'#"254#"77%!(%EaG

h4:}YK"3# $ u(7AAA!1X-mL37:K}9@(,.76325.'#5!!&'#.#"32632#".&Z<; I3 QEG2$i!HGU Bn0 PiW0W AA#W < @5*P7 3-"N*#".4232654&#"#"543232765!5! 69x$2/6f(H@;mZ*LM?l") @Mq.?e(>% .5?=>8B5/AA"7>54'#5!##5#"!5275!0% `AXeb !Jh >,(,>AA=G!.R=,Q"4632!5!5!#!32632#".5#"[+#Si(~ )Z5Id6H>5RJAAoz0 .+*QdE7>54'#5!##5#"3270 g@Y_b >YEhB-+2AA=3.5fKQ<\)".54675!5!!5>54&&Ay!3%,.PR  3 wm]H1=A.B/[AAY+" A=1H]#732>73##5#".54654&+532vOW75͍@Lb(X@)L%*-H AE((  '7!5!5!#!">3274#"26wEl1#B2% *)A$?Ta!W+ZQ>90MO%;tAA>&!1 &G8;IB1)+*}!*!#5#".'>7.'#5!#!352675#Az&Q^ %5!I?>0m 9_Vv3E32/ (1AA?S-.;oJz.8!".543232>54'#".54>3265!5!#3267&#"*pP6`A(; -hi); $K4^HK-p^y!)1I,=Ij+!1'=*a-'+,JPaAA]:!WqO!&(<74>54&+532!3##!#"+"[giʊ@&)5YD?o?WEAB)Av"4'#5!####"&'76732=35!f `?''D'@9g+5s RAAi$5 m*O|Lq#K_x".54;5!5!#'26=#"t;eH~K7$LZ]i=lAAeYM?0&(=bb&*%2654&##'"3"&5467'#5!##!BZS>]\?T%/! \}iINMGj|_Q|{;[AGY^B%; >}][p AA qZXD 157#"&546322654&##'"3"&5467'#5!##!R3BZT>\\?T%/! \~jHMNHj|_Q{|*!& [AFZ^B%; >~\Zq AA sYXD+!5!5!#!"3!#327#".'.54> ?$'+N +6%8 ;*)H/"+)=xAA.0@.= 1*?5 4% #)%74>4'#5!##!#"&!54632#"&3/.$sA  )z$!Z]wpAAEtv!74>4'#5!##!#"&!53/.$sA  )z$Z]wpAAEtvt 325!5!##".54>;#"v!6U.]I~01;^ 7$1(LDG3`AAc.D"LF #*@]d 2#"&54}&2%57##5!#@dBFAA.#"3###535463298G4@}}kc43 L:_A@A:g*P6"B23###534&#"#4>;am@\\2JC*@#Cg:A@Af>H#@<$@h0#"'5327  Y_cUX^ (A('h0#"'5327#".'5327  Y_cUX^iY$G%cUX^ (A('' A(' z2#".'&#"547=}!h&=!4Z(J&x)$*3!#'|&4632.#"&5432.#"+#4hL=]j&%T*)%(")("2;#M:T\HP &  @2 !m".1&#"#".5432  -U $) 1++/-#4 9)#".54&#"&547232632#"'67&#"2] $I/a3E& C!+2+ 5/)?4&5$&K, 53& #?1&#il8# 10  #.'7; #?1&#i8# 10  $.%2675!4.'#532!53##5#"&'76#"546323%\*q  ik0' ɈAY"=" !32 /^) A[\A33X[0  !*7#"&54632746;5!5!####".73275#"_\Hv@7!5!#<^TA8,h32#"&547#".7"32>54 0W8eh  8M5w-I+ FW#4)29',3%e]')E8/aRb?(0$?2. ,p+#463 #"./&543232>54#"#"i C^!>;h2!^H*l{\%t4;7[5~H2=DJP1+2)[-3?YI.,t9 $ !*))+532654'5".54>4.5474&#"32SZ]`Uj"+GGJGG,!jUNPQN5ZX7Z@"%? ! 5%.C!!C.#3 "@%"@m<..<`3273#5#".54654&+532*$WOMe@@Lc7nCL%*=/<(8HFE&9'5&'&54632&54632#"&#"yH; ]#<`VJ9p1!AO5mY%47CHK @ -(/("=$7@0 G/V" ^F#7" q BO D DB )$< G,2#"54?>54&#"#"546Qi *"9(E*&u8:FhK*kJ66  ,z_!;4,*!$"4-^GN-C`+" 3=YX"4632!!32632#".547#"V*M-IS%/k4dmQ4@2TG@"6`jK1 #=]c j74632!&'.54632#"&#"#!32632#".5#"V* @KG @ !-.#`#K_%/kcR1@2TG%) 0H (*7 ZxB #>^wH!2#"54654'&#"#"&546(; $ ()=1M'%+&C!1#<I 5B#"&532>7 YHIY 8J7 UilR$1 4!&767&'#5!##"32>2#"&35.wZg75F;8L$>! a0nD-{VZgnAA . e# 'boќ *0<.#"#4>323##"&/47#532674&##326@^v7R/ @ &=kFTv8cbLEt'L4Ozy29Z,kaA6Fjn+=5%EO9&5ZW2AZn"Dk65 в$AAQb7[5 Nfrx2#".#"#.#"!# #".'&5#53>32>#"&547#"&54632'2>54#"%3>74.##32>sI, %4\;@z  #N80$ )  !fTBhC1// {yM" ) +\FMOdhihW,4$@tu4.?,^>+ ,;:) $($A! "! EkI]+:iN>: A]ELw7 AMD$&   t}Hh  2#"&56#".'3327w%( #1X98X2$ oxi!.C1$#0"aa< 2#"&546y"*+!5*.0%'"+-N 2#"&5462#"&54  )!+5 B)4"*$!')("+&#+*%2>=3353###"'#532654+532# (/ kyssyi8%I9C$A*? 5"xDPcW( BRUD%, u1#32>=3353###"'#532654+532#pp[)/ jyssvi8%I9C$A*;,X 5"xDPcW( BRUD%,  $)%*726546;#"#"'47&546;#";#"(J8&d)_FCOX7!UL/I#,  ?0W CU>1!Y8GS6'X.! /246;#"#"'4>3&546;#";3265f4!c*&z^;PX!?UL#  8'-F1>5H2/ES'S7IS1?F $;<"3674&+'32654&+532#".5467.44@F1Z[('d3B> p>_5! |X42$= Sd B0AM*'V( !SK7k GX(6)Kq,D;346 #4&#"32674+'325&+532##"&5*pj'IH+P;8JHXYIHd3C_olme 3l!B-#@-'OSK=SK7$7 eJUfP62#"'732654.'#5'74&'"'4>327537&54S.L6fEX29#(<)1sNR#*O?*Y08]+AsP9OAB@OT12. 0%:OܠMd"c @Bdq&": IE1%3267#"&54>54&#"#54'"#54632632D& .&DZ-6--[G? SH8S'5OQG(0(K4 G XP;=XE5U+/'30F'8F'=F'1G '9G'9G B.4>32&#"3%#".'732654&#'7"&G"9; M^ 6?f(  Ն-*)(^b-6KXb. P/% 'P8Y  D;/%*G3UH 232=3353###"&=&+7~!1>Ckkggi8J,Lg:+2=;g9JV?TJ)#34.#"5632#"./4'7326Jhh 3#L->vn /Q32"WE'9;-)( X ls.9. # AM9'732673#5#"&547.54632&#";#"n3nYg-,,L~}K 9?l.[JC*9'TNY.:747"&54>;#";#"27#"'4672#".32654&#"X#G(! J<)I&(?TA44 ~PxRp'"%'}H/D3"4 S4#X.\}Of0dEP ;/#&51346327#"&5467.#"32>5#".WF*U>3L $2;49((" .     /:(EOa):>+R _7NJ=f $($'0 X #JS=653##".'532654&#"#"'532>7.#"763632u, 76 ".4*,;;W*@-%6 0*.B$9CH3Q=He0ZYD7G(7_JMW')=/BW@X*a#353###"&'732654.#"'6gxjooj $.V5,o )PBG2&L"=kQ&E/%;[ /LK-? [&4&#"7633267#".54>0+:1C-K%C?&0c9wX+NJ->YZ>f c9'.91(XF*]&>)P8*>!#*2&#"#".5467&5462654&'"$@-)E[>YY>-JM*@b8# X77p?*NGgIVYCGnO)$4/AR)@N+=,%1;&7C#732654.5472&#"#"&'X j2:N@\]@<4.BdA\\A/LN)b}G2&"+<.[<#E05N'X!$ 54>54#"76323274632>XY>l2C/Kqh=XW=@-H/{:)?#!3 gU8);!(-9K9_2Ed)#3%#"'53674&#"76"&53327dooG]$H1$%(M-# 1%srO;T@h+bN99"Pa+5RՆe:CT%\ ".5463753##"327;F5$wRqq9D . 1T6QrlSF;{X40#5#.5467>54&#"#&54>32326734p,z-oTZ.1/5-a3 :%1H$TL[BB:o.""bS .%&06 , "13HR 8F+%7"327#"&547"&54632&#";)')LJB[gN;t[=Y=+,4* TTXgVJ/;+?MUDP461#5#".547.547654';#"326734p3$85%N9-b-< Z)1).~LG9,o4v ?,A,H)L &!RM'G+N "72654#"'463!53###".>%!QK"$HDSqO5G>7".=4+5323673#56O$%[<%"_rrF7%6+T,/ 5 _C64>32&#"3%2#"'#'&'732654.''7&\ 553b!>9>& 6gfkKCWb"KB  Q,  J( 'YU.LQ~5A"6&   8d"726=3353###"&54>32&#".;osoos'AA"l!77,.9IA/T)7O'sy9S) Lu(".54>32353###"&54354&'2"-&RN3RT,8@,kooi\:1X)$O6+-BNr: A*: s@.]<#4&#"5632353#5##"&543s#%=jppj.$8+bQ, X rj&;&`+'#5#"&546;2654+532"&#"32673+qW\k"`+EX7I|*  .& 3uq/t9x_(;UT@(2:7265&+7!2#;!"&/#5/>lIe3fG(V-%MT\D7k TU$#5#535327#".54632&#"po"6*7E9't)0"53 51-SJW&9a32&#"3654Mhs %!"RAV~ ?+ B2(XVHl#4=[k[=l+QO1 R F_#5#".54672&#32673pVYB[,jY5-'64+Wp,>*GC&P`N/9k*'K1#3"27#"&54>32#.'&+532>74&Kpoh,&1(>P!79f{5$5 fX {%#.%U3!9173267'"&=4&+5353#54:QOUm ,qqV(".`6 T$J&2353###;#"/#532654&+5&0#mppS9 + &F10 6%-1a T1U,*%T3"&547&543.'"32#"'53254&#"327)O+?.-?E]2M`5<1%YYBAM$J3~NOYw0&SP"*4$>AQ0%.B;!9(6[(+#53ggOe #46;#"#"&54323254/&=8*$6e6 :%Mn 0p6g50>$,S3- +$_*#a47W/<#3qq,^4>3'.#"#,JM)~3_ #*FUpKl8SZ)  `N,2#4.#"#&56>@{Hp0 XdC1A5&'*"<#'2#"&'732654#"'6I][KGh<71J7'H'%78YI D$3*"327#"&54>;)7v2=.CaXx$, 6)\-Q*_H%: Q\#+ 46;#"327#"327#"&547&G:dWDU=*'(O$?!*1'(O^XDY9KH7D=*%=+V4/%(r #".'3327=#D&>22`-x)"-[=t#3` O'7#%7uh]Q"G_ #".'3327#3"F&=12a,y) oo.Z=f)#3#3_oo  '7#%7#3 ]P\MLoo:& 2#'32g !Js2#"&54#".'33674&#"#"'532?672#".'7326%3274&+73274&#"'63#".'* %? &5b>-K2*oM4v *#)5#Z-O)H<9$p]*" +R"4H`4a!"db;16b c3'#5'74&#"'4>327537&54S.QT56* e).6!!-#,rOU $U>.E#,O,AtS6<&8F, 8(!6_OݠMd!~c +2&I^J !: I*E%327#"32>7#"&547&54>54&#"#54'"#54632632J8*'(J$4!  '(O_LF**-[G? SH8S'5OQG))`;=* =+F3CN(.$OLU>XP;=XE.E&e"-327#"&54>54&#"#54'"#54632632d#1&4F#*##E80&@7+@*;t$-'*'$317(9g4&'e"3f+J>3267#"327#"&547&'4>54&#"#54'"#54632632W& %8&=I1 !#F61?7+> %@?6)'"'+"0%306(8g3&'8,#0"&5476;54.#"3265_B@X`=?# (78+'4_\EB@B\_&7 P9:JJ:*463227#"=.7"3>=4&hSNg+3,t/B #,.# #ANgI<#"d g (7+v.*.+]&7432654.#"'632327#"&5&XF7c =*=?Q0k ,7H2M^T[Q 'OiU  Z[J +#"'7326=4'732>54.#"'6Zr""d}]lk6OG-GG++51#9 cR="' lH`FL83(HV   P!""&547&/7'32654.#Ml}N`7[4$ M@b%"!&"L5]E_^Gp+"Lj.Ga-.%8?!%;#"&=#"&=4+5323273 "i!44E[P "$* 4nE TqT:T -"#!.47467.54632&'"327'"#'2654. B&.C`v+Y!P %o]o]fq-H@\]@3HA#ADN   Rb  +?-=NL#8*%".54632#"54732>"3674&j+JF)`CSf "6W9O @4+@ 0*#`, +)Q9HJiX=c]>%]%7 6)2&!,-3?h,'"&547%327_BI>0;AI+k5hVY4P1%1Qc)"%#53'"327#"&54632&>q(>5"#0.ns"0'Q[M7O&^toW RK B%2#"&5464&#"326%54&+'3254'"'632'&543226e0<.-0=As"%'!#%*g5A.lukU .3N`B&Y@R:qv7C.*J@,(5?-0=m342'/BKPDE4OCU$"8"JY x1 A@I?<(#"&547332>54.5473vucPPH-?!0::0P 19?2!x{b0310IZ%BG+4N.%#(C, %+!07Z<0%%#"&5467635#"&=3;4&#"3260ke=54X P KbPWHJk\KJchoqc:`N%nQGPJGJQM<F'3%#"&54>7654.#"#>24&#"326Fmi/(6!-%1,PdN'++P\KQreHPmj|~g#;*$ &/',T>blfM@,I0Ka^OH^X<-9#"'.#"#.#"53.546326324&#"326pXP8$$ ()&$$v(V47LfWY7=jWlP>:=E@<@>Ys/XNH+"#[\2"  P0LYNN~T=YZ>=UR<"%#"&547332654&#"#&54632o P QLJEG;DEPy^Zyo ))!Nf]LJ:?M@]e^W<&%#"&54733254ᒐ&#"#4632*+fPPH4D<7#"&546326324&#"264&"326dg{ -@B]oLGg 0CbX{r9)*=:Z5>PTSADPd~zg-<M'YAJ[YF#Fl)2:*-6>AGRBAX`P-*%#654#"#"&=46326324&"26-1P1\43<322VQW$G01F$1&P$3:dABd9-TR11RT-[YVV>n]77]n<%%#"&54733254.#53254'5++gPQG0# \ADMP0!RNOpeI88CHW#32<qr< aFc,\<oA#654&#"#54#"#54#"#&'&'&!"53&54>32632632o/Q0/0,2AXW@BURPQsa^w>AYeLmrZ>TZA@V\P(%#"&54632327#"&#"6324&#"326cgPgT;@ -va?e\PXA?VSD@WasyfCeIP[>z]AZS?EZVP"%#654#"#54&#"#&54326321P1\34P43\1P1X3/d^yb5I55Iby^(LL<.%#"&547332654.#52654.5473{\ePSCAH//(`:8QQ8P(=F=(S+(Zdkb#BMMA(1<0*"'B, '3?/KT.%#"&547332765#"&547332654'5673sij P RK5--8b7;J(B_PV"6/+Qi|k0)!Lh#$b9)8A? M! 0 < H<9%#654&#"#4654'&#"#&5467>7673632632ASD480"%P.29+$ZE{z PNi` -A*J=VWlk_Uo;U"#L  ' F!K47t*ml64#X(,#K2/+$OnP%#"5332654.'3bPDUP`pVD$8+);<2>J#".547332654&'#"&5467.546322'4&#"3264&#"326&@X`51^W@'OPOpuIB4e=Bc9,)3]EBV!&.1'%15+75'%/+<%#"&547332654&#"#54#"#"&547332>32632')o P QLIC -"*P 34;P*%( +Z>LZNQo ))!Nf^K]15."> A47 $>N><7C#".547332654.+532654&#"#"&46326324&#"326A8opDvWT hSXi-$<9/>>0&> zU[~ZeC?3N`I<5#654&#"#4654'&#"#.#"5&546326325I.79/! P%$'9=LCBz|R PLni4sAqh\b6;dQh,c_aO54&53 iPTLJEA^Nd#P#I2')Pxh*01N`]L:_MD@AH1:I4 6 ="-%#"&5463254#"#4&#"56326324&#"26=zgibDX?!P1#A6IO&-]ROPbGJ^a`zldfn=pI^`G/"Z3<OXPo"-.#"#4&#"632#"&546326324&#"26oB#.P!?XDbig{OR]-(MI6~^JGb`aW!0G``Gp=nfdlz2Tb<<3HPOFGPN<w#.'#"&547332=#"&54632537'5&#"32wpn P PMOM;YU;E[PpppBD%5/!I/xm+*)!Pd9@9:E=\GHhO4!"P%#"&537324&#"32^h|P^^~PQ?BVT@?\thwv~XQA@Z<<I%#"/#"&'332654&#"57'&#"&546327654+53232654'7/eCW5a 8t$'~ #L'78DMQ9MTVH+7>-.? 5{G.!E$?>AM_a+Fl&(c*) 4<7#"&547332654춮춮.'&53$!?)EJ(YPU>9S4]a66ad0;JX4PVV/9#"&54>7>4646<54&#"#&546324'326c]+922&'&)C \BF<I2FgBD[HaoiZ%B-&  $48')*AK^k%.98Gm5(AL[0=%#"&547.#"#.#"53&54>326324&#"326lZMg1 -&BR_XVS C^[-YYk#T?ZkcM7,-":6C[00%'7-C!FO:dGEEtXAY`=QR"#"&54733254&#"#&54632dbQl,F,H74>-9FdFKeKcjaP>=5E7I/@A:-4!&.FTUJ2#"&547332>54򂂮&#"#&54632RoFF9*:> '.8.5@FiQFg5.>(0cQ@8==9G&&@0&<(2C)-6;5PUND1J ]V$0%#"&547#"&54632632$4&#"324&#"326Vg^QpJ,A>QeIG^:2QLP9/.13*/ 9@B?D>?9`ziQf(T>HZUF=.{^=D0*9D]lF?Q^'%#>54&#""&546326324&#"326SF&-:7@(nrv_Q=8SQcC=GCCDE>s])t89P429\wu\_t==nS=RXIFYg%#654&"#&54632;F;@xA;F;mVWkpSNv?[\>tPUnWvv+#"&547332>54&+53254Ȕ!*, $L:Us F D<, '((A&C*BC2CUF9NI%cT@55@#654&#"#54&'"#54&#"3#&)53&54>32632632-.F.,(SF'+(-F"&a7M*CRTqN:L!%V#>%TATMUKX+Dbhg4-5)le)<1M1&:Q8bIII) I`'%#"&5463254#"#&546324'&#"32\]Zrm\K5urFiSP]F(&-@>A@x_ruZ\y? R_]PX!!`CB[*%#"'&54632327#"&#"6324&#"326k^F:=&%-A@^u01}OIZCn:w[B^V@d##](%#654&#"#4654.#"#&54632632I2K2:&%.3) $>0[%+.#"&5473325#"&547332654'53273WgSr,F,E9CX4V=;QE($!&,aK<>jp_R@;5E9G) 4;>B9$)("/H@1%#654&#"#54&#"#&54>53632632IXW>Q)%W;SR9B.&53R=@%97)+7:Q<#".547332654#"#54&#"#"&547332>32632Qqm;mL@cEQWK$$<#:%1=&F&#*(!T89#n+[=:/)@CNiSJR4&--+4+;0-$,%$))#@J9.:#"&54733254#52654&#""&54632632%4&#"326xfhA VIz9A//[kjmPf53aDMm76>65C?=;5=5E8H0$5u:N=6%#654&#"#4&'&#"#.#"53.546326324F446.$ <'<6jT%u#VGj]2{[9AfZ(C:dI[=QDF8O"3aq9 eAf 'b1C ;,H[{+$Ok$#"&5473326=#"&5473326753a`So,F,H7D>>BJ\3F39/%C=5E8HWG2ZJPHEO0F% $/%#"&5463254&#"#54&#"56326324&#"32dX\mjZQ4$", 1 1?),C='P>9F;@??@A?Z}v][v:"-5-<22:=F)??T@?]^BC]*%#654&#"#4632#6324&#">KFKA9-S |Gi6#E95/Z6%#"&5467332654&+532654&'&'.5473Z9.05lE9FAAx~Qk=;?B;<(*!F'77'-< P4jr£XJ[eSOC,y??@;9?B?u=7.2518,#:v[]v{\yAS??)B^]]\%/%'#"&54733265#"&5463237'&#"26wYmQl,F,D9H<3Z=TU@J?=5E9GSKKP=?NP|~TonoY6#&78%#"&537324&#"2mZRl@{7ZunRdw`F`M#"/"'5326549'.#"&546327>54+53232654'7H/@&c+8VHM0*5.$P )11J9M#T5}$=,] 33<[.:OqB*@F#=.+)#+I$6779LI< 5!':$H;%#"&547332654&+53254+53264.5473pVdtFCM6L $SREDST 6LL6AYI:'$*/&(-RKfcNM.4;'<5=<. 1( &/(+ 1$&/ <X=E%#"'&'5767632327654'&'53254'&'532654/54#"6XUC_NC12+V-J3@3 P4E7E6/XmT/;8H)1X+"l[6lSy-W@; 6 :+ 6)7@E5D8#>?*z3^EKDl&'567&5462'4&"6lWPQV1?iXXi=3A6`6ff 56jHZZHj63993Z..x!#"&5467327654#"'7#5!632 (rN_$ 'D5NY$!* 4r/=YL'6)/4A1"W4:#"&54732654&+532654.54632'654#"hXL^*!A1>FT<--%X5LL5NF"#A1g+ W(3##"&5476;5#"5476323#3'54#"35#"32OUFN^2/S\\0/MHSOOOdr$FNNE$=5dxGUXMO,(HM(&MEn4H|kaf>u@5;<D /FNs805w3!2#'32654&+5lpplR5'%#".+#!232673264&+)(=X, 5)p]-luE<<7 CKKCVG-:;:-ogHeaF65DxD&##5!7]<yRR,4##"&5332654.#""&4632675#5264&"0Dk@!ZLNNTF$-/S5?O9X~XX? 6u4&6&&6A~=]l9csX~]B-UJ-><9gZoonAf>>f= &"32654&3254&#"#5632+ &632|ttsN1 {=GL򥤄:O1NVӤ5#7#5]]]ii*?2732>54.'!53&54632&#"3##".'{)-A";5,nuz;N%m3=%di5oQ(KJ=c2,ADYaWo)Je)$!AI\&=<";)$$.732>54'7#".532'654&#"=E:CH:%*&A>#Ғ/VSE4-@~0'2G!1HqDBJ6T~L-KeU'D_6 0JS[zN525#"'#37&' pA@3/c^^?iiBI]{74>732?33#"& G&Lqo&U@Ud-#, {_OGf %!#3# Mcxhepx')L72653#"&=3@0]o_^m_87TM_nhY@/@D5@ !!!!!dLRRR "7###"&463233!$"32654i]) L42L )]=8###{{2A]\B2 -3"#32$#7#32>54&#"#4632^^&C@&\C3MTv`o3Xc~`%J5cdV>jwFi9.9"&473327!#"&547332>32!4&#";LO,f %=)7 327&54623267#53##"'7654."bl$<   ?0+/wggw/*2@6/ ehRLMM_bI 6) H   ,.KIAAb11c<_7$ $7_< !# #333ffhdhWPP 7232654.'&54>32#4&#"#".54&%1(BJ 2:"B+U[S,%Y(88(pq AL9&%*?"LI+.6Q*4 !2(]l5BR!D=CZ2` !5]<23#4632#52654&#"]c)MH+p\58S8CK#\q.W32#.#"32654&'#53gKwG/0GyL+_^Wj{m^aHSFF~}At3Ni`12bjO4NNO:A=QIo_(KA'5 !##33#bXԁXc{'c4>32#5#"&+532;4&"+HL*c]SU}%%YKH;W,q\ݖ`R$GZD@SB32654&%4&#"#"'#"&5467'63267#53#32>32"  439++"6 X'>F9>)PW-*b67J C 36(!#4!M\k'2P) -CZ"d*%,%R,.#6D\-hBHf7P>j_pAA=R&/&ZB463233###"&"326&x^^vMt|~qr}}aѰ;'LУ5f !#3!3# ]]w]]L;'##"&'332654&#"'675#5E0Yh}k^pTkENMDMH'V4Auk`~j]bo<,GA 3#32?33#"&=# C&Lqo(S@U8T8 {_OG4J #"&632.#"!26^pm ԌaVԐ}|Fu~!535.=#53533#353¡@@]8HA]F<[sFF09 $326=#5!#'#"&54>32#.#"{$9^>-b   [ ";3)''*9g)h $0=, M+2 Y532#54+#f]]VҢ; !!5!59LfTRR5R !#53>32#5#".'#53#;4&#"2 OZ4c]3YN 3.mKCpGAA>Pq\ݲL32#"'#"&54>7327&546zDUKLJ4_'CI)ClE./`DbDAUqx+$BI3)-=ED]?E?jg;44z{'C2I8$GZ&6K'h*94632632#"&'732654&#""&547&#"72>54`HC<"7> BQ/.WHHb!4@  ԉ11mXZd.18#%51C}z`_`_=^8# #8^=r1!##"&'732653332>32'7>54#"#"'>d#[CZA5(#*d¶c0 3?,  1 2?: EkNB#18hMeY23h!3E  32& ?.#"324&#"#4>32#"'#"&54>7327&54632GN#*e;LJ4_'CI)ClE./`D`H@Tqx+$BI1'H8(P3-"?jg;22z{'C2I8$GZ",=no9$>6&#";#"32654#"#5632#".5467.5432x]A8LBa$O8]ID:2)>[*DE0Ag>(E=81/GPg,IRf0.3 ,+Q @3+=%"3D=?l85„2b 3#"&53!!3265]]veUXdnoFOOTJl*2>32#"&'"&463275332654&#"264&"2Kew +W~XX?2N1_7'Yo{;}#&6&&6l@D̓sjZmonG>t"0H-"26f>>f== 33##!%5=]]=_zR R5U %#!33232654&+Ud]=@RQAcxfR=@P"&533273632#4#"#A:I0,^'A:I0*^'LLNnLLN =G32654&7"&54>7.54632>32#52654&#"'654&#"|13($Uz.<S`Mi.*@78G9B@ 6M\XE ,++:KR(02@3'#<&* ^6HftR0L6"-R3;UV>ZB;SQ"*1<@!*!%J5F!4&'5254&+#!2f?8KC]-luOCw _:cnicdd)@i' 45732>54.546323!53&#"3##".'p)-A".JYYJ.uzPq7m$W3=%di5oQ(KJ=c$=-,-3H*aWXFAAPe)$!AI\&=<";)52#"&5##5!3264&\p"54.54632&#"#".'p)-A".JYYJ.uz;N%m>]m]>5oQ(KJ=c$=-,-3H*aWo)Je =-:9X3&=<";)#C,7>54&#"'654&#"#".54>32632%32654&./4*/_W K,X0Uv2pY;X+>nI@dEXW^VM<.+E` A)-CD*?4T `LsbZP|I21clLHvKglTY3<E"654#"&54>7&54632#"&547'32654%3254[232DRJFY($B'MQQ>?QQM'B$(YFJRDiS<)3.)<>&0/'>RFaiFJ<8+77 J>DNND>J 77+8<JFiaFRONH><6,66,6<>H2"!!4632#54&@0h;o_^m_8TM\R_nhY@/@D5!!h;yR4>32#.#"32673!".0GyL+_^Wj{mZ``!KwG/d2bjO4NNej3Ni`&#"&=&5463233%54#"#3265ifbPC=P]9"],+N~]piXMbW;eWNZ5,?WyXI(72#'2654&#""&547&#"3#53>3262>54Jbl\@&'=2+/wggw/*2@6/ ehRLMM_jSUg\7(84KIAAb11c<_7$ $7_<5C +#!23264&+Cq[]-luOCKKC]qoDxD'4>323#53.#"32654'7#".-EvLqVUOirmC_6FsKwG/d2akO4jnTTDBD,"O?NOq3Ni` 3##5!#3kLM`[gTB'5 3#3%632'>54&#"#^^V'%*/ 3-'$^ :')1E  ( 5x #33 #]]kx,nqPv %5#"32>+"&54>;@RS?+@ ]bb/Ta:j֛ZA>\ 30ddA_4&%'#".4>3277'4&#"32657R2AIvD##DvIA2RH/wRFnV_qq_VnFRw/ySKvzvKSyoys@}}@sy+327#"&'#"&54>32#.#"326=0?,82FVh+?2KP}_qSt3iJSLMTF \Q27ө0ajP5zoFQ2_b<^1Y,8I'7327&5463232>7.54632#"'#"&4654&#">54.#"WO1!dHQUb<28>"BK9 sWFBcD8cwGcO><`{!!.%-   MYuóO@!5sRui:ei243,w^4/;C4;<_7$ #8^= ,#"&632654&#"323%3267#"&/.#j vNw2 -& tIr"";# aV23NF%!;*/F>2/o $-7%2>54&#"#4>32#".532'654&#":];'/# R+1#Q])R_/VSE4-@=E:~0';+E_b4`8MBX-ŋQ~K-KeU'D_6D2G!0JS[zNE"73267.54632#"&'%654&#"8"c7CetnuJId+PLU,/"#8KFIfT"WcSVdY>EecW>;b$" "%2654&#"632#"&54632#4&#"'QP\B;b V^6j~~xsjXBI7TFEU@4^bH:}dmwa:P B'777'324&#"#4>32#"'#"&54>7327&547' A4434+_'UKLJ4_'CI)ClE./`DbDAUqx+$BI3)MhQQQQ266D]?E?jg;44z{'C2I8$GZ&6K.:T 53527&'765462#"'73254+5254&#"'2*!hp!4@rgT:k=D<>F)3X75#50Qt2ZLNNTF$-/S5%U@.UXE1*J4A gJcsX~]B-UJ-t' h"A24&#"32#54+#4632AER7f]]b`F>E\0VҢ\qkVO*277'.#"326=#5!#'#"&54>lKnCRH/wRW`Qr}$9^54&+Uva(=Z-eF?}/1>D?^r$;;p/T+49E2{ %!FI\T&2{}&7J2{% !TT2{v'[l727-{Tr2'[[92'[['[[92'~o)92'[92 P{TNN&m2'[[>2{&[52{'[52{&[72{'[72{v&[82{v'[82@&[92@&9[2@N'['9[2@N'[U&9[23'['[n92@'>[2@&>[2@N&['[F>2@N'['[>2/'[q'[>2#"'#"&=326=326=3B.3""3.B6"0"6"0"6.B''B.""""23*@&[J2'!5VU4.2#;.23#28;2* "&53265ggF>X>IggI,>>,2* 462#4&"2ggF>X>*IggI,>>,2 2#5264IggI,>>, ggF>X>2 2#"&46264&#"GhhGIggI*??*,>> hhgg>X>>X>2'SS2'~~23462"2"0""0U0""0"2^5!2,;;2^ 33##5#53;yy;xxy;xx;2^##5#5^y;x;;2_'TH(52{'T^(72'T92'T(>2{ 3 {\[_FF&62{}&eJ2{3 # 2_&62{v'[je2 5 2r1Z2'[[g2&g'[[[[2&g~o)2'[g2!  r1mmZ2'[[l2{&[c2{'[c2{&[e2{'[e2{v'[kp2{v'[jq2&[g2@'[g2N&[&g[[2@N&g'[[[2@&[l2'[l2@N&x[F2N&y[2'[lk'[kl2T-T"5vw2m3#2;;2m4&#"#3632#! &66 4&86#0(m+0!2"&53265TJvvJS}}S2}'J623462#4&"2TvvJS}}SJ2v'[2!2#!5!264&#!2AAbbT2v'[2v'[m'[2'~d)2'[2)"&63!!"3!AbbA.T2v&[92`&[2^'[2^'[2^&[2^v'['[2^v'[ 2&[2b&[2v'[2bv'[2b'[2&[2bv&['[2v'[&[2a'&[[a2m#"&46;#"3EaaE,55,FuvFOlN2%'~2%'~2%'~2%&~2#"&54632#4&#";bebR^FE_`DlARPxS :nB45J2}&J2532654&#"#4632#lD`_EF^RbebARJ54Bn: SxPR2v'[2#"32653#"&5463lD`_EF^RbebRJ54Bn: SxPR20v'[2x'['[!232#"&5332654&+bebR^FE_`DlRPxS :nB45J2)v'[ 2&[~2'[$2&[2&[2v'[h2v'[2&[~2'[#2v'[2v'[2&[2'[2v'[2v'[2&[&[a2l732#"&533264&++R83H8# #//#+Lp6:7(#42l7#"326=3#"&543+#//# #8H38RL84#(7:6p2'~%2'~%2'~%2Y'~24632#4&#"#2ebR^FE_RPxS :nB422}&J2#54&#"#4632R_EF^Rbe224Bn: Sx2v'[275332653#"&2R_EF^Rbe224Bn: Sx20v'[2x'['[!2%#"&53326=3ebR^FE_RPxS :nB422.v'[2.&[2'[#2&[2.'[2v'[g'[2.v'[&[2/&[2'[#2Av'[&[2v'[&[#2&[2/'[2v'['[2?v'[&[2&[&[a2l7#"&5332657R83H8# #/6:7(#2l73326=3#"&28/# #8H38R#(7:2#!5Rf&R2}&J2!!#2fRRx2v'[2)5!3RR20v'[2x'['[!233!2RxR2.v'[2&[2'[#2&[2'[x2v&[2v'[x&[2&[2'[#20v'[&[2v'['[#2&[2'[x2v'[&[2.v'['[2&[&[a2m(332;mm:2p "&463"3IggI,>>,pggF>X>2m(#533(;m:32m4>54#"#63232%56%B4r2@3>3m(A+&/7{:.&F).2234>54&#"#632!2)AOPA)P< Xe~3NYN3\;cE<89L,9It\4fKK8;P2332654&#!5!2#"&5RJ54Bn:~SxPRblD`_EF^Rbeb2&J2#"&5463!!"326=RPxS~:nB45JbbebR^FE_`Dl2&[2754632#!5!2654&#"RPxSj:nB45JbebR^FE_`Dl2&[d2&'[[2%#54&#"3!!"&54632RJ54Bn:jSxPRlD`_EF^Rbeb2'[22&[V2 '[dV2 &[Et2'[E2 '[2'[2'['[&2lq#54&";!"&5463284#(7:6p+#//# #8H38R2m26=3"&=hHdH6ggڽ2HH2IggI2lq5432#!532654&"p6:7(#4+R83H8# #//#+2!#532654&#!5!2224Bn:~SxR_EF^Rbe2& J23"&5463!!";PxS~:nB42ebR^FE_R2& [22#!5!2654&+5PxSj:nB42ebR^FE_R2'[2 2'['[ 23#"3!!"&546224Bn:jSxR_EF^Rbe2'[22'[V2 '[dV2 & t[V22& [V2 '[d22'[2&[V 2 & [dV2'[22 '[22 &t[V2&[V2 &[V&t[22'[V&[2lq";!"&546#(7:q8/# #8H38Rm %7'%$L65bUW_442>  ->0\ mt[«Yq2!".=3;rAo[5TUhE3rThUT5[oAkXJEh<2v'[0%2>v'['[%22#54&+Ao[5TUh43,J?A=  +(.971"*%1:8;2m 3#"#54631;+:1\D%%QGCA2m "&=3;;m6]QmndX]62W &+532#"&5432DA7FZ44,|4%#Ȓ9C5@)*@' 2W #"&546353#"32654.pu,44ZF7AD%%@*)@5C9O@ 2)F462"462"2#54&+5$$$$(D\1:+;$$$$ACGQ%%2F&?l2F&?26F&?26F&?2 %326=3#"&54&#"#54632E42GR~MLE42GR~ML;mT6NzP;mT6NzP2 %4632#54&#"#"&=3326vLM~RG24ELM~RG24EPzN6Tm;PzN6Tm2 v&E[2$+%&5463232654&'52#"&/.#"XEn >,-?@/WloSVa H%1P %*TT wTT~=+GNPTSur|K^|64PX- 2$~'[AG2$+%>54&#"#"&5463326?>32:*% P1%H aVSolW/@?-,> nEXT -XP46|^K|ruSTPNG+=~TTw 2$~&I[A2'D[2&D[2'E[2&E[2v&['E[2v'[&E[2&[G2'[G2~&[H2~'[H2&[I2'[I2~&[J2~'[J2k *2>54&#"#"&546332?>32  4 0 ?86JG9*)? I-:V :4##R=0QJMS6743/DS77[O233#!kgTiC2}&\J22!#39TiC2v&\[2!!3#kLTCi2v'[<^2Jw'['[^23##3!gTLC2v'[a2m'Z[2n&Z[2m'\[2n&\[2mv&['\[2nv'[&\[2m&[^2n'[^2}v'[i2nv'[<j2m&[a2n'[a2mv'[m2~v'[n2m&[&[aa2mB#7#533zH;mȥj2m '#7#'V@5l_ai4>mm2n 33##5#53;;ڕ;;2n ''7'7p********2 26=!!"&=EhI}xE_`DRbb2 3#"&=!5!265QzPR}IhEbbRD`_E2 54&"!5!5462EhImA}xE_`DRbb2 k'Jz2 #54632!!54&#"QzPR}AmI44EbbRD`_E2 d&z[2532+#3264bbRD`_EQzPR}IhE2v'[|273264&+332+2E_`DRbbQEhI}x2#";##"&46;E_`DRbbEhImA}x2v'[2%#"&546;3#"3bbRD`_EQQzPR}AmI44E2v'[w&[2v'['[2m%#";#5#"&46;%F2A@3F:HWYFT(F"lFpK2m8 7'5572#L65bUW_442> -5 5%20 \0mt[«Yq2 &5462+264&"\dddFF3F33F&3.Fddd6F33F32}&J 2!#32"&547264&"^Fddd 3F33F6dddF5,F33F32v&[235'"&4632%"32654&20dddF/1$22$#34^LFddd3#$22$"42N&[02! 632"&="32654&,1/Fddd0"43#$22dddF(4"$22$#32N&[02N'['[C2N'[0&[C2y%7632#"&'6264&"#22# /Z<΄2F2*2K2"&5462#"'265264&"dddF-)&3F33FJvv FdddyS}}SF33F32326=#"&462"&5$4&"22T)-Fddd.3F33FJS}}SydddFvvF33F32!#4&"632"&5462264&"T)-Fddd3F33FS}}SydddF vvF33F323462"&463254&"$4&"22dddF-)3F33FvvFdddyS}}SJF33F32v'[2v'[235!264&+"&46;2#"2642^S}}S!dddFyyF33F3TҰ)-Fddd3F33F2v&[2)"&6;2"&547#"3!"264yyFddd!S}}S^F33F32dddF-)Ұ23F33F2v&[92Pv'['[2v'[&[x2mh264&"#";#"&546;2"&54B)33)>-,?. . n19,+:,4?-,??,2m'/7326=3#"5!"&546323&54632&264&"264&"W85)`->>-,?J>-,? . . . .819,+:,4?-,??,,??,6. . . . 2T'4&#"3254&#"#432#"&54632#oNRk<5oTs2I+L1VuspTNoTKLKy&S,$D=%emo42T'#4632#".54632#4&#"32654&#"TpsuV1L+I2sTo532#"&53oNRk<5oTs2I+L1VuspTNoTKLKy&S,$D=%emo2f!5!332654&#!5!2#"&5dgRJ54Bn:~SxPRRlD`_EF^Rbeb2f5!#"&5463!!"326=2dRPxS~:nB45JRRbebR^FE_`Dl2f5!54632#!5!2654&#"2dgRPxSj:nB45JRRvbebR^FE_`Dl2f5!#54&#"3!!"&546322dRJ54Bn:jSxPRRRvlD`_EF^Rbeb2m!5!#54&";!"&54632n84#(7:6p8+#//# #8H38R2'5!";#"&5463 |BZ:nB422PxSzt^FE_Reb2&[327!2654&+532#|:nB422PxSzt@^FE_Reb2'[ E2%#"&546;#"3!5 SxP224Bn:beR_EF^t2&[(D2m#"&5463";5)697:A>25B6A:L2L333##5#535!kgzzTxxTxxTw2L !3##5#53539xxTzziwTxxTC2Lv&[z2L!!5#53533##kLxxTzzwTxxT2Lv'[<2L!##5#53533#!gzzTxxLCTxxTw2Lv'[j2mR#7#5#53533#3HpkCC6DDmi6==632 3632#"'#6264&"2T1=PrrP=1TT@\@@\#ss##\@@\@2#"'#3632tMP:TT8NSrSn8u76v2746323#5#"&2tMP:TT7OSrSn8&76v2%#"'#3632rSN8TT:PMtOv67u8n2463253##"&2rSO7TT:PMtOv67&8n2 !!!!#2ffRRR2 )5!5!5!3fRRRC2 33!!!2RfRR2 #!5!5!5Rff&CRR22>=3"&=##$ , RHHNRڽ MccMkx2354."#546233 , RHHNR MccMk&2!#335462#54."$RNHHR , xkMccM 23##"&=32>5RNHHR , &kMccM 2  ##37ѡTss{2 333#'2ѡTssm&2 !#'#33^ssT{2 373##2^ssT&2D46233#"&54&"2gg1-TTU]6L6 IggIFo&q&66&2D#4&"+3265462DT6L6]UTT-1gg &66&qzoFIgg2D326546;#""&2T6L6]UTT-1gg&66&q&oFIgg2D"&54&##32265Dgg1-TTU]6L6IggIFozژq&66&2{ !3 373H^\[_tt&2{ !# #'z^_tt&m2  57'72r;ZX2'~)2&[2 ! %5rŔmmZ쉻X2{ 3 3!!^\[_90F&cT2{ 3# #'!7!^_90&cT2 5 57%2rPT+ZZ012& L2'[ 2 % 'rPTZZmmZ0:1d2{ 33{\[_R&2{3 ##2_R&2 5%!5!%2rvvZR2!#5#5353!%5 5;HH;vrDmmRmmZZ2 #5462"7#64'3%5 5 gz#.##. vr.RB2++2).ZZ2! !!rvvmmZR2{  3333#'#{\[_RSRSS&  2{ 3 ####353'2_RSRSS&  ^2 5 575#535372rRZZeR1TRTT237!#5#535335'5 575.;..;ArTRTTmmRmmeZZe2  64'5'5 5777%462"&'#5 rRzzz.. -C,xqZZqIRHH)**))B.R2 % 3#'5#75rRZZmmZeR1TRTT2 2657 &5TbbCTi2 %4&"46 T.TCbbTi2 7!264&#!'!2#!CbbTiTT2 '~) 2 '[ 2 !"3!!"&63!bbCTiT.2 % &5-2652mmmicbb2 !%46  4&" .cbb2 3!2# !264&#!2cbbmmm2 '~) 2 '[ 2 !"&63!"3! icbb.2 26= &53!5TT2юbb i2 54&"46 #5!T.T bbi2 %3264&+%!2#!53#;bbiTTT22 '~h) 2 '[x 2 #";!"&63!#3bb iT.T2^535332y;x;;2%#"'#"&533265332653hIO77OIhT7&%7T7%&7TJh>>hJ(&66&(&66&(24632632#4&#"#4&#"#2hIO77OIhT7&%7T7%&7T(Jh>>hJ(&66&(&66&2 2#!5!2654&#!5!2654&#!5Gk##kGD$88$D$88$DڀL*__*LTO)(OTO()OT2(2654&#!5!2#!5!2654&#!#5#5353$88$DGk##kGD$88$;zz;P()OTL*__*LTO)(PmmRmm2 0462"'#5!2654&#!5!2#!5!2654&+64'#.##.6 g$88$DGk##kGD$88$ T2++2)k.RP()OTL*__*LTO)(P.2 3"&5467.5463!!"3!!"3!Gk##kGD$88$D$88$L*__*LTO)(OTO()OT23265332657#"'#"&57&%7T7%&7ThIO77OIh,&66&,&66&TJh>>hJ(2%4&#"#4&#"4632632L7&%7T7%&7ThIO77OIhT&66&,&66&,T(Jh>>hJ2 7!2654&#!5!2654&#!'!2#!h$88$h$88$TGk##kGDTO)(OTO()OTL*__*L2(!2#!7!2654&+#5#732654&#!3532Gk##kGDTh$88$;ţ$88$;ڀL*__*LTO)(OllTO()Ol2!0462"72654&#!3#!2654&+64'!2#!#.##.$88$` `h$88$n Gk##kGDT2++2)kP()O.O)(P.DL*__*L2 !"3!!"3!!"&5467.5463!L$88$h$88$hTDGk##kGO)(OTO()OTL*__*L2"'32653265%#"'#"&553?7&%7T7%&7 hIO77OIh TĄj&66&&66&%Jh>>hJ(2"4&#"4&#"74632632%#7&%7T7%&7hIO77OIhT&66&&66&j%(Jh>>hJط2$2#!#53!2654&#'32654&#!Gk##kGD*$88$$88$ڀL*__*LCTCiO)(OTO()O2 ,!2654&+#52#!#5332654&#!353N*$88$<;wGk##kGD<$88$֊);CO)(OllL*__*LCTCO()Ol22462"732654&#!!2654&+642#!#53`#.##.d$88$։ *$88$ Gk##kGDT2++2)kP()O.O)(P.VL*__*LCTC2$3"&5467.5463!3#7!"3#"3!Gk##kG$88$$88$*L*__*LTO)(OTO()O2m3732EE22222'[~ 822%#"'#"&53326=3326=3hIO77OIhT7&%7T7%&7TJh>>hJ(&66&&66&24632632#4&#"#54&#"#2hIO77OIhT7&%7T7%&7T(Jh>>hJ(&66&&66&2 2+532654&+532654&#!5Gk##kG$88$$88$DڀL*__*LTO)(OTO()OT2$%#332654&#!5!2+532654&+j;;$88$DGk##kG$88$,lO()OTL*__*LTO)(O2& >[2 3"&5467.546;#";#"3!Gk##kG$88$$88$L*__*LTO)(OTO()OT2 ,"&54632#".5332>54&#"3Ylq\i/N[AypCT%:MH%=\=([Ey>3jYW^bpM{}S4$N`x>a;&2>\W32#4.#"3254&#.Ylq\i/N[AypCT%:MH%=\=([Ey>3pYW^bpM{}S4$N`x>a;&2>\W54.+532#"&54632T3)kkN5Y6'&;a>`N$5KsCpb^WY3>yE[.CPA%HM:%TCpyA&\dR5i\ql2+#"32>54.+532#"&546;53#1AikN5Y6'&;a>`N$5KsCpa]A;;myE[.CPA%HM:%TCpyA&\dR5i\qk2-462"'"32>54.+532#"&5463("0""0XkkN5Y6'&;a>`N$5KsCpb^z0""0"yE[.CPA%HM:%TCpyA&\dR5i\q2+33254&#";#".54>32#"&T3)kkN5Y6'&;a>`N$5KsCpb^WY3>yE[.CPA%HM:%TCpyA&\dR5i\ql2U&32654&#"#4632#"&54?!5!"- uOGp1" TUA=frun#(!-7aZ0*6&2Q[cQRZ\Ta2U&%5!!#"&54632#4&#"32654.#nurf=AUT "1pGOu -aT\ZRQc[Q2&6*0Za7-!(2U&>54&#"32653#"&54632!!5"- uOGp1" TUA=fru)(!-7aZ0*6&2Q[cQRZ\Ta2 #&#37632#"&5463"32654&#"[aT\ZRQc[Q2&6*0Za7-!(Y#nurf=AUT "1pGOu -2 #)#37632#"&546753#532654&#"[aT\ZRQcE?;;06*0Za7-!(Y#nurf=8Q LS 41pGOu -2 #.%32654&#"#37632#"&5467>32#"6*0Za7-!(aT\ZRQc84 '"00"*)1pGOu -"#nurf=2M0D02 #)4&#"3"&54632#".##2326O/)/&2Q[\PQyW>rTKHTAkI=54E(5IIn0" TUA>esx\\A#3RbcR3r2 #&%3##"&54632#52654&#"32>aT\ZRQc[Q2&6*0Za7-!(Yurf=AUT "1pGOu -2U%32654&#"#4632#"&546?'5UG/pTKl1" TUA=fu|GY,a5E=2:?-*6&2Q[cQOqfXSnA a2U%35>54&#"32653#"&54632%2YG/pTKl1" TUA=fu|GY,a5E=2:?-*6&2Q[cQOqfXSnA a2 #%337>32#"&5463"32654&#"2a AnSXfqOQc[Q2&6*-?:2=E5,YG|uf=AUT "1lKTp/G2 #)337>32#"&546753#532654&#"2a AnSXfqOQcMF;;#6*-?:2=E5,YG|uf=;SJV 1lKTp/G2 #+337>32#"&547632#"'32654&#"2a AnSXfqOQcP."00"$6*-?:2=E5,YG|uf=l&'0D0(1lKTp/G2 #%#'#"&54632#52654&#"3267 a AnSXfqOQc[Q2&6*-?:2=E5#,YG|uf=AUT "1lKTp/GY2 n32=3#"&547!5!  J:Tk`zn*L||u}|N8T2 m!>54&#"#54632!$!  J:Tk`z+Kzzv|{O7T273632+53254&#"2T8N||v{{L*z`kT:J  !2& XLr2& X[\l2%.#";#"&546323*L{{v||N8T!  J:Tk`z2 7#3!32=3#"&547#m;;!  J:Tk`z,m*L{{v||N82 m%3#5!>54&#"#546323;;S!  J:Tk`zm*L{{v||N82 #632+53254&#"#5!^k8N||v{{L*m,z`kT:J  !;2 & ^Lr2 & ^[l2 5!#.#";#"&546325,m*L{{v||N8;;S!  J:Tk`z2/#53#"&5467#532654&[Ԁ:EҕE:7HeeHT!rDggDq"TX8D``D8W2/#%#53.54623#5>54&"Ԁ:EҕE:7HeeHT!rDggDq"TX8D``D8W2U#53>32#"&'#533264&#"T!rDggDq"TX8D``D8W)Ԁ:EҕE:7HeeH2U& dL82U'[ d2U%3#5#"&463253#.#"326ȍT!rDggDq"TX8D``D8WԀ:EҕE:7HeeH2!5!53#5#"&5467#532654&[;;:EҕE:7HeeHkm!rDggDq"TX8D``D8W2$!%!#33.54623#5>54&";;:EҕE:7HeeHk,m!rDggDq"TX8D``D8W2!##5!#>32#"&'#533264&#"*k,m!rDggDq"TX8D``D8W);;:EҕE:7HeeH2& jL2'[^ j2!.#"32673#5#"&46325#5!#W8D``D8XT"qDggDr!m,k)7HeeH7:EҕE:;;2 $#"'#"&53326533265353#5`IG77GI`T/&$0T0$&/;;Jh>>hJq'55''55'qll2 #$74632632#4&#"#4&#"##3`IG77GI`T/&$0T0$&/;;TJh>>hJq'55''55'l,l2$!2#!5!2654&#!5!2654&#!5#5!#Jh>>hJq'55''55'l,lN`IG77GI`T/&$0T0$&/;;2(!2#!5!2654&+#332654&#!5#5!#Jh>>hJq'55';;'55'l,lN`IG77GI`T/&$0m,k0$&/;;2,462"!2#!5!2654&+532654&#!5#5!#"0""0Jh>>hJq'55''55'l,l0""0"a`IG77GI`T/&$0T0$&/;;2$5#5!#!"3!!"3!!"&547&5463l,l'55''55'qJh>>hJNQ;;/&$0T0$&/T`IG77GI`2 463""&54426n\B++B\zz"C_T- xx -T_CUyy2 #52654623"&54&"\B++B\zzC_T- xx -T_CUyy2 !"&533!2#!"#463!264&C_T- xx -T_CUyy<\B++B\zz2 '~) v2 '[ v2 %!2#4&#!"&463!2653#!"TC_T- xx -T_CUyy\B++B\zz2my!3!#2G672'y 333##5#75#535766M Fn6FFr6!!""2 & t^2 & u "R2 & vM22 '~) ~2 '[ ~2 & yN2 *%#"'#"&544326533265463"_HE77EH_+B\.%$.T.$%.\B+Kg>>gK -T_Cz'55'q'55'C_T- 2 *46326323"&54&#"#4&#"#5265|_HE77EH_+B\.%$.T.$%.\B+(Kg>>gKy -T_C'55'q'55'zC_T- 2*2#!"#463!2654&#!5!2654&#!"&533Kg>>gK -T_C'55''55'C_T- _HE77EH_+B\.%$.T.$%.\B+2.2#!"#463!2654&+#332654&#!"&533Kg>>gK -T_C'55';;'55'C_T- _HE77EH_+B\.%$.l,l.$%.\B+2& [2*7"&547&5463!2653#!"3!!"3!2#4&#Kg>>gK -T_C'55''55'C_T- J_HE77EH_+B\.%$.T.$%.\B+2  )2%#"'#"&54435335463"#3265#3265_HE77EH_+B\T\B+T.$%..%$.Kg>>gK -T_CccC_T- j'55''55'2  )246326323"&=##5##5265734&#"34&#"|_HE77EH_+B\T\B+T.$%..%$.(Kg>>gKy -T_CccC_T- j'55''55'2 )22#!"#46;5#535#"&53332654&#32654&#Kg>>gK -T_CccC_T- j'55''55'_HE77EH_+B\T\B+T.$%..%$.2 :32654&+#5'353326544#!"#46;5#535#"&533='55'1;AA;1'55'Kg>>gK -T_CccC_T- C.%$.llll.$%.T_HE77EH_+B\T\B+2 A462"764'72654&+32654&#2#!"#46;5#535#"&533P#.##.d '55' '55'Kg>>gK -T_CccC_T- T2++2)..$%..%$.M_HE77EH_+B\T\B+2 )27"&547&5463!2653+3#32#4&#'5#"375#"3Kg>>gK -T_CccC_T- j'55''55'J_HE77EH_+B\T\B+T.$%..%$.2#*4!#5&'35.546753#&'5>54.";X'1:-$[M;OTXIVGcV;&+&f-5  U )4:&BTVUSGF %QFWN)"o,  2 6#3265#32653#"'#"&54435#5!#35463"u.%$..$%.T_HE77EH_+B\ZZ\B+'55''55'Kg>>gK -T_CcTTcC_T- 2 634&#"34&#"#46326323"&=#3!535##5265ɥ.%$..$%.T_HE77EH_+B\ZZ\B+ '55''55'Kg>>gKy -T_CcTTcC_T- 2632654&#'326544#!"#46;5##335#"&533='55''55'Kg>>gK -T_CcTTcC_T- C.%$..$%.T_HE77EH_+B\ZZ\B+2$1>7#335#"&533!2#!"#46;5#332654&+#5'35332654&#TTcC_T- Kg>>gK -T_Cc'55'1;AA;1'55'Z\B+_HE77EH_+B\.%$.llll.$%.2$,E#335#"&533!2#!"#46;56462"764'72654&+32654&#TTcC_T- Kg>>gK -T_Cg#.##.d '55' '55'CZZ\B+_HE77EH_+B\2++2)..$%..%$.265#"35#"3"&547&5463!2653+353#5#32#4&#'55''55'Kg>>gK -T_CcTTcC_T- .%$..$%.T_HE77EH_+B\ZZ\B+2 .%3265463"#"'#"&5443265#5!#.$%.\B+_HE77EH_+B\.%$.ZZ'55'C_T- yKg>>gK -T_Cz'55'TT2 .4&#"#526546326323"&54&#"3!53u.$%.\B+_HE77EH_+B\.%$.ZZ('55'zC_T- Kg>>gKy -T_C'55',TT2.#3!2654&#!"&533!2#!"#463!2654&#TTd'55'C_T- Kg>>gK -T_C'55'CZZ.$%.\B+_HE77EH_+B\.%$.26#335332654&#!"&533!2#!"#463!2654&+#5TTz;'55'C_T- Kg>>gK -T_C'55';CZZll.$%.\B+_HE77EH_+B\.%$.ll24>462"764'32654&#!"&533!2#!"#463!2654&#!#33#.##.d '55'C_T- Kg>>gK -T_C'55'TT= T2++2)0.$%.\B+_HE77EH_+B\.%$.ZZ02.53#5!"3!2#4&#!"&547&5463!2653#!"3HTT'55'C_T- Kg>>gK -T_C'55'ZZ.$%.\B+_HE77EH_+B\.%$.2&'32653265%#"'#"&55#5!#?7&%7T7%&7 hIO77OIh ZZĄj&66&&66&%Jh>>hJ(cTT2&4&#"4&#"74632632%3!537&%7T7%&7hIO77OIhZZ&66&&66&j%(Jh>>hJطcTT2(#33!2#!3!2654&#'32654&#!TTgGk##kGDa*$88$$88$CZZCL*__*LCO)(OTO()O2 #0#5#!2654&#!#33!2#!%2654&#!353;)*$88$TTgGk##kGD$88$֊);CllO)(OZZCL*__*LCTO()Oll26462"764'32654&#!!2654&#!#33!2#!`#.##.d $88$։ *$88$TTgGk##kGDT2++2)0O()O0O)(OZZCL*__*LC2(53#5#!"&5467.5463!#7!"3#"3!LTTgDGk##kGa$88$$88$*ZZL*__*LO)(OTO()O2%"./#'.#523%+?n2(,Dn/TT! mT" +2@ ''7'7 hh gg hh g gg hh gg h29'2'2'2v'2's2v's2'2v'2j&[2&[22v& [z2&[2v'[&[<2&[22v'[2&[j2^5!5!2,,c;;~;;2^53533#3##5#5352x3$$$2ThUT5[oA2$$$KkXJEh<2  4632"&264&"'2#54&+$$$2Ao[5TUh2$$$K"0""00""0"bbRD`_Ef0""0"2532+#3264&#462"bbRD`_E"0""0QzPR}IhE0""0"2v"462"532+#3264&#&462"2"0""0bbRD`_E"0""0U0""0"VQzPR}IhE0""0"2|#";##"&46;462"|E_`DRbb"0""0EhImA}x{0""0"2m #?mp2m54&"#5462\HdH6ggm2HH2IggI2l753264&#"#4632#+#//# #8H38R84#(7:6p2l7#4&#"#463278/# #8H38Rj#(7:2m(3##2;:2lq#"&5463!#"26=p6:7(#4!+R83H8# #//#+2m #5326=3#h6B&46VFm70K>VP2mf(4'52#"&/&#"3&5463232680:<*,2 .%  ~E-%9 L2B<;@)0>0')2p>G-+?#2m  /&462"d]ww"0""0mp6Ή0""0"2m  /$462"2]ww "0""0mp6Ή0""0"2_ 462#"&3264&"2$4#$ 2$$$K2f462"2"0""00""0"2462"'3#"&=!5!2652"0""0QzPR}IhE0""0"bbbRD`_E!v462"3264&+332+!"0""0E_`DRbb$0""0"OEhI}x2 v462"#"&546;3#"3"0""0AbbRD`_E$0""0"OQzPR}AmIhE2X'"&5462#"'265264&"462"dddF-)&3F33F+"0""0Jvv FdddyS}}SF33F30""0"2(')"&6;2"&547#"3!"264462"yyFddd!S}}S^F33F3T"0""02dddF-)Ұ23F33F0""0"2X3#"&53265462"V;;^T"0""0-JvvJS}}S{0""0"2v 462"5!!2#!5!264&#!:"0""0,AAbb$0""0"N::T2v5!!"&63!!"3!462",AbbA"0""0P::.T0""0"2 #"&54632#4&#"3462"dbebR^FE_`D("0""0mARPxS :nB45J 0""0"2N 462"#"32653#"&54633"0""0D`_EF^Rbebd0""0"mJ54Bn: SxPRA2'/4&#"3254&#"#432#"&54632#462"oNRk<5oTs2I+L1VuspT"0""0NoTKLKy&S,$D=%emo40""0"2ev'/3#"&54632#"5332654#"326462"TpsuV1L+I2sTo5>hJ(&66&(&66&({0""0"2v (2#!5!2654&#!5!2654&#!5$462"Gk##kGD$88$D$88$D"0""0ڀL*__*LTO)(OTO()OTJ0""0"2v (3"&5467.5463!!"3!!"3!462"Gk##kGD$88$D$88$"0""0L*__*LTO)(OTO()OT$0""0"2X (3"&5467.5463!!"3!!"3!462"Gk##kGD$88$D$88$D"0""0L*__*LTO)(OTO()OTU0""0"2Uv.462"32654&#"#4632#"&54?!5! "0""0/"- uOGp1" TUA=frun#$0""0"(!-7aZ0*6&2Q[cQRZ\Ta2#&.%3##"&54632#52654&#"32>$462"aT\ZRQc[Q2&6*0Za7-!(c"0""0Yurf=AUT "1pGOu -0""0"2m 3#53#53AAAs22 22l v&#"#3632# #88'8(/# 2m1t46;#";2+532654&+"2,  m** mB+2/B-2 #z$*#zlDOop#y%6 #y EO\o#y%6E #yEO~o#q%6g #qE0*#v*#vYs#y'"y^ GY\#y'E#yWGY~#q'g#qYGY1"+32654#"'7#!2+632#"'32654&+ ! . '= &)B9/N"lppl%U1# +2")5#5632#"'732654#"'7.54632"32654&JA+ &)B9/N ! . 'gt{fl5DTTEBPP'E,*1# +2"(%V~}Qp[\on[^oY.#f'#fZGZe#q~"(C(p#C^Ze#q"(v(l#vZ.e#f((#frHZ\e#|((E#|tHZ1e#x("xrZCs#y)s#yI,g#q*&"qrJSq#y+F#y KS\#y+F\#yoKSo#j+F^#jK1&32654#"'7#3!3#!#632#"' ! . ']w]] &)B9/N%U;'L1# +2"1.4&#"#632#"'732654#"'7#3>32#C)@N &)B9/N ! . 'S%K8LYSk70aP1# +2"(%U0'MBtS=#x+F=#xpK\0#|,\ #|LB#j",v1"j"vO#v.:#vVNO\#y.:\#yqNO~#q.:~#qsNP\#y/:\#yOP\g#q 0\[#q 1P~#q/~#qOP.#f/.#fOK#v(0F#v%PKs#y0F#y PK\#y0F\#yPLp#y1F"y{ QL\#y1F\#ypQL~#q1F~#qrQL.#f1F.#fsQ&#|"2j'$#j&#|"2j$X#jt&#q"2C$m"ik"RCh&#q"2v$m"ik"Rv[i#v36& #vS[is#y36& #y S]s#y5EA"y U]\#y5;\A#yU]\g#q T;\P"i" U]~#q5~A#qU0m#y6""yQ V0Em#y6"E#yLV0m#v"6y"^#yM0m#g"6y"T#yP#0Emx#y \"E"yQ  ]Qp#y7@"ytW\Q#y7E#yW~Q#q7gC#qW.Q#f7I#fWUF#j8AF #jnXUE#|8AE #|hXU#f8A #fcXU#|"8vAp#v+U#q|"8jA?"jos-n#|9 "|VY\#y9 \ #yHY#C@:#CZ#v9:#vZo#j8:#jZm#y4:#y Z\#y6:\ #yZp#y;"yP [p#j;"jT[ p#y<&"yR \G#f="fT]\G#y=\ #yM]~G#q=~ #qO]F~#qqKB"jvW#zZ&"zR\*#^)D#yA\#y$*E#ymD##$*#D#f"$vm*c#v6##f"$C "C)#f"$*1##f"$|*c#|r\#f *E"fp #x"$v*|#v#x"$C*#Ce#x"$@%*##x"$|:*q#|r\|#x *E"xn Z\e#y((E#yoHZe#+((#HZe#|(("|vHZ#f"(v~(h#v;#e#f"(C"CZ}#f"((:#Ze#f"(| (a#||Z\e#f (E"ft S#o,N#j_\#y,9\#yL&E#y2$E#yjR&#c2$#R&#f"2v$v#vI&#f"2C"C&#f"22$/#&#f"2|"$`#|p&E#f $E"fl &#jb$5"j}c&#kb$5"kVc&#gb$5#c&t#|b$5"|~c&E#yb$E5w#yjcUE#y8AE #yAXU#88A#XU#jqAo#jrU#kqAo"kmrU#'qAo# rUq#|qAo#|rUEX#yqAEo#yAr #C<&"C0\ \#y<& #y\ #2<&#\ u#|<&"|W\0G" w>0G" s>0G" >>0G" F>0G" K>0G" >>0Gk" q>0Gk" q>" " & K" V" " T" W" '" VB'" `B'" ,B'" 4B'" 8B'" ,B# #?# x#.N" #<" #-" #9" #J" r DJ" tDJ" =DJ" ODJ" |DJ" [DJk" fDJk" xD# }%2" ؁%8c" %e" %a" %d" %T" %U" %," F8" F&" F&" F!" F(" Fk" Fk" F# }',# '+" '" '" '" '6V" 't2Z" 'p$" gL$" rL$" :L$" BL$" GL$" :L# {-# ~-" -" -S" -m]" -w2" `R2" hR2" 1R2" :R2" @R2" 4R2j" bR2k" bR# x2P" 2" 20YW" 2$# V$# V$# V$# V$# V$# V$j# V$j# V# 6# {6" 6" 6>" 6ee" 6TT" 6{TV" 6{0G# >0G" P>'# B'" =BJ# DJ" bD" F8" F$# L$" VL2# R2" XR$# V$# V09G"j 09G"j 09G"j 09G"j 09G"j 09G"j 09Gk"j 09Gk"j /# | -# z #  #  F#  M#  4T#  ,W# y 8" 8" 8" 8" 8" 8" 8k" 9k" #  #  A#  F#  <#  ?#  T# / U# 2 $9# D$9# E$9# F$9# G$9# H$9# I$9j# J$9j# K#  L#  M[#  NY#  O# S P&# s QT# d RV# g S0G"xn>0G"qo>09G"j T09G"j>09G"j U0G"|r>09G"j #xg#q" ̽" ׳1# ~tA 72>73#"=3} !1JL %*Oc2( tAB lG| yG# j8" X:"D9" YJ"|mD8" " #" ב#mV" %0" ״%S\# %RA#  BAh" E 9Gj'  "xF"qF*" F6" F"|F*l& F*#x' g#i'-" 'k$" א'bDAs#  QA" ] 9Gl'  2"x^R2"q^R2" >R2" >R28" ~N28# N2"|aR2k"R \ #x2 g#q2+" ̺25# w2# }/I"li  #'#5!#5A:aSES ISSSS"li  PC $9# `$9#V$9# a$#|V$9# "" ̟-<"" ט-<" ̧6F" ׈6$4# 6RP#vvAJ.8#58HH.8 18 18!518HH8!58HH8 K ?kA#5473]]00e{& P@3565#@]]00e{&RAh73565#A]]00he{&R@ #&=00]hM&{e0+'  1.'  /,h'  1.'  &O ###5353XXRUR&O#3##5#53#5353XXRRR3R2, 2#"&4{hIJ34IJ52IIhF,F|}Whs'h'htth''hWKy  $.9C2#"&46"2654&%3#2#"&46"2654&%2#"&46"2654&?WX=>XX=%56J55(BuB?WX=>XX=%55J65B?WX=>XX=%55J65X@=XY|X<5%&55%&5F +X@=XY|X<5J65%&5XX=%55J65B?WX=>XX=%55J65?WX=>XX=%56J55(BuB?WX=>XX=%55J65X@=XY|X<5J65%&5X "5>32&KY9UV9YY@9229@Y#73#'#D>>{y> 6' I' J 5[A!5[ANZ3#>2>y,!7;#"&=47.=46;#"%.49R.$94.%",,"V'AE>x&FE>EA'F; E <,!74&'5>=4&+532+53265m",,"%.49$.R94.%VE< E ;F'AE>EF&x>EA'M)#","M',"|&". #>7!5QJbFaJgcT{W0O ####532 mb@R@9^^LJJ@J 7".54>3!#33B`--`B 99RJDi>=hF@@V J %!53#5!2#3+99 B`--`RRJ@V@Ci?>iD(W" I?m 3##"=?hhi<#i hh4&&x;X %27#"&'5"5>32&KY9VU9YY9UV9YgY@9229@YY@9229@Y(W&  I<H' 'yy%3#"&/&#"#>32326+H>/-##5+O854$0 #91  .14 ;4X "5>32&KY9UV9YsY@9229@Y$a'&546276327632#"/#"/#"&54?&'#"&54?&'#"&463267'&546326q "." m! * $$ * "m "# m  * $$* m $$* !m "." m"* $$* "m "." n  <D'y'yy 1G& ' '  e<&yO'yO'yyg<'y'y'yw'yzyT<'y y<9 'yV'y&yy<)  'y& 3'yH'yaHya< 'y'yy<&y'y'yyD4 #""3265*LIZ/-inU[*bL)Q #533##=м.CC>; 5dF#632#".'332654&#"#7.&.BRXE%98I/56.1#4"4wO?CU, G4./7(G$4>32#&#"632#"7"32654&!.)5D8?14&C=OTA*45'(308W1 ;4@SN/L;>Q1()64(+1G #>7#5G$=QR,hm4H*#"&547.54632&"2654"32654NVCDUN#M<=LJH++H+$V44*,4"H:IJ:G"'1@?2&$%%.%&..&%F$#"&'33265#"&54632"32654&F!.)5E9?14)?>NTA'30(*558V1 ;4@SN/K<>Q.5(+23')7,Mh ##5#5353L.... S!5S.. lS & G G)o! 3#.546$YY$199 @MLN! IK-=yQ)+D >E8{8Ft*Bu8Q @*F A*G B8G C*H D*F EM FV T7 GV To Heol IKLl II(+]D:)+PH:)+LR:) 84[8)+N:)&A $*0#7&'#7.54>?373#&'>73'&''O 7+#7<8&9];7,# 7BTk=C Uv .t"OiKU@C[|6Y/_fO8((<\;~- e_L;I~ 9)4>32#&#"3>32673#". (>fA!RZi?8M$C( TTS q@f<(d2bjO4܊fO_;3UJgg3Ni`,3###535#53!!3SOOOOB77B7R793#3#632327#"&#"'67#53&'#53.54632#&#"&}Y;?!h(+*9J+#580e|nQ"e5>,X@M ,> 7(62Z'B8.%BW>6!!791![{ 1W9FFr&*3>32>?3#4&'#5#54&#"#7FM"K4a,#D0<7>58T'#T73.3HTY'1 J/*P*$W[ I;wi+5*27P9K GG#&)##'##5#535#533333##5##3'##3'3]N----ZO33O32fO::@@7FF]FF]]]]lUu[N3264&+#327&'332654&/.54632#.#"#"'#"&5#+#!2353CKKCVX5E7C$-4Y?YYX&0'1S6PDucz2> 14CiK]-jt8LZ>3 +(DOjc]x'V525#'+.14!#'##'#53'#53333333#3#'7#!7#;'##%#3'W97W5iZF78X3KL>;HG6CF1_nn\_2NNKW.eRSdcRUd?>,'wqI?))J??$k0".'#73&547#73>32.#"!!!#3267>g@/S7O?/@l@c^3K,DsExD)E9G-AQ=;;9QA/CI&d_;;\k"Y+##533333###]77]F%xngH**HgQ#5575575#5!#7]<F]_F_f_F_RR]F]f"8' 3654&#"2654''#>7.54632#b5( (Ghq;'jC%ZK:P[DG}R\F(%3."tssPu@. (! K[J8ecaM]'!&-327!%#3#+##535#535!2)&+!654'Q%42<fF]4444-Ql]3%LM10 0=F0D0}@=+[DZ "+3#.'>=#53#'#5.54>7_Blu2:xGPOxk 52J4 @;V@7T2 +<753#.'>73'b;(6N0;lh_8CL=`oy;YP~hd"=H;;*64`sG9DanT>   5!!### <ij]RRRR.!67 Z^O S$Mpb .!&'7! O_Y S bpM6m37NY3< .#"&'67>326D=0'zc$ 4GMi27<* / $zl #+=; >32&'7'67.#"3MG4 $cz'0=D6i3;=+# lz$ / *<72"y !&'67 OAbbAO $ bM^^Mb "y {wm $2654&"7#"&5462:-*@+X;7!.'>7*$!#=##=#!$* *$!#>##>#!$,+.*#??#*-,,,,-*#??#*.+rnT !>< sGJHC #dL*m ?PZH~#!5HHP~H)_'y|'y|yB|0!#5!#GHGgpB" !&'6702y#dd#y2781#ww#1JO###J>GO>GONN  v uG {I@0G {{637''7'7)E F-!()!-F EI':==:')34Af3#"#>32327#"5#"&5467>?654&32672#654&#"3273#".546::N< ZK8E.  7    07N]I.,@43"0Q8E='"#7,%P!= #A)&8 yC<>-$/8   1,0L   #2!R>,  $#1<+*1[2-,s)>0=Ay"#>32327#"5#"&5467>?654&32673#4632#454&#"#"&547332>54.1'.N< ZK8E.  7    07N]I.,@43"0Q::]J5A<" )3=7/(aP?G@(&,    58+C<>-$/8   1,0L   #2! ;Q/&  ( &!AM1, %0!4>32#.#"32673!".00GyL+_^W6+/:Z``!KwG/Md2bjO4NNej3Ni`Q"r&,3%,4>753#.'>733!5.4%G1JC> K K CI1G%/45n$GI3PP QC& Ob AC3GGO XFCW0(:L3#2#654&#"3273#".5462#"&54>2>54&#"::8E='"#7,%P!= #A)&8 y?L /Q2=K /P#8,(#7,>,  $#1<+*1[2-,sK<AL=)K<@L=)"0<+,1#0<*+20((?3#2#654&#"3273#".546#7#"&5473326?3::8E='"#7,%P!= #A)&8 y.7 ,  $#1<+*1[2-,s):*% # F:0mR+$#533.#"#632# 33267#KRR x^W^_+LyG0/GwK!``Zg>sNN4Ojb21`iN3!je~(o"r),!t}326?623>3232676;2#"&54?#"#"&54632#"'32767#.5476?#"&54654#"+"54632%"67654#!'\&jaG14tIc9#U( <^$:9L@<.yAP9K0#!$ ?4d+H\  VJ3.)%4$ i'!&j3bP0@73%Տ@6FI?fE3K8 FD60TkY[)& @">YkyW963 kUpD+-Oi27&#"7>32&'654&#"327#"&54>73254&#"#"'63232654&54>7>58A � *-0Me4(,6 # +#$! &8   Q`K N (2$ %D0R  +' W,!  -"p)EG,,6 0#"0(4 $  [n?A1M+ S+$!7)!8.Y 33###3#33俶7HH-H;'L6mm3>32#654&#"#T9/T8?HPTI/&Dd=T,$C;W &/`RVN>32#654&#"#?3U/T8?HPTI/&Dd=TzVWT H,$C;W &/`R?HR3:M>74632"'326?&547>7632>54'4;2#"&>K(DO4_'M*3&B';"#W?Z4dAJ#+?GaZ4% { !?.l#)# !J8)_DMW4>767327>32327#"'#"5463267#"&"327&">54&7B 46:EID]IAN>{W 61@6K'*@#VCw0gX@d) [{'D,D>%5V`">,- E.4!*3Ћ740XZB 91&q$3%2b,P;%c #  &qXz1$-327#"&54>7'7>324&#">  /)=@k/5 4"o #63P !#!E?Xt)a) BN;02'B )9LS.A#- K9vl?Q)!632#"'####5353353"32654&]9ihx|hk;KXTDDTXSBPPBDUS2VZCnn29999oooY^pL #53##`wXiX}'O</R.f133@8j&3X.4j-6%#"'332>54&#"#"&547&536324'326*L2m2!'8 1B ?,0(,0/+(((2sJU9!.ZR3.<'BD%IX$-M/$7\30CG.iWDjT*z>X8YG![i +#!2%3264&+3iq[-lugCKKCJJ]qoDxD&!('#"&632/7&#"327%654&/iVižg?.1;@54@85WO2:W3VҪq58*S9YN|w 2>54'%32676;2#"&54?65##"&54632#"'326?46367&#"3267>=4>32#"&547>3272"#"&#"6dDnnp*"0>+ "K]/ " OQ4""J>U;P/#!# >3;=[<{j@7BF%?&  m1&:8=vJ2 $ m y@'U%E/(+0i(GD2#qHnX'$<" wU f,wZO4 615 K:D()*H)/?NV/  !H23273#".5>54&#.54632#"&5332>54&#"[),#  P42(9#!&%O[aMLW*L9-YU$&&/ NF)M+.EP70 16'Ev`4' )?PuYGD, ?FrbK.J!> ]&*4&+326#&=4&+#!2#*LCJE +q:>Pks6H H6<`&0* ")8.IAC?e^>RS]0%.#7.+#!273#.'4&+326_ ]Pks6=!%\^" Hq:R8:GQJ#H6<]~$(037#&=4&+'7#!77#;2654&'7#_d6= +q:>y8",\LJED<88E8YLdX>R&0* ")8.IAC?^S'32#"&'"654&#"3"&54>3232732>54.#"#4>7.'6732654.9D0  1Z9FQ7S[06%*3& !8 .'++' 6!!  +J.S="1)! ;QJg %@j!E-! (2D8(.\=Bl 4Q-*A%!* .!<&%/ S7 / 4D7'n6  2[G %-%F O."mx74632"'3267>7&#"32>=472#"&547>327632#"&54632#"32>54'#"'#"&>54'632"327&"/"!$( B6;=IRL?yo96K:uA `5,7<" yVgm8'xQL5Any m5#7.54632677'"&464'327632"#".##"&">54&5467&)!!/2 LTs^V*!es!  &L'D1>A   V %P?$85BQJH CT!$N% 5 1aE 60!v$'* -$+-?#+A  Y   Aqk^1  +.?Q0(H %#"&5463232'>54&#"D._p;Iqes 0ZlCV# %S+lL=v=j(H$&R9-Zc74>7&54>2#"&54632#"32654#"632#"'32>54#"#"5>32#"&4#"326-9WGazRe3&Y* !D-#S|+X<%3$?%3R.N=1Y6 a'N _1##>zJ216o+X P ]+J>TP JND3/.@:9^6 =n+/ "2OF< )S}74632#"'32>7+"5467>763267>32#"'"547#"&4>3232#"&#"32654&5463#"&>5&#")0#!$ +bV:@z R *&,3?&  $'#C!t 7(/gF`~TB? C@GW5A\{ p#4-;@"@;_K&%!=J;!.&A5,2 537!.n(>aM'M4MU!5{>"Gz#E !))ln7;>7676332>7>?6332676;2#"&547>7#"=>7#"&5463632#"'B: *Y:s IV<k "*1 v-/G-o  Gl'+-?IvF-47B@Ca"Z[4#"+g $ E3###3#/%2#654#"#"&547332654&/.54>::XXH+VII /C"?n:=KY'+{$,-V~ t'( N8. # < '8-!JA 2.?-" # 5" #7,!} ) E[#u# m{[#u"t mE_# A _# A"t m_# A"u m_# A" @ mE`# B `# B" A mEa# D a# D"u ma# D" A ma" C# D mE"{ md,d#,,d#,,#,,d#9,9]#,9s#,#,9#,#,#,9d#;,;]#,;s#,#,;P/0&Y'K0BLBt#LLBR#L#LLB#YL  Y #LY h#L#LY F#L#L#LYB#[L [#L[h#L#L[DOFGFP  !&'672y#dd#y281#ww#1-; !#'67&'P81#ww#12y#dd#y21 75!&'7'6712y#dd#y281#ww#1-;x 367&'781#ww#1x2y#dd#y2!!.'7'>7!.'>7A82%6/^66^/6%28AA82%6/^66^/6%28DCF @6a00a6@ FCDDCF @6a00a6@ FC!%'>7.'>7.'7DCF @6a00a6@ FCDDCF @6a00a6@ FC]A82%6/^66^/6%28ABA82%6/^66^/6%28%#654'327+(t1 X"qS@(Sq"X 1 &@ "+ &@03!&'7'67!#082y#dd#y281#ww#12#!&'67!254&# NTVI2y#dd#y2}i36G;DD1#ww#1Q#+-"3!&'7'67!"&54663i}2y#dd#y2IVT3+#Q1#ww#1DD;GZu3!'7!#7[nuTpoT !67r#y28v#1 %!&'!2y#1#v8b\ \@#_G 8@  - 8\  Hr@ D!  r@ X& V !!!.'>7QQHM)B\[[\B)M~5PP5b!QaVVaQ!b'7'>7'#'#H!QaVVaQ!b5PP5m)B\[[\B)MHQQ-'7!5!7'!5!'7)MHQQM)B\[[\!b5PP5b!QaVVa,<z.'7373!QaVVaQ!b5PP5)B\[[\B)MQQH!'7'7!.'>7!7'!8L(PXRRXP(LL(PXRRXP(xTToT}_"`^KK^`"__"`^KK^`"VVV'7!'>7'7.'77'7H!QaVVaQ!bb!QaVVaQ!bPPPP)B\[[\B)M(M)B\[[\B)M0QQQQ /6%#"#".'#".#"#52>32>3232>;&'7'6`w:<=92), (#7A>9;<9D= (#4g2y#dd#ygNc bP>I>"854Oc bPcc#1#ww# 73#3#KhxcMx'N+%2#"&54632.#"#>"32654&#@G3!ez_i:QL.> X k]@JP=>RR3R^hc~O83WbSGCW[DBSZT !5!5!5!!5!cdLRR'R# 32654 &#"3#"'#7&54632JVtWqnFi\טfMJrYטh*FJuIqjg[NsfY 33 ! &d)'h !#7! d3Y'q7h!".546;#!!;~Es\3m-IP4!FyRFF;Q)F7!33#3#;#"'#7&54677#?t7}B76Y^E7%u.p }AGFFF[tM b-74>;#"!!;#"'&-&5B1*6. l -9%qJ$7W1 6 B/62C 6j27g )Ig7&3#7#537#537&'#5323&>7t7%2ZqD7[q><2DP?4 >/H@'tNQxF"<32&#"32>7#".'#"&54>32.#"32>d+)H!+.#  ! i)   &6$M,#g7"9|1Jd2>32#"&#.'#"&54>32>7.#"2654&#"  !"!'<N9 5*+(*9N;3-1    )11-1)       !0*5Y& Y5*0 = ! ^dH! !0Ee3VSZsS BLd " E Ed V" E# E E_  6%654&/7#"'732=.546754632&#";P+%U$- 'N8%<>! ^(: BEdH! !0>H W&<  >/&/ zJYpEe3V ,6+9?A7.2")Q8?J,23 ' A8?::F/;1+#,!%! J@3 7#7'&#"#>3273326=3#"/E/571*q@590'*NFK!%:E*$"t PJ(m & 2 JE( &7#7#537'&#"#>3273326=3#"'!!E;tT7/571J9@H590#(AiF$NFK,e !%:EvF2$&  J2,#7#537#5!733#3!"#>32326=3#"/&E!=C3273326=3#"'3!!!E?c5@N/571`)@6 59024= FfF2NFK8Pk!%:E bFfFIp& J JnI,:7#7&#"#>327'&#"#>3273326=3#"'326=3#"/E\ /5715I/571]>@L 5905>590'*=,NFK_/NFK7o!%:E `$!%:E'35$"#>7>2#.'.267>73"&'.'3C[Z# Z[Z "Z[" [ZZ # +5  5+  +5  5+ 2o &  u2%!#7#537#53733#6K6*3K3*FFfFwwFf(Y & 2& 2% 2(  %!#7#537#537#5!733#3# .K. (K( FmmFKFKF__FKFK- %!55% v8CC3EOO- %!55-5v8CCxEOO- %5% %5% vvEOOEOO- ^ ?367>73#.'.#"##7#>76?&'.'3323lKE+" %?&U5 "Z-FKC1# (D&Z8 #Z- +5\5+  +5Z5+ - 75%737'#?-&@K0hJ0K;/E|r,O;ZOhsApA-3#75?'57YK@]OjCCCCBj>-!!#7#5375?'5737TSK.KD>GKR$yElCCCC=OKfOtAT1.".#"'6323275% $YLF%()|!YPG(v.//P/0bEOO.".#"'6323275-5$YLF%()|!YPG(v.//P/0bEOO-752$7&$-|mTqgkxIfEs\OL@DJOZu- gC( [' 2: g( \' 2: h-752?367&'#7&?-MK651\;!3R3`vGKRo "EK#)OTP<4OU7)-33"#756?.'567&PK[qeCK+3.Z8#2Q2^u$ $*EMe!'OQS<3OS7]7X!".546;#;~Fr\3'IX9DwRFB\2F7X mIX733#;#"'#7&546;7Xo-0BP? 0F99FbJ44FBFF߄6."3!!#7#537#53&+532654K@G^K0Oc=nyOK/F::F.F(F-tV( !&'67%3 &=33265/!RCffCR!pHHfdK&!fQaaQf!ƃba4,%!!!!,MGPH v|B:' 2= vB:' 2; wE7 v=-@E7 z|+ 33##5#53$264&"6  i66A66^M+ !5!$264&"6  ~/6^M+ 77''76  264&"''''╫'&&'+  '264&"6  H&`>&`JM+ 2#"&546$264&"6  &$$&%4$%(9MLq"!!#"F"F"D" !l!#!5!F}&\F%!5!3FFFF\L"!!#xF"F"L$$ !!!!#nnF$FpF8>>-5%>H}>>7->H+~>!>' 2\ >%>' 2` !##3XXM = =%#".5332653M\^MRYaRL``LXS W. 2#"&546&$$&%4$%(@m 373'7@))j(ii(6||L}MM}> ?'%%5H%%ݚok Bk( #367&'!!#7#537ȏ7K53.\:$4S3axV5KYxbnc5 !u!'OSP=4OV7F77F(ELx( $33"!!#7#5375>?.'567&mK`h]UkvK#B=<75I)9V6f~#$EDF77F&.O06C>7OZ8YB:33#!!!!#7#537#!!K3:^']%K%,P'wsشfGHNFJJFNVcB:%!#7#537#53!5!733!3:~$K$+O.}y-K-4.FFHHF\GcHZZ\c' # 32654 &#"#"''7&54632JVtWq$[\טfa%aYטh*FJuIq#[g[b%bfYb!##bFFmHe##5eF'F_|333_FmFIf)533fFF4 4632&#"dH! !1ZsS BLd6;&#"'7325;%<>! ^&Ee3V;XI %"5>32&KY9UV9YY@9229@Y;XF ::#:;((:03#;;(((8T #57>7T_{RJ(R:b7(8z 3#(RR (JT #.'&53T.:R(JR{7b,8X X8X  ,KX! YX8MN#3#LLX8 #L X M 3# 5L78,O X8,  7 ,  X4;$#;U$?/1%/8)/)3/6#/2+3/7,/;6#G/()/7,;=/4/1(G/()/2 75/$0/&.=/%"/(/`np/6h%weo/+v7edkq//y)ddp/7d9xdap/)d)wfo/&r5fbxq/6t6jdo/6r,dO/(//,'1Y/';/&&Y/';/&&Y/';/&& Y/';/&&?/$/.1%G/1/67<Q/(3/7,%?/&0/$ 1lwh/(o0tlD/64/8 %[/(=/61&a}p/)w6i`}m/6h*p_}p/5w6gb}s/6j8{bnn/6q3bY/';/(%/  !"32654&'632#"'#57537BPPBDUS9ihx|hk;K??SBoooY^p~VZC2@2zN3@%53!53G0HHppk/1FM / #!3##52672#"&546"32654&%54&#"#546322#"&546"32654'.sG/3)(0=T@BW=Z) Wҕ՘bTl+r4 QK.=.-97- ?ST@9P<Ւӗ!l\|c'-#2>M#67>32#"&54?32654&+532327654&#"72#"&546"32654'.66@&=PDQTC32"32654&2#"&546"32654'.3)19 L;LS>%C!M+en)67*&//ҕ՘bTl+r ^Q DSAE\'9nb<(1=.3C<15?EՒӗ!l\|c'-# %!#>7#72#"&546"32654'.8SYDmMҕ՘bTl+rH*yib\Ւӗ!l\|c'-#"-9H"&54767&54632'"32654&"2654&2#"&546"32654'.UUS/HN<;I)Q&..%&1.+)46P41&ҕ՘bTl+rnX72#"&546"32654'.-'=9"4*'>T.*R),-,K4IH4>4IH42&g2 !!!5%!5!%5!!52DPD6PPPPPFFpFF2j@2 #'+/37;?C%3535#3535%5##3#3#373535#35353535#3535!!XFFFFFFF*FFFFFFFFPPPPPPPPPPPPPPPPDFFFPPPPFFPPPPPFFFFFPPPPFFFPPPP2 % 5#'5'35!!n4XFaG2D25~IX̌q硡Xᚚv2m2@2  $(+.26:>ADHLPTW!#7'#77'73'7'3'7''7'7'7#777'/3'7''7''7'7/7'Dgw<^;;z=c@?@jF@FX55{=b??xiFEF#F@F@F@FFF;;y=c@@@$@F@E@E(@@@>>D2<;;=@?@iF@F55>@@#FEF#F@F@F@FFFL;;$<@@@#@F@E?E@@@M>>f35'3#PSS/d !!dX d !5%!!X/A&r@C&s@l`!!+` l`!%!!"+0k0 #Z)Z#Z% !33xo %'!sxEe/b^ x^ @^ y^ @"x3 0{@^ /x^@@] /7-3Ռ#Zx}#Zy}x.{^  >^  4> xs /{@^  x s ] /}$ gg gg$% gg?gg$ %'7 gg͎gg' 2#"&4>"3264%2#"&546_d`x|ّԕPa`=컵Ք՗ # > ttT88'"3264%2#"&546 x|ّԕ컵Ք՗' %-39?IOU[agm3#654'&'7'&'7'&'7&#"5632"'52767767767%#&5473&'&'&''67'67'67=< 8 q*  KQ+ 8 << : s-KO-: y KQ*"5 8k;;8 q,  JP. 8 d 8 p-' #(,2#"&54667&67&'%64ԕwZZ!!W!=Ք՗j] Z B & Xn?BD=' *"32654&'2#"&4>"3264%2#"&546IqnILklG_d`x|ّԕprnJJp:a`=컵Ք՗' 2#"&546ԕՔ՗'%2654&#4632#"&vyՔ՗.x|ّԕ' '@'5@' #"&54632%"3265!Ք՗uv|Uԕ֚z{y'"!#"&54632v/hՔ՗xԕ'"&546.՗ K^ !"32654^hII43JXIhII252"2#".5467"32>54.%!!JNLOLOSa^]^^]]ADRLLQTJJ\^`^]^]^D2[ !#4&#"#2!462ʋcr˒(vt2a ']#463"c<֙x]7U5@g 'o@'] "#4632#.w<֙<wԓy'g R!RDDRR@RRRj@2, "32654&2#"&4<,,+~hIJ34I- +* !]J52IIh2!%!!,vDX2D2 27!%!!a[vD.\2D2 2 !3!%!!c/vDXX2D#Z #5 !hw"hh3#Z%!33#Z7! >e3>j "32654.'2#"54$㖛f`ck22 !!!!!!2D2X2DE\E2@2 22@' 2#"&546!32654&'ԕ~j  q|oՔ՗8 j.pys '@' '5@jO%!572hO2@f@jO!%!!M2jO!!O|X !%!!4pH$p|X !!p pjO B?_ 654> 54.''#"547&'#"&5475#"&547&'&/.54>75&'67.5467.'>7'>54&'GSRL#q 08"5"( ;N$V&[&-2F >3'  x))[&V# ;,.'6:s(2". U_^T%  T`acMUTH)xnABp`L_ P #-(86C# =**rY-{/r2)T"5 ] ]#  04 T*1r0{,4G=:J-?xIWP!LJ "   LMpB@n~YT"O$%3!56767#"&54>7#"I(,C$U,T 4R5K,FJHGKF-K5R4P* 8vPJ5-J=BkCBjB>J.5J#:.'.5463267632">54&#"#".'&\Qm<+U>U22F=W6E1='5?&DJF.84?/ 9KOY/?VK,6"8T;8pW/F4%KFR 7(/hX[c/398 /!*J"0 &'67>7.(8F!JE;;8-0>P<6jj1?0#8!5>7#"&54632&5462>32#" ".F--F/! O&@\S;""']]'  ;S\@n%%9%./$:#,"(_CA\ 82?ZZ?28 \AC_"OC%3.'32654.'3263!56767#"&54>7#"=!28"L2.@,740 ??;%@.K((,C$U,T 4R5K,FJHGKF-K5R?('t?.!7&//O09Z40='.?J4P* 8vPJ5-J=BkCBjB>J.5J#>32.'.54632\Y6=W5QTMQm<+U>w0JFT;6phiBKOY/?V"0 &'6(8F!J0>P<#/h%3.32654&#"654&#".#"32>!5>7#"&54632&5462>32#"!28"c`%G<$vLB44A2.+8!?D(.%  ".F--F/! O&@\S;""']]'  ;S\@n?('H538 l6&DF$e#A37G )(H%9%./$:#,"(_CA\ 82?ZZ?28 \AC_7 %#"&46323B,-BB-3"S%..J.-7"&46323#54'&BZBB-6 T&\%..J.-7mC88m7#"&4632#"&4632"F0/FF/:#F/0EE0:"ks&--L-'&--L-b75%#"&46325%#"&4632wF/0EE0:"F0/FF/:#=='&--L-ځ&--L-Bp #"577>324&#"326p;W_&(  FNW%'30;b,C|R0  VO7&'32.'>?/&54654'2>2%2367>7632327#"&'&/.'&547#"&'>7&'>;&5477654'4?&54?&472>54'#"&'#"32?632#"'%>7.#"327'&547.'&'6324654.'.#"3263232654&"#"'.'&'&'&'32?6=#"'>7>7&54672>7327"&+"327>32&#"54#"+654.'676794OgB/4PB6*'#C  / Fs3IJI    +b] i ),/KImL W!+a>E,' Y3q2VU U (%#   ([]DZ A'$04[,  ).P() -2>c`* f8''j)6 -M01$"" 8 9+ "# vpn #AYI[ o#,&g!!jV0D9'0*A   H ! E"   !   :## H% G " # O0:/B4G/93NF W  >FH    *{/ ) N !!" %5T Em*a &x18_ Mx'+26LL 8< de ePd<ddH !# #7H@__[$lH )33'__[ll$H )! 7'@𼌌ll0462"$462"#3\+>++>+>++>PPy>++>++>++>+0!# #3UUUc033#0UUUc(H !!!!!PPPH 35!5!5!5!5!H@PPP(6#264&"462"264&"462"!5!"."".qPpPPp"."".qPpPPp,m.""."qpPPpP.""."qpPPpPLPHr3#3###53#533蘘Z蘘ZPPDP8PH ! ! !iVKJWH462"462"462"t+>++>+>++>++>++>M>++>+>++>+>++>+H ! rKxW80 66  >4&8[Rd|lU080iT/8/jt>|fQm[=|dH462"462"462"462"H+>++>++>++>++>++>++>++>>++>+>++>+>++>+>++>+0p3# #`__$<| 3#333#!PPP`DlDH3#35373#`_P_`ll#4@462"462"462"462"X+>++>++>++>+>++>++>++>>++>+>++>+W>++>+>++>+H !!!PVWP6"462"$462"$462"*+>++>+>++>+>++>M>++>++>++>++>++>+:  %5-5%m8=UrKVrrVK0p)5333pPPx<< "3"&632644#<||ޞ||ޞP++>GPP>++>+?g &5467%!5!32654.'XO<mKIf^]g&?4_`v{aI~,PP6]B@L=I,D'6F264&"462"264&"462""."".qPpPPp"."".qPpPPpo.""."qpPPpP.""."qpPPpP80264&"6  <6<704632'#"&"327'7654&7⛟UL8Lh}zcS9>j⛇hL8LUȮy>9OgzH 3###3!8PPPlD<462"462"462"<+>++>++>++>++>++>M>++>+>++>+>++>+8H'$462"462"462"462"462"+>++>++>++>+>++>+>++>++>++>!>++>+>++>+>++>+>++>+>++>+80462"$264&"6  j+>++><M>++>+6<7046327#"&2654''7&#"7ݠhL8LUݟ}~>9SckUL8LhݍzgO9>y8'/7%462#"&54632"&547&#"327&6264&"264&"PpP6SX)%UW9PpP$ y~ $O"."".""."".8PP8,F'ᛠ%H.8PP84)~y)K.""."z.""."6r 3##5333#PvvPvvDPDPH 3# #3(`__`$ll8B264&"264&"462#"&54632"&547&#"3533##5#327&"."".""."".qPpP6SX)%UW9PpP$ oaPvvPas $Q.""."B.""."98PP8,F'ᛠ%H.8PP84)pvvPvvm)H!3533##5#!!PPPvvPvvP0 !!*(uH7!3!3PPP(< '%<w..BB6#5.5353>53#4&'#5#46wPjPiPPiPjP a@r q@` `@q r@aH3#3#'P_`6+.5353>53!!#4&'#5#4675!5!wPjPiP$܋PiPjP& a@r q@` 8P8 `@q r@a 8PHr353!3PP .575HTHHTHFt%1264&"264&"%2"&546!2"&546'#5!#3!53m%34H44%34H44rp<3%$34$#43%$34$#4<<<<Ft&19A#5!#3#3#3!535#53#532"&546!2"&546264&"264&"?r%34H44%34H44q<<<<<<<<<<q<3%$34$#43%$34$#4MF^2%#"'#7&54>7&'#"5325332?373327^5R.($E8A":!D<a?VC4B!;7>謬DA,=3,` .F!3!535#5&5#5!#32>5+Xo@C6*# :LS H<<2<73#3!535#535#5&'LS ӄ@v9&*# O,bD<&<<<;> <<<<<<<$F %-5=46323>32#"&'#"&5467##"&264&"264&"264&"FR:2L L2:RR:2L 00>RtR>00 L2:/B//B/B//B/B//BtR>00>RtR>0 L2:RR:2L 20>B//B//B//B/B//B/F\5=EM462"$462"#"&'##"&46323.54623>324&"2$4&"24&"2((((R:2L L2:RR:2L X0>RtR>0X L2:/B//B1/B//B./B//BR&&&&{tR>00>RtR>02 L2:RR:2L 0>B//B//B//B/B//B/F326=33!53#"&5467I4D<}})u4Mlw_?`):e>謬F2533#3#3##"'#"5325L<,E E<٬<<< >>謬F:D#"'#"'#"54675#"'#"532532536532>53323265)9= =H%DOOe,E E<<>H9 C^t?[>>謬o#2992##29=A,-6eMFJT$462"462"#"'#"'#"54675#"'#"532532536532>53323265(((()9= =H%DOOe,E E<<>H9 C^t?[>>謬o#2992##29=A,-6eMF!#"'#"53253253353#5#,E E<<>謬]CEFR1"#43232>53#"&%#"'#"53253253353#5#>謬]CEF 573#573#N<<<<F'F'F3##"&546;!5#"32655Q>>>N=Q< (!6-E9j9E-l-E9j9E-6#J_3333`J+1"]k{{k]""]k{{k]"( FJ09B%#"'"'#"&53327&546227&546232>5654&"654&"Q>>>N=Q< (!6-E9j9E-l-E9j9E-6#2(2(J_3333`J+1"]k{{k]""]k{{k]"( JzIaaIzJJzIaaIzF>#$462"462"462"#3!!!!&&&&&&<<yy((((((D<<<F>$462"462"462"#3!!&&&&&&<<y((((d((D<F [>54&">54&"#5##333327.546227.5462;333#5##5#"'"'+*4*n<<<<<< 6-7n7-l-7n7-6 <<<<<< N>>>>N )6)FAAF)6))6)FAAF)6Dž"#(A)f]]f)A(#""#(A)f]]f)A(#"'3333F4=2654.7253#.#""&54>7&#"#3>326! *.* !)k<<n.6-' DrD '-6.n<<k)N>> ,(DCCD(,9+';S"2)(d__d()2"S;v+933F3333#####5 <<<<NN<OO<F +32654&#"326=33!53#"&54632#"!4"8FI4D<}})u4MlyK+9H1>c' t):e1``'L~:CG6&&&&n*[D?`*o>;‹ZzzZ/\yMKIOF@IR462"$462"#"'"'#"&53327&546227&546232>5654&"654&"H((((EQ>>>N=Q< (!6-E9j9E-l-E9j9E-6#2(2(&&&&0J_3333`J+1"]k{{k]""]k{{k]"( JzIaaIzJJzIaaIzF#"'#"53253253353#5#3!53,E E<<>謬]CE<<F/$462"462"'#"'#"53253253353#5#3!53?&&&&,E E<<<<<}}&&&&d>>謬CE<<F'#"'#"53253253353#5#3!535##533,E E<<>謬]CE<>QtAHHAAHHA,G+/8SG[5*+6gD+*>>QtAHHAAHHA= F Y%32654&#"#"'#"&532653265363232653#"'&''767&=#"'#"&532653265:.2"",E ED?<R<R< ?+1H)" =%">QtAHHAAHHA,G+(4J59>G[5*+6gD+*>>QtAHHAAHHAF% BٷFr GQ&#"32767632#"'#.547&'#>54'#"&5463232654&#""7 "d\CC\3`);H1)0 !00H4( ;QQ;,,H8+# 0)1H;)`." 7=^+ 3:EE:~J1+G8D-paU ]Yv0SF$HH$FS0t`R !`Zs-D8G+1J +F"*264&"462353#5#"&5467.264&"EfEEfii2<<3ii.&'-532>53#"'#"&532>532>53#"'#" -:- < -:- 53#"'#"'2>532>53#"'#526=#"&5332>5463"7%- 7&'#"5325332?3327#"&((x((":!D<謬DA,=9X.+?|FB462"462"462"'4>7&'#"5325332?3327#"&T((x((x((":!D<謬DA,=9X.+?|F\3632#"&=#"32654&F53#"&462"532653#"'3"&54654'&'#"&532653654&5463"64=8r83#264&"462353#5#"&5467.264&"$462"462"<32#"&54>73264&#"=H<( h9dtU|=VR/iFVOK5`8Gd6Q9KUuKYwCY:NafQsF#+>32#"&54>73264&#"462"=H<( h9dtU|=VR/iFVOK5`c((8Gd6Q9KUuKYwCY:NafQs/((F"*2<53#5##"54635#"'#"532532536462"462"'"3265<>謬oJ((((K.-6eMF %"&63"#"&63"ӕ~ӕ~<<.<<.<F+73264&#"5632#"'%&#"327#"&46325O;SUllUS;BLii+'F;SUllUS;BLii+'& )H) ?MxM z )H) ?MxM zF33##"&546;#"3265<53#"'#"&53327&5462'654&"!( >N=Q< (!6-E9j9E-V2(1+J`33`J+1"]k{{k]"OJzIaaIzF09462"462"2>53#"'#"&53327&5462'654&"-&&&&^!( >N=Q< (!6-E9j9E-V2(((((1+J`33`J+1"]k{{k]"OJzIaaIzF1$326533253#"'##"'##"&53325hT"27&'#"5325332?3327#"&":!D<謬DA,=9X.+?|F,!4&#"##"'#"53253253632#4&#"632,4<,E E<<<#+4S>,4",4S 66  >>謬hT> 66 WT>F#$462"$462"##"'#"532532536((((Z<,E E<<<(((( >>謬F1,5>"&546323>3"32#".5##526733254&#'4&#"3dt\Q(:38 Vkf#,thAdt\Q(:38 Wkf#F3@qOK3@qOKOqK]qEeLP-3212bej)u+=HODCQQCDOH=+u)jebǵDEJ?T0-u'&'&-&'&'u-0T?JEDFp-2#"&'732654!#3!52654&#"'>322bej)u+=HODCQ<<QCDOH=+u)jebǵDEJ?T0-u'&'&x[y&'&'u-0T?JEDF!2>532>53#"'##"&5 -:- < -:- 53#"'3!53d+FTY< -/8<8/- 532>=3##"'#"&5$462"462" -:- < -:- <<-D]22]TY &&&&.RD))DR..RD))DR.'/;yyY((2&&F6%-53#2>532>=3##"'#"&5$462"462"<< -:- < -:- <<-D]22]TY &&&&'.RD))DR..RD))DR.'/;yyY((2&&F3#3#3!!!!F<<<<yy'<<F@%"#43232>53#"&3#3#3!!!!(!//!:RR:0磣</B/32"&6264&"6264&"\\\"Y}Y:cc:Y}Y<\\\^\\\N[[[!92~:00:~29Y\\\[[[Fj08@$462"$462"264&"47.4632>32"&6264&"6264&" (( (( \\\"Y}Y:cc:Y}Y<\\\^\\\(((([[[!92~:00:~29Y\\\[[[F 1<G73265"4&#"2>#"'#"&547&546326324.#32634&#""UoKj5<"UoKj5#"'#"&547&546326324.#32634&#"((0((>(((("UoKj5<"UoKj532%3&"3&#"@<@)R1<;1%:FE{}k/Q<==<#/E/9sssF7273>7&'#"5325332?3327#"&547&'#"'<A :!D<謬DA,=9X.+?|Q"%5>F !#"&54733273%u8Ml\PpI4F<]Bpknm):GF4/264&"!5>54&#"#46323>32#"&^^^*i66J.75<\LKi;,T |Q[[T|^^^S!K'46$;@!*;LY^%A.6 <OkpFb /5%#264&264&"32+"&5467.546"3r=&5432654.#" I <+-dB!!H) 1%$1<H."d I +!E#o!!G=> ]Yv0M;: !`Zs-!!oD!+ F #5!#3!53r<<<<F 2533!#"'#"53255#L<,E E<٬ >>謬cFv353#5#3!53##53<<}}<<CE<<BFFv%$462"462"'353#5#3!53##53((((9<<}}<<&&&&CE<<BFFv##53!353#5#3!535##533k<<%<<}}<<XBFCE<32'>54&">32'>54&#"462"1?oxATyQ*+"HVv|qMY K3ZOk5TyQ*+"HV;ek&&{+0F"eN8H *6)4C)J;O C+?%eN8H *6)4Cp]1((F46323>32#"&'##"FI3+C C+3II3+C C+3:fI5))5IfI5))5F+  3#篮 kmF1462"$462"% 3#&&X(( Z&&&&.mF  !5!!53'!x<<}ڂ'bF)2>532>53#"'3##5#535#"&5 -:- < -:- 532>53#"'3#3##5#535#535#"&5 -:- < -:- 75#"'#"532532537#53265OO%N.1,E E<<>謬;";&"-6eMFR9D"#43232>53#"&#"54>75#"'#"532532537#53265>謬;";&"-6eMF733#5!#353#5#3!53#F<}6}<<}}5}<<}}<<}F5 <"3265$"2654'##"54635#"'#"5325325332#"&54Jh((,6..UOOe,E E<<<0<<30< K.-6eM*(*)*F^tAe>>謬oI64GI7!F33!53!333&

=&5432&#"!&=#"', I<+-dB!!."d* I f_Z1%$1D!+ o!!G=> !`Zs-!!o +!E?F ,7&#"654.#"353#5!6=&5432327632!&=#"' I  I6b<<`d<+-d#<1%$1 +!ED!+ CE!!oo!!emmFe%##535!5!3##<32#"&'##"q&&&&I3+C C+3II3+C C+3((:((fI5))5IfI5))5F<(08B2#5264&+#"54635#"'#"532532536462"462"'"3265:RR:!//!OOe,E E<<<*((((Jh((,6HRtR>謬oJ((((K.-6eMF+$462"462"462"462"7#5!#3!53d((((((((r((.((((.((<<<<F5$462"$462"5##"&532>532>53#"'3((,((2+FTY< -:- < -:- 532>53#"'3462"$462"`+FTY< -:- < -:- 532>53#"'3`+FTY< -:- < -:- 54&"327&5462327&&)532>53#"'3$+FTY< -:- < -:- 532>53#"'3`+FTY< -:- < -:- '/$264&"462"264&"462"$264&"462"^;R;;Rw^^^;R;;Rw^^^&;R;;Rw^^^R;;R;^^^bR;;R;^^^R;;R;^^^F(0264&""&5467.546232#5264&#264&"EfEEf3ii.&'-ii2:RR:!//!EfEEfS~JJ~J:PSrrS5XX5SrrSQ8RtR#2::42:p0F)3;C3253253#"'3!53#".54632#"'3254&#"462"$462" 37{<#2::42:p0?((((F;EO267#"&54632#"'3!53#".54632#"'325374#"326%3254&#"/73 5;824<&:%T'}}'T%:&<428;5 37{<444480 :24::2&;*0*<<R*0*;&2::42: 08.00F\;264&"264&"#"&463235463"3>32#"&'##526=/B//B/B//B L2:RR:2L UR:!/[ L2:RR:2L [R:!/B//B//B//B/n0>RtR>0:RRtR>0:R32#"&'##526=##526=/B//B/B//B L2:RR:2L R:!// L2:RR:2L /R:!/^R:!/B//B//B//B/n0>RtR>0:RRtR>0:RIa53#"&3!2#5264&#!#32#"&'##526=##526=##"&4632/B//B/B//B L2:RR:2L /R:!/^R:!/# L2:RR:2L B//B//B//B/20>RtR>0:RRtR>0F?GO5463"35463"3>32#"&'##526=##526=##"&4632$264&"264&"R:!/aR:!// L2:RR:2L /R:!/aR:!// L2:RR:2L p/B//B/B//B:RRtR>0:RRtR>0B//B//B//B/F4&#" 632'6/!"(;23#"&5467&'!#26'3."EfEEf4 ee 44 G&.ii.&G (BZBAXA~JJ~J23#3#"&'#5367&'!#26'3."#26'3."F4 ee 44 GF 44 ee 44 FG (BZBAXAAXABXB75#"'#"5325325373265OO%N.1,E E<<>謬;;&"-6eMF$462"462"7!!!!!!((((vvN((j((=<F1<462"$462"%#"54>75#"'#"5325325373265>((0((OO%N.1,E E<<>謬;;&"-6eMF!264&"&"32"&5467.54632EfEEf fEE3Jjii.&'-iKI3~JJ~J,#J~JtRSrrS5XX5Sr6FR7"#43232>53#"&264&"&"32"&5467.5463232"&547&#"632"&547&#"3!53<15"0"&JKA5"0"&AKp . *!//!>1 *!//!<<<F?462"$462">32"&547&#"632"&547&#"3!53((((p<15"0"&JKA5"0"&AKpf&&&&= . *!//!>1 *!//!<<<F7>32"&547&#"632"&547&#"3#3!535#53<15"0"&JKA5"0"&AK . *!//!>1 *!//!<<<<<<<F7?G%3#3!535#53>32"&547&#"632"&547&#"$462"$462"<15"0"&JKA5"0"&AKb&&&&<<<<<< . *!//!>1 *!//!<&&&&F#,5$462"$462"73!53322654.2654.k&&&&ªp54.#">32'>54.#"6!2'>54.#"<:00+&D, }XE500+&D, <200+&D, }W';*((-=%4';*((>/W';*((-Fe:7?G462"$462"#3326533265332753#5#"'#"'#"'462"$462" ((((<<<98=8898=89&<<"]1-dc-1]((((((((& eLLeeLLe% ____((((F3<'264&"462"462"462"$462"&\~\\~{{{,&&.((N((_~\\~\{{{E&&&&&&FN5!5!264&"462"F*{{{ؘ<7!63232>7#"&#"#"547>54&#"#4632!654&#"#463263232>7#"&#"#"Gv%3$<"    &3f qE=C4*=NeZC4*=NeA(W"    &3f f@!Q2T   N 88 e,;VJ!:myT):<';VJ!:myT"Ul>x   N 88Fk&.7@43267#"&547'#"&54737&3265732654'654#"hu7Br%J" (u7Br&"Yu7B<\(pv=V=QV=3\MXE0 < DK\MWG0!\MnQq$B533273#5#"'#"'#"'#"264&"FВ/= = &<<"KNMK!"ShVoooВhIh"*484**48 6666MbIoooF7'7%3!53#5!#%'7'9>44?}}}6};?44>lll<<a<7&543267#"&54732654'654#"32654'654#"'h(u7Br&H'(u7Br%%i(u7Br%J" (u7BrV=QV=nV=QV=w' DK\MWG0 < BL\MXE0& BL\MXE0 < DK\MWG.5;m)A;5;m)A;5;m)A;5;m)A;FGPYbk462"$462"%#"&547'567&5432>7&543267#"&54732654'654#"32654'654#"0(((('h(u7Br&H'(u7Br%%i(u7Br%J" (u7BrV=QV=nV=QV=X((&&:' DK\MWG0 < BL\MXE0& BL\MXE0 < DK\MWG.5;m)A;5;m)A;5;m)A;5;m)A;Fz92654'"&=.547&#"#4632632#4.#"26=3=:=X\6EpE4D^'-!( 32#"&'$264&"264&"[ L2:RR:2L L2:RR:2L ;/B//B/B//BO0>RtR>00>RtR>0?B//B//B//B/F\'/7$462"6462"'#"&46323>32#"&'$264&"264&"5&&&& L2:RR:2L L2:RR:2L ;/B//B/B//B&&&&0>RtR>00>RtR>0?B//B//B//B/F\,'/7462"462"'#"&46323>32#"&'$264&"264&"&&&&c L2:RR:2L L2:RR:2L ;/B//B/B//B((((0>RtR>00>RtR>0?B//B//B//B/F '%%X =Hf{GH{RF$462"462"'%%Y&&(( =H׬((v(({GH{RF/7>32'>54&">32'>54&#"1?oxATyQ*+"HVv|qMY K3ZOk5TyQ*+"HV;ek{+0F"eN8H *6)4C)J;O C+?%eN8H *6)4Cp]F/7632'>54&">32'>54&#"<<2353#5#353#5#"&'##3%#26'3."#26'3."4 FG 5<<5 ee 4<<4 GF 4<<4 ee 4<<\BZBAXAAXABXB[/2ZddH]]HddZ2/[ddH^^Hd3::o188A199m2::F=CIOU462"$462"367&'##533>2353#5#353#5#"&'##53%#26'3."#26'3."((((3\ FG ]<<] ee \<<\ GF \<<\ ee \<<BZBAXAAXABXBZ&&&&[[/2ZPdH]]HdPZ2/[PdH^^Hd3::o188A199m2::F #3#3#A<<<<<YYXFR!"#43232>53#"&#3#3#5332653#"'#&'#"&5332653<-&<2?<55332653#"'#&'#"&5332653((&&<-&<2?<55332653#"'#&'#"&5332653((&& ((&&<-&<2?<55332653#"'6462"$462"462"$462"0]wSZ<532#!12bej)u+=HODCQQCDOH=+u)jeb2YO=DEJ?T0-u'&'&-&'&'u-0T?JED<<FA$462"462"462"%2#"&'732654&#2654&#"'>32#!&&&&u&&2bej)u+=HODCQQCDOH=+u)jeb2((((d((=DEJ?T0-u'&'&-&'&'u-0T?JED<<F=462"462"'2#"&'732654&#2654&#"'>32#!53#5&&&&2bej)u+=HODCQQCDOH=+u)jeb2 <<&&&&=DEJ?T0-u'&'&-&'&'u-0T?JED<F-2#"&'732654&#2654&#"'>32#!3#12bej)u+=HODCQQCDOH=+u)jeb2<<O=DEJ?T0-u'&'&-&'&'u-0T?JED<F%%3!53#"&532>532>53#"'+FTY< -:- < -:- 532>53#"'&&&&+FTY< -:- < -:- 532>53#"'YR6&&&&R+FTY< -:- < -:- 532>53#"'3#+FTY< -:- < -:- 532>53#"'353#5<<+FTY< -:- < -:- 532>53#"'!!#"&535#35#'35335 -:- < -:- 32#".543264&#"J9:!D<謬:&IWuKYw7[8W%)afQtFX!75!5!F<<,<<F|3# #IEzyE|,F`753'773#''7FC4CC4CC4CC4C>d(L"(*!//!5QO7Qk>>d(LF_327&5462#"&/4&"327&5462#"&/5#".54623275462327&5462#"dN&"0"51+,{{N&"0"51+,?35"0"&2@ؘ@2&"0"53B!//!* *W{{WB!//!* *" *!//!)tllt)!//!* F&33265332653>53#"'#"&53&5>53&'553#"'>謬U, $F0%654&"333#5##5#"'#"&53327&5462;`2(<<<<<<"N>>N=Q< (!6-E9j9E-6"JzIaaIzS'JJJ33`J+1"]k{{k]"F $462"462"462"!!!&&&&&&&bb&&&&&&<aF 573#%3#'5N<<<<F'E'FF@2'%632"&547&#"632"&547&#"3!53Q5"0"&JKA5"0"&AKpT:hG7 *!//!>oD1 *!//!<<<F#5!#!2#5264&#!3!53r:RR:!//!<>謬{F !!##PS<'F%#32>%!#"&'#"'3!5332>5d~( 4F*) '*'p<( `P38m>謬]<F74&"2264&#"'632#"'3"&547&=.5462"/B//B7//7@AkVIWa?T1+J`##0>RtR>08B//B/=:=X\**^TCDQ^'-!( 3232>7#"&#"#"5.5462Q&&&&RtRRtXH"    &3f IavvaI((((tRRtR    N 88H qJSuuSJq F$264&"%2#524#524##"&4632tRRtRR>>< qJRvvRJqRtRRtXE Eqn325654&#"#F<)u4Mlw_I4D<ـFc3232632"&5467#RtRRtXH"&   &3f IauuaItRRtRT  N 88 qJRvvRJq F/462"$462"264&"7"&5467.53265N(((( EfEEf-'&.ii.&'-54'#"&546326/B//BA@7//,0>RtR>0##`J+1T?aWIVzB//B/\X=:=* L2:RR:2L *IC@L=Q< (!-'^QDCT^*F15=654.#"3276327#.=#"'#'76=&5432&#"Ё I<+-dhH) 1%$1<Hhd* I D!+ o!!}Ӏ3 ]Yv0M;:3}!!o +!EF!%26=3"&=.5462264&",!@!32&54>32#53D!$MNHMP$MwR9?!H!57UB$,8& PP9 $ DYHH-3O@*,   +?_;>/%2 JLbm#%7'7&54637#'75H?1c>LK&II@7:/mke6$;B; AB&eLm!$"3###53%7'7&5463753=I$1MGM31c>LK&I0mke -).;7HH7#;Cf>&/173:>2>7#"&5467Y6   CL_bN\LD  :hj3!eb)4&#".547323267#".546&<(*2,2MS1 O_?/ C/G#^"5  !$ " +=;/QBx  :8QFY5QM'%  5&&_. $'2'32654&##5.+'676753VG E`\)H.2'[A!M)?E)#RDP(#$*GN70C33S{7253#5.#"327#".54>1G33 c$7B &"1(H$C%c.5L0 5$,@ '(f#2#".'732654&#"&546{ #-Uc#k3='I] <r4#53533##5./>54#"327"&54>32=>?&&3>>3?[C"/># .!-% !/ -;P3DD3,HB , :(&,*!.#'3##5.'&/753632&=654G4;E  491,$r^.31*1vZKW(=>E_/**"$*GD(#<%253#5&#".546V.H$33=_%&+><21_P *1(#CAB%m%'673#5.# ) JIg43Q+0   54'#"&543367B5oXO34P- (0" 0!'!C   LE;H_b@L3 4"668& #90.#"#"&5473263253#C PYM.9S 6 2833( W6-( -32 *ia%'63253#54&#".#"#"&54632 33**!" .9E%0 (  $*(-7,*@."*2654&##5.#'>75#5!#2#"'7%25"h <"3$4M(/RLJB5'$1@ wB'*&/5('33T.*'; -q7sl)33##5./>4'#"&5473267>;C3<<3 w/4D 5#'+!-$4CU>3+]2-.6-  &- 6 .,253#5&#">32'7>54&#"#"&546(G.33Iq%E!-8)A&2 J&U-.'$8, $&%8K!9 1!'2[>.'275#'47#5!##5./7#"&M   V 9P3[6 6 4(L     33./@:&p.,547#5!2#"'3267#".573254'#"&72654#y6:1, +":#_5_>%34b6U)2*4'(+"ZMT3,#2940_yHjv1 :jI,=8%E.72654'&'"&'#5!#he97GW2Jb+  @33"558h.73265&'.5#5!#3}1rrF #c2!?$~<]'m33 9OP`.1C.#53>54.##"&=#5!!3232'".'32654'CB * $W3:J C$6> !5  m0;  3+R3< +733 -B ./467#5!#3"'327#".'732654'#"&l'f 3 $7=G:'>) 3PE($"("3J 33G* _57T<-0+!,m!675#5!33##5.'#5.#7Ps(3>>3 3l4] ] D 3 /T?3u?"Sc, >%:<O2#"&'#4.#&5473263254&#"27#"546327>"3254#"532654,!I"?3 4?54'#53&5472654'lF~c :'7G}v4'* 9*13.Q32*9*2=*S-8' 3?6+2%M7<=2Q#Q.$"&=#5!#267#"332654'$8!$^C*3 !:"-?6:!33}6K&4d82R<-G'!3.7"&5#5!#32654#"'632r2ER (I  & n5#33 |& (0 C %;2.#"37#".54>#> f$8C .- ;;-*Qk.5M/>.,6& mm-33##5./654&#"327#"&54632:+33::3 $ 3 !=-,;*8R?34# 7F 5!$05 W3$"753##5./7.54632&u  Vm:32L8B*"  d(6&4/! 053=252-"( ? #!z.'5#5!#6?#&54C+G1*k`CV? 3 *339 (&+/).1.&#"&546325!5!#<6!(E5<^3 v)2+M3K.K9#>3253##5&''654&#"72767&#"KK;\PƓ2 (+8"?!J_T3:  ( 5 & /.*#"'73254&##5./67&'#5!!532')3l*<&I8/. ,2$%=0g21%11@ /!%033(* #<7.675#5!##5.#"75WmI/3 q(0!Q $KxD!33?c : "..24632&#"32>7#".'32654'#"&'5!u '    %4O:-K0* 3h=(1%<)4 1  (>?P#3SC1 jv:-@:33. *4'#32%#5!##".#"327#"&54674\# U:ea,)#G7 $*4,753309)5))30#(L.!##5./67.+35b-3h)!=,V=.#DZ4.36/;)8 <*>A5QM'%  5&&.%25!5!##5&#".#"&54>326 O3&)+#$$$3 4"*-%Z33>?$7( "E$)/).0263253##5.'27#".'#"'72654&#''/ #!7j3# % 8- #/IK[334 0 +#,1!&30".!327'654.'"47#5!##".x/b1a4rk7 $%Y( MK$33-;X ,J.%#".'#"&'6732654'#5!!3254':(4 "<6 " $78$=",6(3!'@* 33$H8 ([\.%)&/32>54&#"&54632%5!) (z/,"2 5%"H!'.W([6'37 ("1 ,X332}.(2"&=#5!#>7#".'32654'4632"" 3 !/!-*0L) 3e7,=$Z$+7~33{CC#$9" 8NbC u@#!K$:.'7"&5#5!#32654#"'6324632#"&n -@Y0A+a_ 7 !33"g+ '$*@EM. #74632#"&&+5!##5&/675O /CA \532{ +/0P>(( B336Q )-m(E(5QM'%  5&&7.7.'7'675#5!##5.#"75D++DWmI/3 q(/!R $L9 0 6"D!33?c ; ",'233##5./32654'#"&4732>54'r=Y3ll33P]+ 4]?? 9/( 0GC=W3&-!?2 JJ3Z0H..'5!4.##5&/7'7632#"'7326Bpk/&3>(y&)djF4Lf< 33#nAW6P!4#>#=>G83, ;X.7.#'675#5!##5 /AT&yg4,~X:<*6g&+33: N6NFo.4&#"3"&54632#53## R! *5'72BC3[? (&/733tY.'463&'7#53##54&#""&5& 3>wC3]+ ' )(3 .>3 333oZ((.47#5!#'>54&N2;ACZ+3xK833G@EE0 )! .>B2'65.#"#4&#".547326324#"327#"&54>326%5!M*9!#)/3=TFRD )7=&Q7-%y# +SaU7uG' &(09+'{9F0/#)( Z63,/"2)/# L3D06`*.33.(L1#B%''5NJ Q4A.#"#"&547326325./>54'"&547326733##wCQLZ/EF<4686q4)$1( ,(74#"#"&54632533##yCM /E#.DG 6 28V^!F O",&"'*& N  WC9M.3CC3' --$1 *;) *<7#)"5"% $%1^5HM3.+=.##"&547326325./7#"&547#5!##27#p#l1D.*" KN &Hc<3&   34O:0% L3 2>] (R8,33 $ a0 +.-5&#"#".547326325#&'#5!!#2654.'o+( t "+.*" ^KL=7(3(Lg9 ;(.' P1e33=() "%+? 8 7<.KW.#"#".547326325򂂮./#"&=#5!!32&'#2654'#"'}C J0E#.136E$"1'-4TEQ.##"&547326325#"&54>7>54'!53&5473##2654'r   g 2C.)# 33=EV2 Q6& 00ƯE 3r7F<"G/P90% L3):ZD N= 3\H8J",O63o.BA!"x@TV>NAqY.>.#"#"&547326325#"&'332654'#"&=#5!!3267#DPLZ.9S 4 56*3m3b[;RR%(F^K3r' M@'. *32 +[3'&?.33S2lF&.:.#"#".547326325#"&5#5!!>54#"'632#p#y "+.)# ?D 3 .q,.3' :&.' (&3 M/733q \&"!<5>./!!4632#4&#"#"&54732632&#"327"&5͘6 3.*>L, Vx'&w  >%.39!-]B4]I/A*3$"m&$ -VU.GK.#"#".547326325#".'332654&#"&54>32#5!B Q/D#.DG 7 83%.":,'3  $2BLF57 + 8&Kc33Mvu' ,.), '<) *l0'F+R'*7;X/:\IFa!#'" '}>33B.#"#"&547326325&'&/67654&#"327#"&546233##xCL LZ.EG<46PB`,p'@7) ? (V~Q]$iJ4QQ4<( M@*+ .;) +BW68;"*$3- 2DJ=7Q(ZX3.+3".5472632&547'#5!!67&'" '0!1-Hh'#* d.e,-.(5*f@*/:!3:gV2"33!S|^P "55:.#"#"&547326325./7&54632&#"753##yENYM.EF 6 46FkMq_<+( $yR3yUwW2) W6), .<) +EFL)[E/(8 DJ3325!5!##{B OYM.DG 7 65"5- "!4>)b3|P3m' W6), *<) */:'' , '&D2;(f33c.H7326325.#"&54>323>54'!5!##5."#".5472*"  9; ))&)H2 $k>j3 k "*.'3 -" !2% ,,>33-&54  ;'0%   s1<.#"#"&547326324&''654&#"'>32533##267&#"CPLZ.EG 6 462$%.# n6F3VV3 # S34 ?2( M@!4 -<) +) W"&!$ $1PE3 ,+R)!.>.#"#"&547326325./67&'#5!!2#"'73254&##xCL LZ.EG<199b($fp3@&69tMh," K94F' M@$1 *;) *IA] %M#6@33)9&1,&bNIg2 1 #3=.,3726325.#"'675!5!##5.##".547  8"z@4#:/ #*.) 2" H,6`-+335 ;'+* (&3{I`!!.8<"32>7#.##".547326325#"&54632&%5! 9 !1- -!49;$1C1g7aD0;3%: 3 !]#"J5214B "U>0!+$+_33hA.FJ.#"#"&547326325#".'32654'#"&54632&#"3267#5!A MLZ-EG 8 38 %9bC:"9%T,P"5R3O)4! K%3!%33MXc' M@*+ .;) +w1Jm_:Q?3Z7?#00):2G #!9 D833=.18.#"#"&5473263254&#""&547.'5#5!##5|C H YM.EF :56`#/*U.C AML93?59.( W6+* *;) +5+P,`)%""33B73N.'5.#"#"&547326325./67.+5!##zENLZ.EG 8 46)9-9Ye n>4a/:R#-2) M@!4 .<) +;CR 89CG33bN/- /jM.#"#"&547326324&#"327#"'#"'732654&#"563263533##ENYM.EF 2 56P%!, <" 4#I5N3QQ32) W6), .<) +Ms/6 +:')01=8k_  $W3.*.5.##".547326325./67&'#5!##5&'o#g #*.)" BdE*g-~IF3LI;0{V2 ;'+* (&3 /]G:%R#A33b{(?+7q\.6?.#"#"&54732632.#"#"'73267.'5#5!##6325CPLZ.EF 7 29 :(20A,- B_853@5"'2n' M@*+ ';) * N4?4j" EK7"33a84E.FN726325.'#"&'6732654'#5!##5."#"#".5473254'}   2 "<8 " $7W33   k "*.*8$= '3!'@* 33"<4 ;'0% &'3w$H8%P.:>.#"#"&547326325&/32>54&#"&54632'#5!zDNYM.EG<64_:&9 VB0d/7kY&4y{' W6'. .<) *Uy79!(# )7#$*9,JZ9o2Zq!!33.)-4.#"#".547326325.#"'675!5!##'~CP/D#-DG<19:!~oA39V0 %& ,-&- /;( *%-6b++33@>e X,q.)18.##"&547326325.#"'675!5!##'.'7l$;.2D.)#: !~A3X_:,n6(Z%O:1$ (&3 o-6b++33v&Q . I7QHY*.M`e.#"#"&547326325.#.'474.#"#474'#5!#2#"'73254&#"#25".5#7#3FL LZ-EG 8 38Q*  R+&69'j$044"  ,4 38a?  S3 2( M@%0 .<) +h5F 1#2  Q 33Y.!1&/ &,*4\D8 ,0)U.D%'675765254.#675!5!##"'#7254&'#5./7&',EX.4"kP*-D !4XlGq' %+!O3)"M."M.(,"m ?   [X5-33. Q>" 5$,3#3Y%( )0" V67723##"'73>54'32654#"'632#"&547./675#5!4&#"#"547326c' 'Fy52\,0!K  Y8H%%P #'Ks93@<(2 DoW1 A/DRkAY)<3!7!H, F^iH8#Q*&%4[54'32654#"'632#67AC K55 .

 H&;$6 .*>,C"<6) 1&,)#.$&<4G:)1050*0! 33.LT2#".'732654&#"&5475.#'>75#5!#2#"'73>5654&#6'25"7!0 "D-7a:#32M*.;!"+ 4Q( PT'; 6&$ 5$1@ u!0'*2"B_OGP85)9+/5*33.'*';)#oq7O.SW%.#'67.'32654'#72654&#"&54632632#"'7654&#"#5!w#) JR, 1.(!   *433b= >!)0%,*@,G"A4) 1&,)#.$&<4G:)1050*0!&;:#33.Ya2#5.#'67.'732654&#"&5475./>75#5!#2#"'732654&#6'25"A K !0 3S+!"+.Q132M*.;!"+!/U( PT'; 6&$ 5$1@ u !0';2,0#! FVGGP85)9,05*33.'*';)#oq8F._c.#"#"&547326325#".'32654'#72654&#"&54632632#"'7654&#"#5!EOLZ.EG 8 46371('   *445ʅ) M@!4 .<) + .*>,C"<6) 1&,)#.$&<4G:)1050*0!&;33.NV7&54675./>75#5!#2#"'732654&#632#5&#"#"&5473263254#"'25"&+$*W( PT'; 6&$ 5$33)1@)L--" 6 '-7z1@ uw ?25*33.'*'; )#6&*#F2$6 / *"(<q8.ah.#"#"&547326325#".'732654&#"&5475.'"#'675#5!#2#"'73>54&#632#25"zCOLZ.EG<643;5^=%32M*-<%+1I(B'< 6&$ 5$ &34=<v' M@$1 *;) *&>[SGP86(4+-54633.'*';)#&>&iq7zT.7>&#".546325.#"'675!5!##"'72>54&+#0?^&+>,RH@zw9F0/")( \22)7! *3&#Cc-/6`*.33.(L1#B%'7L JX/M.8@65654&##2#"'74635.#'>75!5!##4&#""&'25"^*/5Y1[%'&$-/W(PEpV3B#''P1@ u3 "8@2T=8;$!"15&33@ )&q8T.EL726325.#"'675!5!##"'72>54&##4&#.#"#"&546x4& (@zw9F0/")( Z72,'(#-74'#5!##"'73254##5.#.'474.#"725.'#7#3c6 'j1"#4"  3Q*  R+&3)?!? FDS3 n 33Y)1&/ &E|5F 1#2 V$878L=0)x.HUZ&#"&546325.#.'474&#"#4>74'#5!##"'73254.##25'.5#7#3Gg6)KE#3O-Q*  RJ'6'j1"#4"  ,(3BV? +">S3 ?7/G'6:9[5F 15? !33Y)1&/ &  Um@8U)0). )-d25.'#2654&#"2#632#"/'#3'.'#5!##5.#"327#"&547.'#"&5463.'#"&54 '/"/<3M >) OS#C  fR<kI3m+  "4!&&+'!A)'*?  i=9)!* 5 < 338'^ /)0 -)#!&.!;A675!5!##5.#"#"&'732>7&'2##"'732>54'6!S395%,#5*!/ NS> BG # V._a]9idR'33l0#)3@ ,R.A/<'  <Z' K4&#"632%4>32533##54&#"632'>54#"#"&5467654#"#"&Zx=UBSB,>*y>3RR3S>`D . %' O$U:)E!?;|eL 5+1!rY3gPlh"% $)+&9G   .A25!!67&547'5&#">32'>54&"#"54>yPG.}e,7d-Iq09"*+ #& ! J8-.'3!wCq8Nmx72r<6& $'! $   -D+18{GQ4632533#632&5474&#"#5&#'675.#">32'654&"&25\GaJ1@23Cw2K"0!?)+ (  '$fJ 9,g-* 6PnM3UQUbCdE) Am@H< -03-1 (!  #"U' ) :%8{MW].#'67&#'675.#">32'654&"&54632533#632&5474&#"#5'=2SU*!9M7X2K"0!?)+ (  '$fJ 9\GaJ1@23  Jx2,f-0:.5@H< -03-1 (!  #"U' ) =6PnM3OWqFCdE)    -+9+{L2533##54#.#"#"&546326325&#"32632'7674#"#"&5469M.3CC2#- .%$ -07#)"!E( 6)%1^+{=2533##5&#""&54632&#"32632'7674#"#"&5469M.3CC3=_%"/>,.H$V^!F O",E**8+ N  W15HM3< *2(#C2107#)"!E( 6)%1^+o{:@4&#"3"&547&#"32632'7674#"#"&54632533##'32#R!  *&V^!F O",E**8+ N  WC9M.3C3l72l[? (&"=7#)"!E( 6)%1^5HM3t7l.927#'47#5!##5&#".546325./7##"&& !&')3fO=3=_%&+>,.H$JN&H $ #a0 133qP *2'#C21$AZ (R8.>DR#"'#'654&##5. #'76?4#""&5467&'#5!#572>747474+' ;Wi$:/3  ~#k%3'4 *nHU cK:d c 2'i ~x50%"*2  3FU&$!334F&Y.[am.#"#"&54732?6325. #'76?4#"".546?&'#5!##"'#'654&##572565474+];2QH* ?A  )5  ~$k&3" * -fU(:Xi$173hK;d c 22(W6%0 ,<)+!  3F U&  33%i ~x60$0{5H%.js47#5!25!##"'73254&+##5.#&/4>?54&#""&=47#"'3267#".573254'#"&72654#725'.5#7#36='3 3#  ,4 3Q*  H7$ %7#_5_>%34b6U)2)5'(- 8`B+">R3ZMT33Y 1&/ &,|5F     -;  #2940_yHjv1 ;iI,=9% ^B8U)0).KT.#"#"&'#".573276754'#"&547#5!25!##"'73254&+##2654#"&=47#"'326732?6325.#&/4>?54&#"725'.5#7#3A 6?W 5_>%35b5*2)45F'3 3#  ,4 3~())$y$ ":$_,C?38Q*  H748`B+">R3"'81Hjv1 54'"'#"'3267#".573254'#"&72654#63f *(<44Ld3TT387p4(0 %7#_5_>%34b6U)2)5'(- ZMT3A4?JJ>`V3R-1C*5)!#2940_yHjv1 ;iI*=9%1_g7>54&#"327#"&5467&'#5!##"'#67.4&54>7#"&'732654')58"%(2 k#@64 ( =MHk-4    $O3="-}$B">' 3!+22 %N!@%2kyHY+    R=.'; -+ .:CP47#5!25!##5./7##"'#"'3267#".573254'#"&72654#27#6B<4MNG%7#_5_>%34b6U)2)5'(- P!M82ZMT33A>] (R@#2940_yHjv1 ;iI,=9%/ $%4a.3<Il.#"#"&'#".57;67654'#"&547#5!25!##2654#27##"'3267326325./7##"D)EW5_>%34b6  .)2)56=<4'(- P!M82*%7#_HD? 2 46MNG2'?6Hjv1 ;i& !,=9+MT33)%/ $%4a#2940_U, +0>] (R."O2654#7567.'#"'326'47#5!##54&#"#"'#".573254'#"&('(+"?4<+/"O $. >":#684`#$%T3%#O5_>%34b6U)2)5%963M$3 !#0 9MT33 .!O,B%Hjv1 ;iI,=9nP.1:V47#5!##54&#""&54>3&'#".573254'#"&72654#7#"'3267y6hC3]+ '+(+5_>%34b6U)2)5'(+",*":#_ ZMT33s;Z(* / Hjv1 ;iI,=9%9 * #2940_7(  .!*07265&'&5#5!!2+&'52654/&/#2qoJAb!;'9(G"`&$,\4 i7k}=]$3&0m33=,'+J 3C8 $ 3H +.6AIO.+532654./#"'#&5#5!!;26722654'#"'3265&'5#_AmS."C`z;GVx _1u?AbD=#) NC1 1rrFe2]&S)$7='4[2@]Eg&0m33@ZK&z$~<]< /H +.GRZ`.#'67&+532654./#"'#&5#5!!;2672&'#2654'#"'3265&'5#G  JP, AYlhGVx _1u?AbD=#) N_AmS."!/4C1 1rrFe   > *0C0<4[2@]Eg&0m33@D2]&S)$$$K&z$~<]< /H7+.Q\dj.#"#".547326325&+532654./#"'#&5#5!!;2672&'#2654'#"'3265&'5#xC L55 .32>32#"&'#4&'#&'%4&#"32654&#"5326if0C GQN5+'W@5o "#!)=b*7%B3"- ,0g*^3=c}o H$5a/W2% $-b+ @33@?%  S x$ )!`QE]A' 4&7-gBO-yQ xE67"+3%.,5.#"&54632+&'#5!!#2>54.': +="6(K=+4K/+n+c=2-* 4#bDLg*9#7 /G =7<09N33=&(Yi $.#u%2654'"#".57"'327467#5!!327327.547#".'327#"'#".'&'73254'#"&( #~4 $7/%:)>! @l7J 22 7$:@C1cF 8!;& 3/L$&B!  1#4`M8>.K 33GQ =Gf%=#`O (!+(Z2Bm#-!@z)2K..M"67$.)%'2654'"#".57"'327467#5!!327327#5.#'67&547#".'327#"'#".'&'73254'#"&,J( #~4 $7/%:)>! @l7. 3Q,!K\2 7$:@C1cF 8!;& 3/L$&B# !  1#4`M8>.K 33GQ =,J73 *0K.`O (!+(Z2Bm#-!@z)2K..M"6G{.OU%47"';2?#5&##5654/67.5332654'#".5467#5!!3276 @.29 , +201#<9S(1$;# ,#2S;?C.9Up+' 0, S) r+".9L7  e38+CMg9%*) ,,*7*33!3# )T.1FO2#"&'#".'&'732654'#"5467!5!!63254#"';2654&#"&'32696)'P S,BQ0L-%)(7 =/e5}2M<^06@%1'B/D61K65k@$2N7> h @#/~&U33)P`CY5:232537632%32654'#"'732654&#"iF$cF.=",M("PG !"3)32#"'24&#"3254'#"'7;26&'32qz/34+44(#ve A1,?66c- @!<^H&4.1.&0"((.l2&?M5E/Q*  )|- *O!@r''' E4 *A!= ,B)2+5;HB=!7)-"?9LK6m( (6C)$ !0^v327#"./32>4'#"5?>5'.'#"&54632>32&'&=467+"'3254'#"'7332654#"> +!- & :]/2 h; !# ,I!  $8&P;+*8#>"#! H$%" X,#<-* .*)[yV/) N*0Pj9]s *B_>7  9 '.1X'(+%%. /^6?(W)++C.  - #8!1- $o%7'72654'#"&5432654&#"2#"'#74'#5&/67&#"#"&5473724&+"&54632>L7U.h*}1 )9d_80:)/4%!*449?[0 ! DT$,A?iP .m &;.))&E! K*+BM #< $ t\A-7/>+5 H/F\9,/oS&C8M; Bw. '6:>f$ 'G%#"'732654'#".=#5!>74#"&5473723!32654#"'632P#?*\.Lq!?6.)y[5G!* a3D/#;T *"))/&-( (*! 3 5 <1) $ / E3 37q9-$!B2H;'d.#"#"&54732?6325#"'732654'#".=#5!>74#"&5473723!32654#"'632#g>2RF* 7I $ .3(:\/KrD6.(\5G"* `4B0#;T (!")$3(V6)+ '30*#%* *" 3 5 <1+ $ / G1 37q9-$!B2L*.o 'I4&#"3".54632!32654#"'632#"&5#5!654'"&5473723##Q"    5'73;d&!"-:c4,'d[[3G!*a6AB3[@ (!/76D$"1'6vS?'O3 2 ?/) . F63t5n{FQ%"&=!5!632533##&#"2632'7674#"#"'#"&'332654'7&547#326!#C9M.4BB4T`"DL #,F)+8+ T 0E:qu30M0?32>54''#"=#5!#3267#"&'#".'732>54m !730)%&7 #R^1~ S-6aEH_1W/2MI</5 0 $ȇ975e;"2)%:(7#6333T]4BzH^0IJj !0)"o.=4&#"3"&54632!32?67#"&'332654'#"&=#5!##6Q"  *5&824 K(R6m3b[;RR%(C3[@ (&07-2l7?+[3'&?.33t ='L#".54>3253>74#"&5473723!32654&#"'632#"&=4&#"37 % :&#? [8E!*4/@b  "'KC/(h[B , 5#,6&.,c 5 ;1)  w 3I %"nO=(s_M h'm.#"#".54732?6325#"&=4&#"37#".54>3253>74#"&5473723!32654&#"'632#D6/E#.EF56;5/(h[B  % :&#? [8E!*4/@b  "'K(3c',.*+ *;)+>=(s_M- 5#,6&.,c 5 ;1)  w 3I %"n8F $U4A".546324.5473##"&54747654&#"3732654'y &E3lB99<8ͫwW6ca*#)Z[c2$ET"* 8%327 %N?i4#6K&/ %&)*.$ "/(" ='(5h49K #`v\ &# XKA>$ /E% 1 )FDZ,!.=46325!!32?67#".'332>54'#"&=&#"&7*.5L4 K .U6RL33 >GV80I$S%#40!(%7;n3-2l->2$Gd_&aM/ *<2#*@3;[h2f.#"#"&54732?6325#"32654'#"&54632654'.+"27+"&54>327#vC  L[.DG( 46%3i4#6K&/ %&)*.$ "/(" ='(5 %3c'LA(- .;)+ #`v\ &# XKA>$ /E% 1 )FDZ*417.IZ%"&=&#"&546325!!32?67#5.#"#".547.'332>54'#"'32?632(4/!(8)02L4 K3C K55 1A3 :FT?/I$SM4FmQ 325!!>54#"'632i 32ZB  &"2(2F` 36% ,./7#6cL0 5",@ H$3q 6X2&"!<Y?r;327+"&54>32533##5.#"37#"&54>3254&#"r, )F>)3& 3__3f[B L!1)1GY$-H>3^+1:('c3w!icM/=B+@ H$+w4?o{=%2#53##54&#"3"&5474&#"327+"&54>32533#;3C3Q" *$Y$-H, )F>)3& 3,,4633t6@ (&"3+w4<>3^+1:('c3J.04#"./732654''254&"&54>32%5! cM 71=71832%5!*"Mm 33R,!(v^7186u) &.X*Y?31 ZD.++  5 %09&h;$ #1U.;?.#"&546325#"&5/332654&#"&54>32#5!p +="6(KE#3M.83XYBLF57 + 8&Kc-(3ov*9#7 /I'69:V\IFa!#'" '}];c33E.J"&54632!5!##54&#"3".5463&'#"732654& +0& )1"@B \H2} #(/  ].  ,!.,  !1 7%f*336!U )+ #<*D%8o.>4&#"3"&54632!5!##&54>32#"&5/332654&#"6Q"  *5&82C3 + 8&KceT83XYBLF57[@ (&0733t'" '}]\|V\IFa!GU.JN!25#"&5/332654&#"&54>32#4&#.#"##"&5463265!["#83XYBLF57 + 8&KcA2,'(#-9+ &*/6-$F133{@2533##&#"2?632'7674#"&547'#5!#6746:M-3BB3T`!F  # "-F)*8' !) /d-n\\xZ17FM3`7#  )" F( 6' NkWG LcdY233{4[.:27#'47#>7&&547'#5!##5./7##"'&  3f2t2d-n <3KN $ a0 1DEPLcdY233A>] (RMrWG-..?6?'&547'&547'#5!!>7)'!#2")3!#)2>32TZ,k(N!* oZ8`Pc,H#"E (37>7#5&'R,!EZ  2F?2TZ,k(   (")3 % J+0G//1,H   + (37>7'&#"#&'7 8!#2  2hn,k( ')-X")3#F"W!- *Q 02,H !6- (332632'."33 FG! 4F0If.A;s3@32632&=474754'#567  JQ,!!2! 4F0If.A;."33s%   >!)0+wD}*33'I6* '0 <54'#"&5463367&547'5#5!!>?6765qVN43O- (0" 0!&"%   3%#)J &"y?H8G`b?M2 4"75& 0#)#33"!.M%25#"&54632"2?&547'5#5!!>?67#5&#""5473265!'$2&'4##< 3%#)J &"y*38 2:;K -1&%# 8)#33"! 5;,<*7/.j.#"#".54732?6325#"&'332>54'#"&543367&547'5#5!!>?>?>767#B K55 .3!"&547.=47##5!##5&#"27d%  2- *y%"V$3 ./MQ3U0  80  #z0 $sH5= MK0G33Ap  ' -Y507"753##5&#""&546325./7&54632&#yR3=`#.>-TFGkMp^),*' yU-J1& DJ3^P% )3'#CcLGK)[F=8Y4&+#3"&475./7&54632&#"75!###632R!  *GkMp^),*' #yC3yU-J1&v 72[? (&88GK)[F=8 DJ3t:L654'!53&/&5473##"&54>?654&#"7#"&5432654&'*!F 47! ΰT$4>./U9(-a <- .:8&.MC%!%30%16D<)%4*P23sv5S. G4- *%.$/^.$1kFsM20 /7T3;OA8   '+3k33H^HtBq}I 5Pb?,\F!a".: 0%"(Ee.[.#"#".547326325#".'732654'#".'&";27#"&546325!5!!327#C  /E#.EF :2965FsM20 /7T3;OA8   '+!:~QL3',.%0 &;) *+Bq}I 5Pb?,\F!a".: 0%"(3k33H^-,^.,%"&=&#"&46325!5!!>54#"'62Q,'<6!(9(5< 35%*>.@&vR3L33q 6Y1&"!=Y/.I4'!5!##".'732654&#"&5467.#"&546323>$u>t,+$N71[@43d/&$5I4$)/% )* )-0=!& >33-&3_"142JYG c}@1(7% "&!5  !253..W%.#'67.'732654&#"&5467.#"&54>323>54'!5!##!  JP*!"*6a?(4\=&$7G4$)/% () ))&)H2 $z>y*>3!  >"(0# MdZ! O#A0(7% "&"4  !2% ,,>33-&2 >5S,.L"&5467.#"&54>323>54'!5!##5&#"#"&5473>3254`C$=(+ ))&)H2 $k>j32: O 9J,8'#<(AH %"$P !2% ,,>33-&0'3*V02: >(11I).i#5.#"#"&54732?6325#".'732654&#"&5467.#"&54>323>54'!5!#"* >3C   LZ.EG  55)33-&2a).F%#&/532654#"'63. #"&54>323>54'!5!# %@(}"w66 `SaG1    ))&)H2 $k>j( +#A#m3<)H]     !2% ,,>33-&= 9y.$&547'5&#"&46325!5!!67d.<6!(9(5<e,.Lcb[23vR3L33!PUYy.5;"#5&#"&46325!5!!632#7. /6754&5'g3<6!(9(5<MN12 -cRTM>}*vR3L33o   +R#E :&.A3".547;26;2&547'5&#"&46325!5!!67&'#"# &/!24 i , d.<6!(9(5<e,./'5P@*81!3:b[23vR3L33!PUY .06#5&/67.#""&546325!5!#632&5455(3=e&=q9"4D$7?".W46#2D&2N;b!35:%&4)0")55*z33f;8lWq>;&!K.6<E.#'67&/67.#""&546325!5!#632&547#5'O+!?J3G&=q9"4D$7?".W46#2 5(3~D&22' J#'0?*635:%&4)0")55*z33f;8lWq>7&!    Y.HN&#"#"&547326325&/67.#""&546325!5!#632&547#=Y22#;]* ?A * '6=e&=q9"3C$"1?".We9 2 5(32LD&1<DL$3 8=* +b!35:%&4)5)55*z33f;8lSu>7eޱ6&p.1.#"&546325.#"&54>325!5!##W +>"5(LD$.J7"5- "!4#4,d1P3G*8#6/J'60C.9'& , '$E/F"e33uov.3:4&+#3"&475.#"&54>325!5!###632R!  *"4'"!4#4,b3C3v 72[? (&8.:& , '&D/F"f33t97.7D%4>3&'".#"&546323>54'!5!##54/&#""&#6'$;E )-07+' $C3)" '*ڏ.' ,, !25#>33o)((U0#,;  ..7"#"'727&#"+"&5463267.'5#5!##.'6325J $": <+,6"K (&0&T1IX`$J01O#,ESEU3:x "&'o)*&"33)<{0!B3'GR#"=74754&''65&#"'>3253>74#"&5473723!>54#"'6267&#"29d4T3 $% .# o5F[5E!*39 9f+<-/@)9 D $E9Z Y"&!? $1P 5 <0)  w 3 J&"!<4+E/" ,K~=I#"&/732654&#"&5475&''654&#"'>32533#2767&#"!0yAJ5$3 E:=)5I1,3e #K;\P0(+8"?=>;J^{XVF* A0!C &%NR  ( $!J_P3 & /y 5?727&#"63%&'4&#"'67654&#"'632533##5&''27&#"6)'kA+E!&/03W!) L&)PwZW5OQ1-&m9)4;Bt2H% *)E '4 ~K3.'`9G os*5:4&#"3"&5474&''654&#"'>32533##267&#"2#R!  *(2$%.# n6F3B42 # S34 ?R82j[? (&# W"&!$ $1PE3tI ,+R)!e7  s0>>32533##5&#".5463254/.''654&#"72767&#&#" n6F3VV3=_%%,>,OK $%.% # 3#2$ ?1PE3O *0($Cd. "&!$ 9 ,+2&(!  sFT7463263254/.''654&#"'>32533##4'5&#.#"""""&2767&#&#"YC/5% ( $%.# n6F3VV2,'(#-< # 3#2$ ?!$F1. "&!$ $1PE3 = &*/6 ,+2&(!.1;D>3267.'5#5!##.#"#"&'7267&/'654&#"72767&"76325Z.jZLUJ05 (2%$( ,%#' ")V[ X(E{)+&"33 EIe '$*& 5!+`E!#W23!52732#"'73254&#32654#"'632#"&=./67&'#5!654'"5473;{"="w/. ,2%=0')*G *n71l*<&I8Anf-% =,3(* #(69vK Zr8 #1? 8- -407X>0A_ %M#6@33*8&1,'aNaP'% .I'675!5!!327&5467+".527#"&'&'332654'#"/.', 26S _%+19/"#  -@%s$ 20:+.-7'%& .J-* 33., /hx+e s(4  31SZPEl."2("2.'5675#5!!67&54?67'&'Q\[p@f,. 4W59'}h<%2;33!4aQNI Qi "Z7I9&Z0.8>74732632&54?67'&/675#5!!67&#"#"&5S2)0x!0  4W59'}!@f,.)9q%>J\[ ,A,9B "Z7I9&Z082;33!4aQNI -[<%=.+2%&546?#5&/67./675!5!#636750_I-);"Y1Ky0%*"(T` $-E^w72+[uo);T&? *e#+33+W#T`l L d.+.+'675!5!##5&#".5462*H''%9!~A3=_%&+=ZH%$X,X.6b++33iP*1($B21.7=%#"&'332>54'#"&547.+"'675!5!##36?6'55oXN44O- (0" 0!&"9p(\g%,  S]D46326325.+'675!5!##4&#.#"""##"J(3' *9!~A2- 1%$.H''%0,.6b++33<)  +60$X,hA.SW%6325#".'32654'#"&54632&#"3267#4&#.#"""&546325!' (9bC:"9%T,P"5R3O)4! K%3!%(#2,'(".;B05XE1Jm_:Q?3Z7?#00):2G #!9 &R:* &*/7,$F33. P4'#32'4'#5!##".'732654&#"&5467.#";27##"&5467# 6: &f %#hQ1[A43'=[06H-#1)0! +%!4,("&T!-33543VD\1JXI V^A@1!>!&. #3+'8O[33##5./67654&#"32727+"'#".#";27""#"&546754'#5!6324'#32\%jI4QQ4";,C&,n'B7) ? D#G7 *& e)7?Q# '*:8P)YX3I% 58<"*$3J))3+'!-3JI4,#).1=&547'5#".#";27""#"&546754'#5!!674'#32nd.#G7 *& ee,.# '*:Lcb[2[))3+'!-33!Q~UY4,#).2>#5'.#"&546325"&#";7"&546754'#5!#4'#3224L"3 #QA"+c   && oM4#(&:B E1?7 /G%:B|X,#'4335*5* #, .-47254&#"#"&547.'5#5!##5&#""&5465.H$`#B2U)D>NB93=_%#.E-=79.!21C+P,],&!"33P *3(+;82Nbs Z2767&#&#"4'#32'4'#5!>32533##4/.''654.#"#".#";27""#"&54670)3#2$ >`# '*: e N$F3VV3 $%!/,#G7 *& (82&(84,#)T!-33 'E3:. "%" "9))3+'bs^kw.#"#"&54732?6324/.''654.#"#".#";27""#"&546754'#5!>32533##2767&#&#"4'#32C  LZ.EF 46 $%!/,#G7 *& e N$F3VV30)3#2$ >`# '*:2(M@%0 .<)+). "%" "9))3+'!-33 'E3(82&(84,#)`shv%263254/.''654.#"#".#";27""#"&546754'#5!>32533##4'5.#.#"""""&5462767&#&#"4'#32 2) ($%!/,#G7 *& e L#F3UU2- .$#.;DM % 3#1% !?\# '*:1. "' "9))3+'!-33&E3 % -3/7,%E--+2&(!54,#). J4'#32%467&'#5!!32732#"'73254&##5./7.#";"&5/ ;*d Z< ^r#%/"(M83'5!ll *" #33 O6GM^O7-&-=ZC;V -VK ,.Zg.#"#"&54732?6325./7.#";"&5467&'#5!!32732#"'73254&##4'#232F6LZ-EG  38'5!ln **d Z< ^r#%/"(M83V *';2(M@%0 .<)+2;V -VK , #33 O6GM^O7-&-=A'.NZ#"&'332>54'#"&547.#";27""#"&546754'#5!##"'36?6'4'#325pWN43O-'9 0!4*0" *& ea1$ # '*:NF9FbbAL2,$ 7$'/ #3+'!-3309-/ " \4,#).T`%25#"&54632"32?#".#";27""#"&546754'#5!##5&#""5473264'#32!'#7")2# F#G7 *& ea/3: 2 0DR# '*:Y -2%&# A))3+'!-330985;442B4,#)Z.kw&#"#"&547326325#"&'332>54'#"&547.#";27""#"&54674'#5!##"'3>7#4'#32\7<QLZ.FG 929/=N43O-'9    4*0" *& ea1$ !.5(3# '*:q: M@+* +9, +nbAL2,$   $'/ #3+'(-3309-/ 5F9;-A4,#).3?J%463&'#".#";27""#"&54674'#5!##54&#""&74'#327#A5&,#G7 *& eC3Y/ '*# '*:2D(&#))3+'(-33o] ()4,#)09 .>8op.4;%#53##54&#"3"&546754&#"#"&547.'5#5!#!530*C3Q"  *`#B2U)D>NB =79.5533t6@ (&/{C+P,],&!"3382N.JV%25#".#";27""#"&546754'#5!##54&#".#"""&54632674'#32 #G7 *& ea 3 *-#+& .9A).3l# '*:))3+'!-3309*$(  @-7,$G7 4,#)\.;B%254&#"#"&547.'5#5!##4&#.#"##"&5463265;`#B2U)D>NB92- .#%.;K'2( =79.C+P,],&!"337- ,4",07-,=082N(.>JS4'#5!##5.#"#"'73267.'#".#";27""#"&546?#325476325n e?53 :.10A,. 0;1$#G7 *& ˵ '*:D@5"'2!-33N+(Tj# F?9!-/))3+'U#)B4,74Eh(.Yen.#"#"&54732?632.#"#"'73267.'#".#";27""#"&546754'#5!###325476325A 6K\-EG 38 :.10A,. 0;1$#G7 *& e?53y '*:D@5"'2c'LA(- ,;)+N+(Tj# F?9!-/))3+'!-33m#)B4,74E[.;C3&54632635!5!#'654.'#5.+'67.#"&#"I!SK'; !u7J 4 :1-'X= !C" +@%"h8-i,L,=!  a33 (3"6!)& ) )K:0O;"_` ;.L46326325!5!##54&#"632'67&#""&5463254&#&#";"&=29- !"s3ZB!AH"+ '%A & 'bEAH"1@#!  %,a1G5&L33œ+\;+$'  %$1&!=QL  ^1,17,W3723!32654#"'632#"&=4/.#"&#"&546326325!5!>54#"&5473C =f*2N$, ,<!8QI(8#%"y{[5E!* z 3 H&"!8#Y:, . ^ ++N,=1&3h3 8 <0 (  U,u.#"#".54732?6325#"&=4/.#"&#"&546326325!5!>54#"&5473723!32654#"'632#@!L'F:.EG 8356$, ,<!8QI(8#%"y{[5E!*3C =f*233v& D4%0 ,<)*2:, . ^ ++N,=1&3h3 8 <0 (   z 3 H&"!8#LT6.B&54>326325!5!#>7#"&'332>54'#"5&#".#">$$3 4"(/& +"OzCRs9>-<)&:M8&)+#$G( " C #*/)$Y33 :<[rSk$&-#3,$*@i>?$7Y.b.#"#"&54732?6325#"&'332>54'#"5&#".#"&54>326325!5!#>7#@!6K\.9S29+,Rs9>-<)&:M8&)+#$$$3 4"(/& +"O33r&LA%0 *32+Sk$&-#3,$*@i>?$7( " C #*/)%Z33 :<[PF8.P32654&#"&5463254&#".#"3254'7#"&546326325!5!##".'NM8F40)H5 /+3''=. 1-=C0; .d?gQ326325!5!!67ge.&)+#$$$3 4"(/& e,.R]b[2|>?$7( " C #*/)%Z33!P`N.HM25!5!#632&=656=4'#5./75.#"'.#"&54>326: : ."332>7&#"3d/+3''=. 1-=C0; .d?3# Z#' # 3'C@"(D!/&9-%C 1 F33a ' $)E]  ,.Q&'.#"""""&54632632&/#5!!3273#"'73254&##5./67d--*"(:-(69vK ;P$ 5 K:/,: %kB-/6-,=0#%33*8&1,'aN %51 &$ 1 #2>ZFFX %.n.#"#"&54732?6325./6?&'.#"""""&54632632&/#5!!3273#"'73254&##E  LZ.EF46,: %@--*"(:-(69xM ;P$ 5 L:32(M@%0 ,<)+5FX %3B-/6-,=0#%33*8&1,'aN %52&$ 1 #2>o.I%2#53##54&#"3".54754&#"4&#;27#"&46326325!5!#84B3Q#    '@'." 0&;GG;1.+&S )5733t6? (!Y&&3))90QR0+ 33.I%25&#".#"&54>326325!5!##5&5&#".#"##"&546326*&)+#$$$3 4"(/& O3 */",%/8C(.3>?$7( " C #*/)%Z33W) B.9+$F7!.?H%"'.'27#".'#"'72654&#'326325!!'2654/&'\ %# % 8- '/ #!7l/"C  Y{+51-S%G34 0 +#,1 &30/IK[3=#$ 0]3* G.[f4.'#"=&'327#"&'#"'7254&+'632>325!!32632.+732>'2654+"'` _0N)&%  - ):(  W&2     &N.?b>g6Q"9mCP6D3*AYwKG% +11 &' ,A* N3< M81^(/K$Aw2<J(!-]32654&#"&5463254&#"327#"'#"#".'7&'7;>54&#"56;263533#Q&54&#"56;263533##5&#".546324&#"327#" 4#I5N3QQ3=_%&+>,.H$P%!, <X')-1=8k_  $W3P *3&$B21s/6 +oS%4&#"327#"'#"'7;>54&#"56;263533#2#53##54&#"3".546P%!, <" 4#I5N3&&54B3Q#    )5r/6 +:')-1=8k_  $W3:733t6? (!"\726324&#"327#"'#"'7;>54&#"56;263533##4'5&#.#"""&5461) (P%!, <" 4#I5N3QQ2- .$# .;C1s/6 +:')-1=8k_  $W3 > ,4/7,$F.8@327'654.'"47#5!#'2654&+"#5.+'767&x1b1a4JPc])/$  2'[A!)7\$ E%Y( MK$33+## P:Q(#;GN70$0#)#g.JT]"&547#".547#5!!>32'654#"#5&#"#".473263254'326?'654.'"1G$ $4 '' !0#"1230< S'-()T 0, ! a1WI # ,K$33+9) 8-##B2* 218#9+01S1':K -A*3F31B 6 5 +o< .'Fm'<@67'&/&'#5!654'"&5473723!32654#"'632#"&'.'7#')=[3G"*`4B0;c %!".:c4.r=Ũ4tG5/  3 1 ?/). D836C$"1'6vS %6Vgh'$U]f.#"#"&547326325#"&547"&547#5!4#"#"&547326323#32654'7#4&#"6'327CPLZ.DG<46JN*3^B<:NWJ0 zSE5g~M[M8,u#=3!N! !0"c' M@*+ ,;) ++3&:K37@+3F31<  4=:35'N6H"#9+/M +o< .'jm'[_.#"#"&547326325#"&'./67'&/&'#5!654'"&5473723!32654#"'632##B   L[.EF 046*+.r=!)=[3G"*`4B0;c %!".(!32va'LA(- 1 <) + %6V.5/  3 1 ?/). D836C$"1'+b'iT1;G654'#4>7'&5467'#5!&5473##"&7&/62654'  D%,;\P6&+   )>0cGEW;9)<&7F<&:3|1 )&N?3]G#x@TV6\8!q.$:AE%"&'#5./67&'#5!!>32'4&#"'67654&#"32%&'5(.g3AcG*g-~"# ,<+.1'-P$ D20f".H;0{UT]O$@\H:%R#A33%  >-5%13gh3. ( FDKG(>+7qc#ws IN2767&#&#"327'654.'"47#5!632533##4/.''654&#"#".%67#c # 3#2$ ?1b1a4F3VV3 $%-V) $" ,+2&(!B%Y( MK$3 E3:. "&!$ (5 ,y #sGT\ej.#"#"&54732?6324/.''654.#"'#".547#5!632533##2767&#&#"327'654.'"767#F7LZ.EG  38$%-X* $4F3UU30)3#1% ?1b1 '2(M@!4 .<)+). "'  )7 ,K$3E3(82&(E%Y(  .D27'74&#"26"&547#5!!632#"'732654##5&/67'x*\' )> :Ahq)diG4Ke$!  3>(a8^Nl>.=&7533#&(4#>">>E:%0 ;PnAW6=&.KS^.#"#"&547326325&/67'#"&547#5!!632#"'732654&#"#27'74&#"26wCNLZ.EG 8 46=(a8?:Ahq)dgH6Ke$!   2( M@!4 .<) +*V6=&=&7533#&(4#> @>E:%0 ;#/Nl>.:.4A327'654.'"47#5!##54&#""&5463&'#".7#x1b1a4lC3]+ '*5&3: $/%Y( MK$33oZ()!((- ,-<  3+#oR.)04%#53##54&#"3"&54675./67&'#5!#&'5y12C3Q"  *BdE*g-~"!3I;0|UL4433t6@ (&# ]G:%R#A33(?+7qc{}.I3254'"'3'2654&+"#5.+'767&'#"&'6?32654'4'#5!hVG?8&h8$=9)IY]&7  2'[A!)CO?"<8  $?E",l$H8$"5 N7P(&4GM80$:Q3  @*33.T^%&5467&'#"&'6732654'#5!#>32'654&#"#5&#"#".5473263254#"'3254'"'$1#."<8  ))!0#"231;V%7 (+2R 1,%C8$= # !H?3!3.33"5/ 8-#B2* #3*)A"8; /I$H8$v}.RXb.#"#".547326325.+'767&'#"&'6?32654'4'#5!#'2654&+"#3254'"'h:B/.) >>2,2'ZA!)CO?"<8  $)IY]&7  3VG?8&h8$=T' ;(*+ *;) +EN70$:Q3  @*33"5 N7P(&4IE",l$H8$S L254'#233##5./2654'#"&5473274'"&'#"'7327#5!2'!]  z*?>X3ll1:@g,Hd=A-*-  K10 <"1% $ ?2)>'   ,$C=W3&/?')I0&J 3/6::!)n3EdI'KS%2654#"'632#"&'5.#"#"'73267.'5#5!467474#"&5473723!25!6?a*/6a6 +4-!21@,%. B_2[8E!*a3DC '1`$RK&"!<9Z!-?4?4jOCK7%3 4 <1)  / C73n=EoIC$Y4&+3223#32654'7#"&54>7.'#"&'6732654'#5!4#"#"&547326%V9#=CE5g~3HH38+v#7.'#"&'6732654'#5!4#"#"&547326323#32654'7#4&+32EM/E#-EG 8 38@<*3 )/';"<8  #:NVK0 zSE5g~3HH38+v#=33 $V9#>c' ,.(- ,;) +3&!#=*3!A) 3F31B  4=:3#B419#9+/&%M+$H9*.>G#".'732654&#"&5467&'#"&'67326=.5#5!!3254&#&#"dT7&'#"&'6732654'4'#5!##3254&# JO+!%6b?(3-5N*5I41* +"2"<8  #7W&$"43f9#=B  >!)0NdZ ;PA.@1(7!& #,F3!A)33"#2 UK+$H8 ).JT"&5467&'#"&'6?32654'4'#5!##5&#"#".5473>3254'3254'"'`C$;'6"<8  $7W$30< O $7 ,5*#<(8$=EH%"#OH3  @*33"1 53*!/) 2:;&31$H8$h(.bk.#"#".54732?6325#".'732654&#"&5467&'#"&'67326=.5#5!##3254&#uD6/E#-EG (38)1[?43\>&%5I3$)2(5"<8  $7W% #">3[9#=c',.(- ,;)+b 2HZG S"@1(7%! E3 @* 33"!4 UO.$H8 *q&.7A%#&/532>54#"'67&'#"&'6732654'#5!#'3254'"'#J1|"v54!$0>!`G1z/"<8 #7W.&?8$=+3#B#m3,"I] |?3!E# 33"%7#$H8$. ?2654'#%3267#5!##5.#"&546325.'&'+"/P ' 4A-5 , /.;6325.'5#5!##5&#""&546325.#"#"'7326s@5"'2 B_853=_%#.>,-H% :(20A,-84EK7"33O *1)#C21N4?4j" Es Y2767&#&#"'3254'"'3#67632533##4/.''654.#"'#".'#"&'6?32654'4'#5!0)3#2$ >8$=`' B!F3VV3 $%-44 "<8  $7(82&(($H8$)E3:. "'  )(3  @*3sZgqv.#"#"&54732?6324/.''654.#"'#".'#"&'6?32654'4'#5!632533##2767&#&#"'3254'"'3#6E  LZ.EF 46 $%-44 "<8  $7!F3VV30)3#2$ >8$=`' 2(M@%0 .<)+). "'  )(3  @*3E3(82&(($H8$scq{%63254&/&''654&#"'#".'#"&'6?32654'4'#5!632533##4'5.#.#"""&546322767&#&#"'3254'"'3#6 ( %&14 "<8  $7H3UU2-1$# -3&'#".'#"&'6?32654'4'#".  8$=YC4\+ ' )(% / 4 "<8  $".0< 3$H8$33oZ (+" /!(3  @*o.C6325#53##54&#"3".54675.#"#"'73267.'5#5!#s@5"'2313/B3Q#     :(20A,- B_8!84E:433t6? (!, N4?4j" EK7"33.LV726325.'#"&'6?32654'4'#5!##54&#".#"""##"&5463254'"'10!2 "<8  $7W33** $.9B8$=6 '3  @*33"<(  %*(-7,$F$H8$.N6325.'5#5!##4&#.#"""##"&546326325.#"#"'7326s@5"'2 B_852- 1#!-.#""&546325&/32>54&#"&54632&'#5!K '7!&"/>,-H%z_:&: M$B0d/6lY&&3|"8 *2)#C21Tc09!(# $<#$*9+KZ9o2[p!*33I..22'654&#"&/32654&#"&546326%5!0:.;&A|Z&[,CXK&1++ Q?0a 5'v;1$:*.#a!Yr!G9!@3$=4 %4EF*-V33./=B4'#5!#2?&547#5.#&'>354&#"/46725'.5#7#3f%X9 0D3O+$1J5-+B?YG+DR1!#33]*/On=|6E!+;( h9 ;M52*=.O;27#"&'&/32>54&#"&546326326325!5!##4&#"4&#|/'-@ %CY&_:&: M$B0d/'V":0/+&+VN3@'." %*801+"[p!H9!(# $<#$*9+K4''0+ 33Y&&3)J.FJ%25&/32>54&#"&54632&'#4&#.#"##"&5463265!"z_:&: M$B0d/6lY&&2-+"#! .;J(2( Oc09!(# $<#$*9+KZ9o2[p!*7-  B"07,+?033W~P[g2533##&#"32?632'#".'32654&'#"&=#5!#26754>4632#"654#"+1;K-2AB3S^*= # ,&D(#p[=b7'/Z4(-CP4 %  Y&7, "b,!/0HP3 `:  7(>'WjIe[&$[H4 7!5+33" b (< 2i^ 7hT.,39.#'67.+"'675!5!##"'72>54&+#/P+!AU(w2zw9F0/")( \23)L Kf!*0D,4U6`*.33.(L1#B%'7L2JX/W)  +{1.#'675&#"32632'7674#"#"&54632533##yQ,!LeV^!F O",E**8+ N  WC9M.3CC3 *0L2o7#)"!E( 6)%1^5HM3N.,5.#'67./7##"&547#5!##27#OQ,!ES"q=N&HO=3& !&')3  J *0E-0B (R8,33SE $ #a0    U.#,%.#'7&'#5!!#'2>54.'$  JP,! c=2-* 33#bDLgC   >!)033=&(4GYi .EP&'#5.#'67&+532654./#"&=#5!!;26722654'#"'\# J3%80?R/."3O+!B]}GVx _104*= "12 NC1      <(3/)$3#'0F/U4[2@].33 @ZK&7a.M.#'67&547#".'32?#"&'&5332654'#".547#5!!32?#Q,!DY #0C( $*%*`4H3m9"@(1'2KzK9# 3!)0F../]X ! B!-"$,!@Rx+F! c6'$&1/a1337'!>_;HTZ'@7523!32654#"'632#5./7.5#5!654'"&5473G$B>.I/;d&!"-33  !&d[[3G!*a!#/%l32533##dQ,!MdY$-H, )F>)3& 3__3 *0L2c+w4<>3^+1:('c3.U.48%.#'67&'&/332654&#"&54>32#5!`JQ,!-313XYBLF57 + 8&Kc503v  >!)0." V\IFa!#'" '}]Ai33[3833##5.#'67./67654&#"32727+"&54624\%jI4QQ4P,  (V~Q2JL8P)YX3`3 *0@*=@ 8<"*$3- 2DJe&.&,"##5!!632#7. /6754&5'g3HLP12  .cRUK>}* 33p   +R#E 9&-5 .5:5%"75!##5.'#5./7&54632&7675#0{&]#yg3C3GkMp^),*' yU-J1&3gw: O4  2 DJ3X/{ VGK)[F=8Y323>D'@s$k>j3  !$z 94 ))&)H2 #/">33-&5"*!L, !2% ,,.$,767.#"&54>325!5!##5.#7JfA&'"!4#4,b3P3Q,# KEN0?C , '&D/F"f333 *q    s%3.#'6754/.''654&#"'>32533##2767&#&#"P*!Md $%.# n6F3VV3 # 3#2$ ?"(0N0F. "&!$ $1PE3 ,+2&(!. ).5.+'675!5!##5.'#675s.{%]U9!~f4D3H''%3on: M6  1.6b++33X/z $X,JL+YA.=A%4632&#"3267#5.#'67.'32654'#"&'5!  J)4! K%3!%(#2M,!'*:_B*9%T,P"5R3OXG   #00:2G #!9 &R3!)0) LukDQ?3Z733.<7574'#32%#5!##5./67.#"327#"&54674G$Ex# '*:ea3  !'l$c +& #/&4,#)3309;"*#CG3*'(c .BGR.#".547326325./67.#";27"#"&54674'#5!##574'#32^;V%B6+@D7.4  !:Y$c  ,+ "a33kH#H{#  V:g' D5'/ /:, +1!*/7G3*#(-3309B.T"0)4, K 9h.',5.#'6754&#".547.'5#5!##'5x=79.S+!Jg`#B2U=4>NB93hO/82N +0L1C+P,L/&!"33m+}. J%55>754&#".547.'5#5!##5.#"#".54732?6325.#O/=79.0O2`#B2TB. ALG83B!6/E#-DH (47R,+}73N27 C+O,G1$$"335',.%0 .<)*+, .6.#'6754&#"4&#;27#"&46326325!5!##Q+!Md@'." 0&;GG;1.+&S.N35 *0O/QY&&3))90QR0+ 33;76754&#"327#"'#"'732654&#"5263533##5.#IhP%!, <" 4#I5N3QQ3Q,EM1s/6 +:')01=8i_  $W33 *&.*2757#5./67&'#"&'673265#5!!3254'D'@33  !(kK$"<8 " 78$=#/#"<"*$B]3!'O/33$H8".&/7675.#"#"'73267.'5#5!##5.#6325Ih :(20A,- B_853Q,@5"'2EM12N4?4j" EK7"333 *84E. 75%5!##5.#&/32>54&#"&54632675.{%]Hf4H"^Y&_:&: M$B0d/3gnq: M6 133X66 [p!H9!(# $<#$*9+KQ5L+'.26%.#'67&/32>54&#"&54632&'#5!KJR+!EZu_:&: M$B0d/6lY&&3  >!)0F/X,9!(# $<#$*9+KZ9o2[p!*33_#".'#5.#"#"&547326325./>54'"&547326733#3274#"3"54632K+( 4CQLZ.EG 7 4686q4)$1( ,(54'"&547326733#67O/_4CQLZ.EG 7 4686q4)$1( ,(?>54#"&546#0%s/O;5SKI/ &@b8M 6$,E-/()"9$ &[OYY6#80B:[o ;$YkGO *"%Q[%`;+1># 3 .F{`"&'#5.#"#"&54732?632&#"32632'7674#"#"&54632533#3274#"3"54632KT)3CYM.DG28V^!F O",E**8+ N  WC9M.3  6 *>0#$,96G##6'W6), *;)*<7#)"!E( 6)%1^5HM3G,X'$;(<{{W%&=47#5.#"#"&54732?632&#"32632'7674#"#"&54632533#67=/^3CYM.DG28V^!F O",E**8+ N  WC9M.3@7CB _! 6'W6), *;)*<7#)"!E( 6)%1^5HM3#`%+{j"&'#4'5.#.#"""&54632632&#"32632'7674#"#"&54632533#3274#"3"54632KT)2- .$# .;C/1) (V^!F O",E**8+ N  WC9M.3  6 *>0#$,96G##   ,4/7,$F17#)"!E( 6)%1^5HM3G,X'$;(<+{{a%&=47#4'5.#.#"""&54632632&#"32632'7674#"#"&54632533#67=/^2- .$# .;C/1) (V^!F O",E**8+ N  WC9M.3@7CB _!    ,4/7,$F17#)"!E( 6)%1^5HM3#`%.|.#"#"&=7332632'&547#".'32?#"&'&5332654'#".547#5!!32?3274#"3"54632#".'A t"?O2)/!y '$#0C( $*%*`4H3m9"@(1'2K(K9#  )7 *>0#$,A4   --4XA ,F4 2H']X ! B!-"$,!@Rx+F! c6'$&1/a1337'!#3X'$;(<-,Q ,M6A.q.#"#"&=7332632'&547#".'32?#"&'&5332654'#".547#5!!32?67&/&=47A t"?O2)/!y '$#0C( $*%*`4H3m9"@(1'2KLK9#  ,8/ ]--4XA ,F4 2H']X ! B!-"$,!@Rx+F! c6'$&1/a1337'! #`% 1T .KE/! K5A.IM#"/#4#"#"&547372&#"327#"&546323274#"3"546327!5!L*: .\ =K, V'&w !)7.  5* >0#$,#97F/r]I4<*3$#m'$#*8. ) 4X'$;(93.<@%&/&=47#4#"#"&547372&#"327#"&5463267!5!b/ ^.\ =K, V'&w !)7. @7?D>G .KE/! r]I4<*3$#m'$#*8. :L3h#"/#5.#"#"&54732?6325'./67654&#"32727+"&546233#3274#"3"54632K+9 4CLZ.EG (46A1]A,p'@7) ? (V~Q]$iJ4 )6 *  >0#%,94I/5(M@*+ .;)+BF11 8;"*$3- 2DJ=7Q(ZX3 3X'$;(<{[%&=47#5.#"#"&54732?6325'./67654&#"32727+"&546233#67=/^4CLZ.EG (46A1]A,p'@7) ? (V~Q]$iJ4@7CB _! g5(M@*+ .;)+BF11 8;"*$3- 2DJ=7Q(ZX3#`%.B%&#"3262&'#"&4632654#"#".5467#5!!32>F$ $%3@-   (0M9<("/24:3;-,9 !+0&0\LD4WE BA9908?JV!?-:#&K22O&7(/(.T#"./4&5&'#"+".547;26;2&547'#5!!673274#"3"54632A4)  .(5 P '0!1-$ i#* d.e,  6 *>0#%+9,Q1C^P @*/:!3:jS2"33!F+X'$;(<.E%&=47&'#"+".547;26;2&547'#5!!6767S/[ .(5 P '0!1-$ i#* d.%e, +8CB b! 1C^P @*/:!3:gV2"33! #`%5W%"&547326325./7&54632&#"75!#3274#"3"54632"&'#5.#"yyUDUF`.EF 3 :FkMq_<+( $y$  6 *>0#$,KT)3D = $#& $k>j ,-)=52$.6&6 o& )6')H2 >33,'2 (!4/&QE'+H,' " Q !2!+,,.=74632'.#"&54>323>54'!5!#&#"327'#"&;,  :1 ))&)H2 $k>j(#%" 'o"*E(39- !2% ,,>33-&> S'(.+4'!5!#'7".#"&54>323>$k>jd3b:D  ))&)H2 >33-&1,G (J8g,, !2% ,,.G7467&#"&54>323>54'!5!##"73254'#5>54&#"3&80?' ))&)H2 $k>j!D"4ZIj0(Wp2 89,O*51]$? . !2% ,,>33-&($0426BGC) 1(%'4 Q.c#"./&'&'#"+".547;26;2&547'5&#"&46325!5!!673274#"3"5462$K*)  /'5P &/!24 i , d.<6!(9(5<fe, -7 *>0F-96G5AUY @*81!3:b[23vR3L33! 3X'$;(: .T%&=47'&'#"+".547;26;2&547'5&#"&46325!5!!6767/\ /*2 P(. 24l$) d.<6!(9(5<!%e, +8K: d! 4@UY @*81!3:b[23vR3L33!  sXf#"&'#5.#"#"&54732?6324/.''654&#"'>32533#3274#"3"54632%2767&#&#"A4*)3C  LZ.EG 46 $%.# n6F3 )7 * >0#$, # 3#2$ ?9,Q##5(M@!4 -<)+). "&!$ $1PE33X'$;);Q ,+2&(! }sM[%&=47#5.#"#"&54732?6324/.''654&#"'>32533#672767&#&#"?/W3C  LZ.EG 46 $%.# n6F3C- # 3#2$ ?CB _! o5(M@!4 -<)+). "&!$ $1PE3#`%# ,+2&(! scq#"&'#4'5&#.#"""""&5463263254/.''654&#"'>32533#3274#"3"54632%2767&#&#"A4*)2,'(#-0#$, # 3#2$ ?9,Q## = &*/6-$F1. "&!$ $1PE33X'$;);Q ,+2&(! sXf%&=47#4'5&#.#"""""&5463263254/.''654&#"'>32533#672767&#&#"D/\2,'(#-0#$,A4))4#:/ #*.) H''2" H,6`-+333X'$;(;.,Q"!5 ;'+* (&3{$`!k.?H726325.+1'675!5!#67&=47#5.##".547  8"zqA1/Y4#:/ #*.) H''2" H,6`-+33 #`% 1T d! p5 ;'+* (&3{$`!N.Q5#"&'#4&#.#"#"&46326325.#'675!5!#3274#"3"54632g~E0oA4*)2- 1%$ .;J(3' *9!~g  !6 *>0#$,:$e8,Q##<)  +607X>0,.6b++33G-X'$;(<+.GP%&=47#4&#.#"""##"&46326325.+'675!5!#67/]2- 1%$.;J(3' *9!~D"TH''%1T d! <)  +607X>0,.6b++33 #`%$X,.RV#"/#.#"##".547;725#"&54632&#"32?3274#"3"54632%5!A49- -!  9;$1C1*m7aD0;3% 9/:81 )6 *  >0#%+79,Q/#"J5214B "U>0!+$+ 38883X'$;(:33.EI%&=47#.#"##".547;725#"&54632&#"32?675!n/^- -!  9;$1C1*m7aD0;3% 9/:81A6zň1T d! #"J5214B "U>0!+$+ 388E-Y"f33=.PW#"&'#5.#"#"&5473263254&#"#"&547.'5#5!#3274#"3"54632%5L)(*3C YM.EF :56`#/*U)D AML  !6 *>0#$, ?59.97F##;5(W6+* *;) +5+P,],%""33G-X'$;(<73N={.FM%&=47#5.#"#"&5473263254&#"#"&547.'5#5!#675=/[3C YM.EF :56`#/*U)D AML?5T?59.CB _! 5(W6+* *;) +5+P,],%""33#`%f73Nsx"&'#5.#"#"&54732?6324/.''654&#"#".#";27""#"&546754'#5!>32533#3274#"3"54632%2767&#&#"4'#32KT)3E)LZ.EF46 $%!/,#G7 *& eM#F3  -7 *>0#$,3#2$ ?[# '*:96G##5(M@%0 ,<)+). "' $":))3+'!-33 %E3 3X'$;(9O)!2&( 64,#)sl{%&=47#5.#"#"&547326324/.''654&#"#".#";27""#"&546754'#5!>32533#672767&#&#"4'#32/W3F6YM-DH :38 $% /,#G7 *& eK#F3E+3#1% !?Z# '*:1T d! o5)W6%0 ,<) +) * "' $":))3+'!-33 %E3#)!2&(!54,#)O..4@#"&'#5.+"'675!5!#3274#"3"5463254632#"&6A4*)3>$h )7 *>0#$,09twF&9,Q##Y/4^6&333X'$;(<- \'"'.#)5%&=47#5.+"'675!5!#67%54632#"&/X3>$@B/~9twF&CB _! Y/4^6&33#`% \'"y.%#".'732654'#"'732>54&'.#"632'>54##"&54632754&#".#"3254'7#"&546326325!5!# P+@uL.3Sz7%  #;%!, 4B  H"%!/+3''=. 1-=C0; .d?1d'  ):X}r% Ef$ - @I'D/   "C  "IDF(D!/&9-%C 1 F33DaJ[#"'732654+563632>76?67#"&'732654'#"'673264'.'32>7#"&(  `   M%%- )E$M9m%2Q!?"  '1"    1 G,A#=! ~"Y/Tj&/ *,d%P   ( + o#"&'#5.#"#"&547326324&#"327#"'#"'7;>54&#"56;263533#3274#"3"54632A4*)3E  YM.EF 2 56P%!, <" 4#I5N3  !6 *>0#$,9,Q##5)W6), .<) +Ms/6 +:')-1=8k_  $W3G-X'$;(<c%&=47#5.#"#"&547326324&#"327#"'#"'7;>54&#"56;263533#67J/V3E  YM.EF 2 56P%!, <" 4#I5N3C,>G ^! o5)W6), .<) +Ms/6 +:')-1=8k_  $W3x#"&'#4'5&#.#"""&546326324&#"327#"'#"'7;>54&#"56;263533#3274#"3"54632A4*)2- .$# .;C/1) (P%!, <" 4#I5N3  !6 *>0#$,9,Q## > ,4/7,$F1s/6 +:')-1=8k_  $W3G-X'$;(<n%&=47#4'5&#.#"""&546326324&#"327#"'#"'7;>54&#"56;263533#67R/]2- .$# .;C/1) (P%!, <" 4#I5N3A5CB _!  > ,4/7,$F1s/6 +:')-1=8k_  $W3#`%serz#".'#5.#"#"&54732?6324/.''654.#"'#".547#5!632533#3274#"3"54632%2767&#&#"327'654.'"767#K*) 3F7LZ.EG  38$%-X* $4F3  6 *>0#$,0)3#1% ?1b1 '96G5(M@!4 .<)+). "'  )7 ,K$3E3 1'X'$;(0)3#1% ?1b1 'CB b! r5(M@!4 .<)+). "'  )7 ,K$3E3#`%#(82&(E%Y(  . FP73267&#"&'#"&54632765'&5&'#"&'6?32654'4'#5!!3254'"'(# 8-$A71%-7'9X)"<6  $78$=  ""1 7);(&HM'-"$-' "! j3  @*33$H8$1.9C74632'.'#"&'6732654'#5!#&#"327'#"&3254'"':. #7"<8 #Zz%##" 'o:3#8$=&42.'3!E# 33" 4 X6G$H8$6.%/?&'#"&'6?32654'4'#5!#3254'"'͑Y)"<8  $7W)!d8$=j k3  @*33D6,G~8$H8$.MW#".'73254'#5>54&#"3&5467&'#"&'6?32654'4'#5!!3254'"'#."4ZI.PDM0)Wp278-F )2]17/"<8  $78$="/ ,527B%AYD) 1%'4NG >3  @*33$H8$\.Yb#"&'#5.#"#"&54732?632.#"#"'73267.'5#5!#3274#"3"54632%6325A4*)3C  LZ.EF29 :(20A,- B_8 )7 *>0#$,@5"'29,Q##Z6'M@*+ ';)* N4?4j" EK7"333X'$;(<84E\.NW%&=47#5.#"#"&54732?632.#"#"'73267.'5#5!#676325U/[3C  LZ.EF29 :(20A,- B_8c@5"'21T _! 36'M@*+ ';)* N4?4j" EK7"33#`%f84E;su"&'#5.#"#"&54732?6324/.''654.#"'#".'#"&'6?32654'4'#5!632533#3274#"3"54632%2767&#&#"'3254'"'3#6"KT)3E  LZ.EF 46 $%-44 "<8  $7!F3  6 *>0#$,0)3#2$ >8$=`' 96G##5(M@%0 .<)+). "'  )(3  @*3E3G,X'$;(8$=`' >G ^! p5(M@%0 .<)+). "'  )(3  @*3E3 (82&(($H8$6s#"/#4'5.#.#"""&5463263254&/&''654&#"'#".'#"&'6?32654'4'#5!632533#32>74#"3"54632%2767&#&#"'3254'"'3#6K*; 2-1$# -0#$, # 3#2$ !?8$=Z! 96G/ % +5/6-$F1'"),%(3  @*3 E3F,'#'$;(9O ,+2&(!+$H8$  sx%&/&=47#4'5.#.#"""&5463263254&/&''654&#"'#".'#"&'6?32654'4'#5!632533#672767&#&#"'3254'"'3#6/ W2-1$# -0#$,@5"'29,Q##:*  +6"06-+?0N4?4j" EK7"333X'$;(<84E.Zc%&/&=47#4&#.#"""##"&546326325.#"#"'73267.'5#5!#676325X/ ^2- 1#!-54''4&#"3&546327%5!w=3+!*W "h~G29S&+H$+#!&A[G6H&B225GDi&R $j|"F"!0&8%`'2-$02T5FKV!_33!.6:%47""./32>54&#"&54>32632'&5!  o\&D?[>&: L%/,#<(6k :+N@/L$Xs!U?!(# $=4!3 "*W6 39OW ,33N.,08#"&'#5.+'675!5!#3274#"3"54632%'5A4*)39!~g  !6 *>0#$,9V$ %9,Q##Y.6b++33G-X'$;(<7@>e X,&.!%-%&=47#5.+'675!5!#67''/X39!~?B/9V$ %>G _! Y.6b++33#`%@>e X,N.,4=#"&'#5.+'675!5!#3274#"3"54632.'75A4*)39!~g  !6 *>0#$,`:,n6H''%9,Q##Y.6b++33G-X'$;(<&Q . I7Q$X,)."*3%&=47#5.+'675!5!#67.'7/[39!~B?5`:,n6H''%CB _! Y.6b++33#`%o&Q . I7Q$X,.MQ#"&'#5.#"#".54732?6325.+'675!5!#3274#"3"54632%A4*)3C  /D#-DG 19:!~o 6 *>0#$,9V9,Q##4&,-&- /;(*%-6b++33X'$;(<7@.AEM%&=47#5.#"#".54732?6325.+'675!5!#67'A/]3C  /D#-DG 19:!~o6@9V$ %1T d! 4&,-&- /;(*%-6b++33 #`%@>e X,,T.*1'7675!5!##"'72>54&+#5.+"7zw9F0/")( \23@){({`*.33.(L1#B%'7LfX/JX/,w/'733##5./>4'"&5473267ZW$Ld3TT3:3:*4(%1( &'={({R5FaV3R,1-45)*%/DJ+,t{.'72533##&#"32632'7674#"#"&546WQ9M.3CC3V^!F O",E**8+ N  W{({5HM3`7#)"!E( 6)%1^,Q.*'727#'47#5!##5./7##"&3a& !&')3fO=3JN&H{({? $ #a0 133AAZ (R8 ,2 <F'7>32#"'326?#".'732654'#"547&'7&#"325k I4M.',59(#)\H>g@&3"5R0<3% =!o#>(5<$U{({TE)+) W<P-JcM|B @ykAE.0,"4!W>&1 5,. "'7%2>54.'&'#5!!#̦#bDLgc=2-* W{/{({Yi 33=&(0^,.9D'7.+532654./#"&=#5!!;26722654'#"'| %80?R/."C`z;GVx _104*= "12 NC1 {({ <(3/)$7='4[2@].33 @ZK&,.I'7".547#5!!32?&547#".'32?#"&'&5332654'zQ'2KzK9# 0 #0C( $*%*`4H3m9"@({({1/a1337'!>_;HTjN]X ! B!-"$,!@Rx+F! c6'$&,"+'7675!5!33##5'&'#5.+"7qpz63VV364?#q#){({a,+3@X3=$W2;V1,:H^'7#"&'#4&#&+&547;636;24&#""327#".546327>32'4&#"2654&#"53260g*\3B^#H}/69 ":, %n  "#! *5'2*,=35a.W83%'/{({40gBL3E9 C<9*#S x $ $>Ba1>-44'xE67!,3%,'5'723!32654#"'632#"&5#5!654'"&5473|6A/;d&!"-:c4,'d[[3G!*a{({\F636D$"1'6vS?'O3 2 ?/) .,T(4'73##"&54>7>54'#53&5472654'|/2Ư2@fHFV2 ʬP6&(:4I<"G0{({,N73Pr^HZD N=%3]G54#"'62|,'x 35% *>.9d{({?'33q 6Y1&"!=8[?,]('7327+"&54>32533##4&#"@, )F>)3& 3__3Y$-H{({5>3^+1:('c3W+w4,U.'+'7&54>32#"&5/332654&#"%5! + 8&KceT83XYBLF57v{({ '" '}]\|V\IFa!w33,]4'733##5./67654&#"32727+"&5462@\%jI4QQ4";,C&,n'B7)!> (V~Q{({S8P)YX3I% 58<"*$3- 2DJ,-.'7'&547'#5!!67d.Oe,.{({Lcb[2"33!Q~UY-,:5")'7"753##5./7&54632&U#yR3GkMp^),*' yU-J1&{({ DJ3VGK)[F=8Y325!5!##5.#"04#4,b3P3"4'"{({0&D/F"f33.:& ,  ,{s"0'7>32533##4/.''654&#"72767&#&#"] n6F3VV3 $%.% # 3#2$ ?{({O1PE3:. "&!$ 9 ,+2&(!,Y..'73254&##5./67&'#5!!6;2#"'q I<38b($fNr3>(69vK Zr8{({ #1?ZFA_ %M#6@33*8&1,'aNaP'% , .'7.+'675!5!##9!~A3H''%{({.6b++33$X,,A./3'74632&#"3267#".'32654'#"&'5!)4! K%3!%`K9bC:"9%T,P"5R3OX{({$#00):2G #!9 @s1Jm_:Q?3Z733].%'7.'5#5!##54&#"#"&5475@h>NB93`#B2U)D>=79.{({:&!"33C+P,],82N,J.$'767/.+5!##5.'-9Y KU?3)9?Y7;G&4{({9C 233LCR F7""5j, .''7675!5!##5.+"754632#"&G3>09twF&{({^6&33Y/, \'",.3'7;27#"&46326325!5!##4&#"4&#c0&;GG;1.+&S.N3@'." {({)90QR0+ 33Y&&3),<'7#"'7;>54&#"56;263533##4&#"327#"q1 4#I5N3QQ3P%!, <{({')-1=8k_  $W3^s/6 +,D.'7&'#5!##5./6&'5&r-~"F3BdE*I;0|UL{({C#A33@]G:%3(?+7qc{,. ,'76325.'5#5!##5.#"#"'7326q@5"'2 B_853 :(20A,-{({84EK7"33N4?4j" E,.#''72&/32>54&#"&546'5!|6lY&_:&: M$B0d{({Z9o2[p!H9!(# $<#$*9+K33,J.3>'7"&=#5!!>7#".'32>54'4632#"&-%. R(4wY=a9'3.EN#)=#(0 {({6(33X(p"YoIg]$TY2$6-2(+4 ,.!/'7%"&5#5!!>54#"'6324632#".#4Z.M#"(Lj!- {({/733h]d# "mL_-!,9.!-'7&+5!##5&/674632#"&xeU I3C,=,E$Q(/(" !%&{({K]23Lp/8B*5G# "fX '&,#. '7'.+'675!5!##9V$ %9!~A3{({I@>e X,X.6b++33, . %'7%.'77.+'675!5!##`:,n69!~A3H''%{({&Q . I7 .6b++33$X,W.=A'&54632>32'654&#"#5&#"#".5473263254#"753$i.$. +"0$"531;V$6 ()R 3)%Cͫ #3g;- 9+#B2* "2+)A(2  /H33g/2#".'73254'#5>54&#"3&54>5e"4YJ.PDM0(Wp2 88-F )2]$5)g9)327B%AYC) 1%'4N!1 a,"2#".'732654&#"&546s0A\G+N8,3 2L*+>*+3,M9AM*?L?DN64*!.BaR*%&54632#5&#"#"&5473263254#"]*34'2  )M.,#1',7)^6&)# C4$6 3+"(= *%&54632#5&#"#"&5473763254#"f1<31; :I,8'/='$C 2f142*W.2: ;(10I <.#4'!5!##".#"&54>323>$k>j6:D  ))&)H2 >33-&"E,, !2% ,,R&#"&546323#YId6(KE#3M.33e7 /J'69:~'.#'673#bF(B,D<Md33 ) 2L/0/N0!'56753#5.'I"5v0{33  !&, )L!!n?.'25#"&54632"2?#5&#""547326!'# '4##>U$-- ]_sX'. 0',/#Fk'.##"&54732?6323#R    %,1D.*"$ B 33`   O90% %(1  }*"463263253#4&#."##"K'3' (32-+F% .BX=0e7- C",/P#".'732654'""""'732654&'.#"632'>54##"&54632&25F43aF83 T$   #7$%%*+3 < G#&5Y2 !#@:WfXq# -(>IL. ".B  !J)cr23####5.#"#"&547326324&#"327#"'#"'7;>54&#"56;26354&#"&5463.#"B4]XGJJ33E  YM.EF 2 56P%!, <" 4#I5N6?HHiϑf,[TMG )7eE3b5)W6), .<) +Ms/6 +:')-1=8k_  $z"$%HSu$#!.'26=33265#5!##"'67%30" C3X 64YA &)+""*2 FHm33:Q'P w.5%25!32>3247#5!##"'6732>54#"#".M,/'04?;mwXbpYB2 &@28K %'3:P%7(/(D4=?S633]dP$CJV?@ ;.$/726=&#"&46325!5!##"'>73265(<6!(8)5<;X65YB %0"B3\(evR3L33:Q'P*2 GG:.>I%26=4&#"4&#;27#"&46326325!5!##"'7673265M%@'." 0&;GG;1.+&SW 64YB & {0"C2)+Y&&3))90QR0+ 33:Q'P  q*2 GGmEP%26=4&#"327#"'#"'7;>54&#"56;263533##"'673265P%P%!, <" 4#I5N3X 64YB &0"C2)+s/6 +:')-1=8k_  $W3:Q'P q*2 GGm. (,7%5./67'&'#5!##"'?3265&'533265 ,$<!!E7.(X 74YA '(90`G8p3/#C30.,8(33;Q'P ' 3$  \g|+2FHJ.1;H%26=#".'#"&'6?32654'4'#5!##"'>?3254'"'33265Z%4 "<8  $W 65YB G8$=90"C2\+ (3  @*33:Q'P$H8$*4DJ:.-6A%26=.#"#"'73267.'5#5!##"'?632533265U% :(20A,- B_8X 64YA  @5"'230"C3*,N4?4j" EK7"33;Q'P 84Eq*2 GHl^.4#"'&/32>54&#"&54632326=!5!# 65.#Y&_:&: M$B0d/6l8 C3wWt;Q' [p!H9!(# $<#$*9+KZ9D-GH33K.+%>54#"#".547#5!!32>327028K %';m-/'04?  KAhV?@ ;)T622S%7(/(D4+'#I$923#32654'7#"&54>54#!5!4#"#"&547326E5g~2HH28,u#218#9+01S1'$T>CL3F31B 6 5c"274'7&'#"&5463267&#"5 2  "(0M9<("/"& " $-"BA99:Q. $#"./&'73274#"3"5462%5!K*) "  -6 *>0F-$96G 4 3X'$;(:33.7&=47'6753S/c F@m1T d! 3f33.'6325#.'5#5!##5.#"#"'7326!)*03U/+4/"*)6% &9i;(33bA,4,Z 9 a.$6325.'5#5!##5.#"#"'7326`# #$I'o3)!("+ 0/gn+33<699I *Q."632.#"#"'73267.'5#5!#!)/"*)6%&3U/b9RA,4,ZB9;(33 "8e'^x1Ce'#5373264'7#"'&546;5!5!##"_SS);5EC96LxSkEI]Jl$ O)C$3n'1*iR^FI\Ie}II#F%"3267#"&5467'#5'%&'"'>325!5!'&54>32'"!!7'432+M(!'88OCF5(H+b"+SG?*.,8)D $Q|B-&#=8N50C )=ϛ9lM7 SDFH9H5$2 ; % JWH5J* -D_%"3267#"32>7#".547&5467'#5'%&'"'>325!5!'&54>32'"!!7'432+M  "88O#7( &)B=<& +5(H+b"+RH?*.+8)D $Q|B-& =8% <*7#5$%>0C )=ϛ9lM7 SCGH9H5$2 ; % JWH5J* -iL#53&54632'""#"&546;5!5!##"32632.'"'46322674&aaXN4*D!$R*O -s ZG i"0d-'D",,  )NZkM62 ;# F_v4`IIP; ,R?8"-[  8+|KZt#532653#"&53#'7DD%!'/D31E, $K=Ar$2??2 ;UG#532653"&53###53'73CC%-/FbE-4 MHM==Y@r$3?A1%H:L,043###53%7'7&54>212653"&537#533'=R7LMGM31c>L!&!-/FbE-3;CC'e%>BUHH7#*$3?A1%2@>5LJ'+'"#&'#%7'7&54>322653#"&537#53=D $R:- ?1c>O,7+,/D31E-*DCC$ %IY>J7#%1 $2??2&2@&Kk%#532653#"&53&54>32&'"7DD%!'/E21F- $wY 1#*4 #*(@r$2?@1 ZsI, : & #T*e'oE] e *@#53'3.547#5!##"&54654&#"&5475!"327"2USS W*8#P @cs6Ua."MV#C"$!?Q|Z)O R_5<IIp5(DwM-iOMOaEptKO%tQ&37#"32>7#".'47&543254&#".54oF: K?184H&#1! #3;=8( &)D<9%:/\"8p'@43F>7^HH8v#  L2' <*7#+=h=.Ma;"R"0'>aW<D23275#53###"'3274'4632.'#".547&54632'4#"6*SFeFGKNF>&)b  *&2@,61/eAH5=DG:587x%zHHO /O"* )-.4!@*HC1C3;C/59'1&"W8<463!5#53##!"32?2'#"54632327654#""&%!5!+/MMI{@D!'5$a5{w&'; 0!7kEy]HHr63, $X,tB .# rHg%.547#5!5#!5!53###"=[PMBMI)6T8 M84HoHGa4($w.Xg!5!53##5'%&'"'>325#vvNG+b"+,MHG՜9lM7 Se2;463273267#5!##5#"&547'7''67.74#"6dA58GF\S*#: ^(FG"`/6A)P"U&-8.$10880D4J'?9;8,X5EHHm38B6&"UAx7'9 D* ++(xe"+4>3275#53##5'7''67&74#"6w*27GE32&#"4#"6v AMFI   .9'M= B -=*27GEd'-#*,1*9- 1Z"HHC  >*Z.+  9F;7&29/E3EF1"%2++ * e-#53'-32654.'5!5!5!####".5 >>-"C =  GG# :(:i<#D8Y!$%# qHHc(6./XrX e13275#"&'5#5!!632'>54&#"#5'%p;,78jKe)E@(C 8>E!S3   G,!;I"//U@HHA5E "pB.k.'&  7"e153275#"&'5#5!!632'>54&#"#5'%#53p;,78jKe)E@(C vE!S1   G,!",III"//U@HHA5E U.k.(%  7HEe7275#"&'5#5!##5'%5;4;/Ke)GG-")7"/GU@HHだ7&e&.##'7&#"#"'.'732=!5!25!6FG2ZI% A2 4_%11 @_9 G<Cl75M $/Ju&58%X!',(.H24eoe,!632'654&#"#"'.'732=!5!o#)<\8/7X1 ,+ ?- 41%,8M9 G<oqS84X/1K=&',+5(6!N$p',(.He=#"'.'732=!5!!3632'>74&#".547B; /[,11 @_9 G<z$:\B=.!)2IBq158%X!',(.HHmUbk' !,'N$0>Z*e;7267!5!!632'>54&#"#5#"&54?.54672'&#""H8H6ZwC!Q/4FG% q@/.XEJ',06*HHNX<]|/g0 ,tM? A )M+Ab N 4$'<e"L"&54?&'&5732=#5!##5#"'32675#"&54>32&'"32675^pR\; .-MG  O% 5W4%+7C;L"2*6K( Aq?*$!< ","-HHx + 4='A#31D8&8 E4 "?e #7"&'47%.547#5!##5#".547"327!;p%<D?FG=K:0G 8,)Sx'#K)G>)OM? A5&HH # 0%: '#NI]e,0747#5!#32675!5!##5#"&'4?#"&75CaW%;(3f#0]FG py3N5C;GGQW@HHzM !>*:A Ue.7267!5!#632&#"#5#"'&5467672'&#""HF7D")4FGI*?36-DJ')?*HHMX t#-1B$B1 N  #&9*qe<#"&54>32&'"3267#".'&57326=#5!!#3267q7C;L"2*6K2 A?7^@7#; .J65W4&+1D8&8 E3#"<#4QJ0; ","HH224='@$e##"'&54735#5!L!45'9456Hye'"32767#".547.547#5!#; 8+'6J8yM0G 6,*Dd'#K)B'%%TF 0%:- R!&HHIze!5!47#5!#32767#"'&}CaW%;&039$ ~>4'&HC;GGQ*.I{Q"!e-32654/5!5!5!##5#"&'47%5##"'&5c = **GG&p # 9(`Y!0>7 qHH]N?=*(6//@t&e!5!32654.'5!##"'&5, =   #C4`HY!$%# H(6"=3?ze=72654#"#"&546;5!5!##"263227*"'&'"'4632)M#K,p#\@(W%4 &`+Mh!)'S6+3.^HHJ'Qz+N?-oX"Pe,!5!632327#".'#"'&'7232654&#"BG+FU!"#   bG47'2/V(469/3H$IMLF[&9/=,/H (e'463!5!5!###"&'4?5#""'&).8 f(GG]& r!M?1L\>1HfHH,@ ?)_@^O4^s)e@%2>75#53##57#"&'4?#".'3254&#"37".54632)+8=eGG32#ry3bA(*-7)B:-= U9HZ- 8(HH*OM= ?) :.CG x*5-/C&#0=`DAe/46;5!5!##"34'432#'#"&'4?".)B4G)B+ N_ rFl>& -=U^HH+ B001c9>6?) e(92'CgG"&'4?#".547.54632#4.#"6;"3275#53##57p+.,@ 5,3K)-EH  #(6"9.Cs`FG&&I G=)J.% 21T)1GI& ',$DRoHH##OMje ##"&=#5!26=#j#P>H iH&GV s.e7#53!5!463!##"&eek>H i.cH&GV sJe27#"&=#5!#>5*FKf6;;X*U@HH"/1e 7"&=#5!#632&#"#5'3275#Kf)GD/43G.;,78U@HH>L &/""//uXe%!5!0#"&54632&#">7'27'R EgYCJ9!  8+&HDZGEc N},4s)e$#534&'46323##"&546;54#"11 J2#$_ (+0H' 38 *Ga o !2. "qe46;5#5!#3##"'& (\|/0% HHGO7:e327#"&'22654'#5!#=6 <'RI>Q^~)57Cl'/W!)Ud7v`,"6$HH+e 7275#"&'5#5!##5#"&'4?;4;/Jf)GG%r7"/GU@HHN?@)[e43275#"&'5#5!!632'>54&"#5#"&'47%5p;,78jJf)E@(C vE T7.GG r .I"//U@HHA5E U.h1)$>vM6?) "e !5!".54632>7"'67&'"Zʏ4$JN9aJX@%<+)g A 1*+HH:=(Ad2E]F%Gj4!+.+Fbe.:!5!>32#"'#"&5463232>54&#"#.#"32>N'ER ?,\&'^ESXEVO:* #0  G3(SS( H"/aR;:$W\gSJi'L% <:  )@js+be2>#53!5!>32#"'#"&5463232>54&#"#.#"32>#bbN'ER?,\&'^ESXEVO:* "1  G3(SS( CYH"/aR;:$W\gSKh'L% =9  )@js+uXe!5!267#"&54632'&#"3'R (+0EgYCJ')?HW/UZGEc N  #&9e)#%72>7#".5467#5!&#"32>V+wN0,.'N>27+)_nB&' 6DT24'B,) /* HHLL&0  Je 7"&=#53#'327'Kf)u*;,<$ǥU@HH{*"/)e "'&/732=!5!#3#B#D"D1V[9 F<J*0S& 5U',(.HHGQe-3!!3. 54>7.543!5!5!#!"w+zC0E<5#%" 'Q32"&'46?&/"'"#".#&}}]\#9,06 p%?$ */$H 9@;l8/oI D!21 e-%'32##5#"&'4?#"&54632&#"?!5!7+"FG&rEcZB G9!  s*7U]E?>) Kf=Ec M} H2e<4&'463235#53##5#"&'47%5##"&546;54#" J20"eFG  p_ (,1 ' 390HHI   >( ~(a o 2.e $"&'47%46;5#5!####"&%5#r & (\FH_^3@)NN?X HHOnFe+##5#"&'4?#"&54632'&#"327!5!FG&rEcYC G'& :,C;]E??) Jf=Fb M  +6;Hbh 94#">"&'47%.''7&547>325#53##59.5 8q 4u.C$ 11"%:d\MFG&(#'    ?*Q H9c4B3 +7>.HHM@ e8ES2675!5!!632'>54&#"#5#"&547&54672&#"%654.#"6322675"'#G9G9W54vC"P-!5EG1MFg87XD 7+6&370"! 5E7C#G-N2$HHoGP58C):Xm+[,&hi0W9:>*A:[ F.$'/8' h}G$- ,"09yeZ#533254#"#"&546;5!5!##3262632#'2674'"#5#"&54632&#"3275.'7xOO`1o 7"4v%Iyz'<U8&W=%<3HP:.49CG40;J^&" 21200aP41MKV NISd+ ^HHK5?Q R%=*] T,# (  7K'SHH$%eP!/AYW$3X24F# ]&c6:'" 9 nxe48%#"'#"&54735&'73274&#"#"'&546;5!5!#!2632##53G@+'j&:f(0ig J*/41Gki6T :#HOOq 6lU.;6{.#-19+ZHHIsKmxe5H#53%46;5!5!#!2632#5#"'&'47.547&'73254'"#"&"3275#"';xOO=1Gki6 U ;"H|>E4$%/40ih!J-`o<O~e:%4'5%5#"'#"'732654#"'6323275!5!##5#"'732FP("^B_e/`036e-0U%3 O[JPQ5+7-u7"GH HHi+*4D81889e1H"34'432#'#"&547#"&546?&546;5!5!#32?3267'"'A(C#+J`%wDG< ,L6'5B4sG>E-BGS" "7\-B Ex*!B)0o%JhJ0!G1,T=U^HH< %*1 + dS0f&e0747&54;5!5!##"632&#"327432'#"M"FdK( # ##+?K A %;?F('(<\THH ' J)IJ31g#y)}eQ"34'432#'#".547".54632'&#"3>33267'".546;5!5!#O(B+ ')Ta&' %P:A-< > l ;.;^. Xz:A6u<x*!B/0"TY7 0!%H*.@#&;  +L@,eo &A>#327'".546;5!5!# (B+ 13Z&.:r";",A  /'8FXz;A6=KAx*!B00"TXQ_N +# a' "3 1ua%&@>$f7* !>^HHi fe.7"&547&546;5!5!##57##"672'"327FZLMLVGGMe -EFd/)G\#F95O6(^HH=25# HD$;e'3"34'432#'#"&547&546;5!5!#'&#"326)B+ 11S H<;F/B4G"$'$&/%<x+ B00[\3T.A(,=U^HH{N#%.8,e0##"327#"327#".546;5&'&5476;5!5!,x(5]1A).+2]1AVu=uN`9,jIM315,#Y:3'!Z;3N(L/3Q:./D7(&^H9,eA4>;5#".546;5!5!##"327#"32674.'7#"&)'91 ;oFa8,x(5]1A MUUPJ;9 EV2Y%#5 A+L+5P^HH#Y:39*. + +8Y9eP4>;5!5!##"32674.'7#"32674.'7#"&54>;5"".)(;/h!&P5 9$%DUJ;9 CY1Y'91DU:B%5 ^HHX ,%%;!9X + )8YI#5 M Fnke4%#"'#"&54735&'73254&#"#"'&546;5!5!#!2632#G@+'j&:f(0ih J*/41Gki6T :#Hq 6lU.;6{.#-19+ZHHIs9VeT3254#""&546;5!5!##3262#"'323762#"'732654#""&547&'7Y`1o=4v%IVW'<U8&iO7:IM8& 'C)1`1/@=4vaC1B NISd+ ^HHK5>]A5'1( NI4, f-8Y 9VeNW46;5!5!##32?62#"&54632#"&546;5#"&'732654#""&>54#".IVW M8&1Yb@G(1JfL\SB#\R1`1:5=5u*1-XHH   5:'A2? $*.<'/BqR6D'j\  NI#N)#!e7!3##"&'4?35#3.54>7&43!5!5!###!"w(  \#B>Y5+A"DQ7"'4?&#"I,6!5J#9,4)8U=XK  $dAJz(y)=B0S:J5  "U 6 2% > )(&- ?#56#5j5:J;)^H)4s8$:Y-@P? ?_.0ieIR#!"632'654&#"#"&'#"&54>7467.546;5!5!&'26I,6!cL :-0:8U;XI  ^%A#7T  $FW+A? > L5  - #> $6 6"$!#PH! ?!#;)^H /6!:9e.7##5'7&'"'67&#""#"'&/732=!5!!632FG5DZCJ[  A2 "D!1V[9 G<Dl鱉) J N$/0S& 5U',(.HeVT+e=2>7#".5467&'&'&'".546;5!5!##"34'432#" '*E*Q=D7 Xz:B4G)B+GTD6 <*?+:E $ &A>#=U^HH+ B008U;6$  8e#5327#"'&'515%1D!A<HH Eye+!5!47#5!#3267#"&'#"&%#327>cCzW&:&6j |>+B ZK1O\%;&03()HC;GG R`@{R*E@Q*"Qe-5#%##5#"&54?#''&/732=!5!5FGB%t#D4_%1U\9 G<l @ ?) S%*Iu'5U',(.H4Z"#&54>323###53654'.#"\H' / )R=*MMHMOJ#!$f#A,0/FN!HH &/D5":\E$.#"#.54>323###5H8K 0 !H"E/AnIMMHMeDi"!,  32:MIHHI13###53654'.#"#.547632&54632&#"}MMHMPJ# 3J,$2j P7$0 6-A HH &.E.:&<#J&F 67 ;Pj+.#"#&54>32&54632'"3###5W8Ye+7E"I 55[>4[: D $QMHMg0A)>,.!$+? l=E558 ; $F\GG4R6#5357#"'&'76#&54676323###53654'.#"AA>(M P#323###5BBN(M :%#8K 0 !H"E/?nJMMHM"WdxE"3(&YDi"!, 32;MHHH9^%&#"3###53&54>32r!/ SMHMK &@)-%+*((a((-HH//2% '/2h#4'&#3###53&5467632O8FFSMHMKA7,06s^Y:f/O3(HH#(7^':J<f#'&#"3###53&5467632`tޝN=DSMHMK9>DSCfI "I'HH)1X)X5=2327#"'3274'4632.'#"&547&54632'4#"6*TIONF>bc  &2A- 9@UeBD9 '/;597(O >+O"',. /UEIC1C.@+7N&1"  e1!5!463!!"32?2'#"5463232>54#"".Ep&y>D!'a5{w&B 3/ .!0O$HG5 4+j!X+tC )#FL e!5!.547#5!#"B[P)6T8HM84HH4(#x.:e!5!'%&'"'>32vvR+bOJ+SLHt9m&'7 SCO#La(14632732?#"&547'7''6?&74#"6J-8FF\S*!:)D9"_/4D(OEU.7V<9,!1809/C4J'@96<-JCj38B4&%VAy6")9-:,,, +Ke"46327'7''6?.74#"6eA57HF<(ـHU.6U8. 10880D4j Q7^HH #v# L / h>-=''%|-Gm8Kk#53/"#'&54>32QQE #*(:+.)*+I< & #T*;I4* e37".547.543!5!5!#!"632'674''7&#"pw%1:<-@,:=9*@!>?&R9A<:-4;0(@c3;7M <^HH 9!B-WO+::(,"&Kk&54>32&'"Y 1#*4 #*(KsI, : & #T*!.#'#73^{aCҔ Q ###53'#532673#"&53MGN8YY1+5=]BC[<+(HV.*CTVA!, M '7###53[TZpMHM\T\H&547632&'"###53KX($9%0 $SVMHMfpI1 ; % JXIH'?'"#'&54>32###53C32&'"3###53654&#"#&eOJ= I/&4AMMHMOR= / /N)0W,(( ; I>%HH >N+;4 {1#534>32>32&'"3###53654&#"#& QQ%K2J= H.&0AOOGMPR= / /M)J)(0 ,)' ; I B%HH@L+;4|Kt#53#'7``FK=[;|K(t'"#'&54>32#'7(D $R9,-,7)tK=% % IY;H5$2 ;|K*t#53/"#'&547632#'7*QQC!%S9+*%$8%qK=K+ $G\:B=2 ;LL #53#%7'7``Z?1c>[ޚ7#LL='"#&'#%7'7&547632=DD3:+ !?1c>W %%8%$ Io5L7#"2 LL=#53#%7'7&54637"#/=bb?1c>MK&II2 ) :+[њ7#:B: Ca2 U&54>32'"###53'73Y 0$,C!%TMHM==YhsH + ;$H]KH:,!###53%7'7&547632&'"#&'MHMB1d>F '$:$5 $R9*(H7#1 ; % IY5.cLP"%#53'"3###53%7'7&54>7633'PRPI4 LMGM31c>L$%@'Lm CAVHH7#157eI##"327#'#7.547#'"'.'732=!5!#3>;5!5!x)4+?8^/BGb^{`4=.#D/[,13"BZ9 G<UN2,J'-E#S)bӓ&2P1%*Bq15;)Y#',(.HH=5LmHD #53/"3###53'73'&54>32PPD $P%MHM3=+-,8(I, $ HZHH:9I4%1 _g14>325#!5!53##5"&'46?&/"'"#".#&(]\#9,01M}NG p%?$ */$| 9:HGi8/oI D!21  e<'3#5346;5!5!##3>32#".573254#""&WESS31> !& +'+#9=!4lRB$3=Wk'q H6y!BO# `II.3 I 4M'6MQ7.OS@p"#8e '346;5!5!##"327#"'&p Vg68z)5,@7_3DV{jMN!MmpIIL(0I#V*tGGe*'33254'7#"'.5476;5!5!##"M VV(2&96LxSkE102Fl$ !%;#j7'1*iR^F]4B52}II#ce5'346;5!5!##32?2#".573254#""& W{1>cY+R5+#9=!3mQC$3?Wj&q H6y!"!`II;5I 4M'6MQ7.PS@p"e*3'34>;5!5!##"&'4632#"'&>74#" VA+m)2YM>4#5 #:<hSR>&2."7@,hII>.?i%/5A-% )B)93e37267!5!!632'>54&#"#5'7.547672'&#""H8H6ZwC!Q/4FG-5?+-DJ')?*HHNX<]|/h0!+t9TY6@01 N  #&9ze(E%5#"&54>32&'"32675!#'326#".5732=#5!##5'l4A;L"3(6K)<'! 6V4&+n,8bD7" ; .-GG,1,D8(9 E4 ɘ* 4=':H"(?NKB$","-HH'9e##5'%##"'&54735#5!GG,!45'9韓8'456H?e*"327!;'.547#5!##5'%#".548,)Sx,JK),*D?FG-"sO/<)B'#N$&-I! R!&HHc8C 8&:4{e>#53#'#7.'73254#""&546;5!5!##327>32{PPL/1 ^{_-]E91W@oK6t%I{|' *%*6M0E&֓ :GG0.&zLm"8'^HH;2 H]e!%747#5!#327675!5!##5'7#"&!75CaW%;&88-0]FG,603N $ C;GGQ4+8HH{7~A 7te(G"327.54>75!"327654&#"%.547#5!##'#7.54-(1"xW6"C !,6)8"Mt| fK`^{a@Y* .o3+('* pO7a9A@]49HHm (|ZAԓ`LJe$%'-32654/5!5!5!####"'&5 -"C = **GG# :(`8Y!0>7 qHHd(6./?ze.@72674#"#"&546;5!5!##5'7/"'46327675##"3237632)L#K,p#FG-] `+.9N!)'`>E:'%S6+3.^HH鎦9 !z+N?.PX" 0ۥK e0%'-6323275!5!##5#"'#"'&'7232654&#",!hG+FU!$FH 2 bG56'2/V(469/3n9$IMHHIX&9/=,/H 7,e%##"327#'#7&'.5476;5!5!,x"-,@6^0AFb^{`N=4,/?,1/.G!S)aӓ 8]6A8>mH9e*#'#73"3254'7#"'.5476;5!5!#^{`Er%0':275ItQgF000EhǓK?",C!f6'0(hO]E^1A12yHH-Ve<#'#737#".'73254'"#"&546;5!5!##32>72K^{`C'3.2hOA#1W@oB6t%IVW'>,Ӕر(?& 5JO6.&zLm8%^HH% D- e+4#'#734>;5!5!##".547632#"'&>74#" ]{aD?* k(2UM)$1ObPgPQ6(1-Ӕ5@-fHH=,=g 17E5CNJKM#:31Re%'%####"&=#5!26=#-"GG}P325#!5!3XNG+bOJ+,MvМ9m&'7 SH)e36%2>75#53##7'7#".'3254&#"37".5463275)+8=eGG,894cA(*-6*B:-= U9G[-+ 8(HH}8|.DF x*5-/C&#0=aCA e'46;5!5!##"34'432#''%".)B4G)B+2_ ,Xz:-=U^HH+ B00V<9&A>g=%5#"&54>7.54632#54'"#"6;"3275#53##5' d//GM   -3K)-EH&9*5"B$Fo^FH- ?N3   U(2FI&#"P DRoHHs8,e%'-463!5!5!####"&,!Db,GGh8l&HHGV se%%'32##5'%#"&54632&#"?!5!7+"FG-V,EcZB G9!  s*7UX81f=Ga M} H <e+4&'463235#53##5'%5##"&546;54&#" J20"eFH+ ^ '0,380HHl8Ia o .,e$5#46;5#5!##5'%5##"&lɕ (\FH-_S. HH醞9/One-32>75#22654'#5!##5'%5#"&=6 >) ')57FI-!:P^~/W+   +t,"6$HHc8 3ve#"'&''7&'732=!5!#\I6 %18<,9 G<L1A858M8',(.HHe(".54632675!5!##5'75'4?&'"p4$JN9`KX@CD GG-/^ A 1*+H:=(Ac3E]FAxHHc9{Rp)!.+eG4#"6&'&547''6?.54632632'>54&#"'67&'"8.$1mL.=HV-6UA58GF] 57#4 )% 6),Y84(+++(}3PS?+ $)9,*089/D4G )% ; " #+R ' ;&= $i%.327'"&'5#535!##"327#"'&'#>;5p<+>"jJf),w*165G^1ARzgL6' uG,>#-)U@GGA/I.1T)rF2B!|-;ng+2327'"&'5#5%!##"32654'7#"'&'6;5p;,<$jJf) h%0';2DA75JuQiD)' 1`="/)U@HG@",C!258$1)hP[D(@{Vz7$h6#>;5327'"&'5#535!##"327##'#7.'uG, ;,<$jJf),w(4,@4]2A!S) ^{`Pv(!-( b@^O4^s`1HGO-? Ee/574>7&43!5!5!#!"!###"&=.5#2)DQ7&43!5!5!#!"!#5#"&5432&#"32675#.)DQ3m=1/"-P01FT?.le #'".547&=#5'l  (:FM; .j VL   * 5:f,DON Ee1"&'4?!3.54>7&43!5!5!#!"!#5\rBr%53H DQ?5#3.54>7&43!5!5!#!"w(  \  $Bl+52H!DQ5 B^HHNe277'7#"&=#5!#>5. Kf6;;WOTbU@HH"/e:#53%#5346;5!5!##32>32#".573254#""&SSSS31>+=,+":=!4lRB$3?Xj%q H6yOO# `II;5 I 4L(6MQ7.PS@p"e'^]e'^9J#8e'o8 $e.#53'33264'7#"'.5476;5!5!##"USS VV(2&FB96LxSkE102Fl$ O!%;#3n'1*iR^F]4B52}II#ce:#53'346;5!5!##32>72#".57254#""&SS W{2>cY+?,+"9="4lRB$3>Wj'q H6yO!"!`II;5I 4M'6MQ7.NS@p"e.7#53'34>;5!5!##"&'4632#"'&>74#"SS VA+m)2YM>4$6 #9=hSR>&2.2O"7@,hII>.?i%/5A-% (= LLP);31%e'o e'oE e >#53'3#5346;5!5!##32>72#".573254#""&SS W`SS31>+=.+":=!4lRB$3@Xi%q H6yO!BO# `II;5I 3L(6MQ7.PS@p"$i )2327''3%"&'5#535!##"327#"'&'#>;5p<+>"@ WJf),w*165G^1ARzgL6' uG,>#-)Y!ͺU@GGA/I.1T)rF2B!|-;ng /8327''3%"&'5#5%!##"32654'7#"'&'676;5p;,<$@ WJf) h%0';2DA75JuQiD)' .G="/)Z!͹U@HG@",C!258$1)hP[D(@{1zEe39'3%4>7&5463!5!5!#!"!###"&=3.5#2 WD'*7&5463!5!5!#!"!#5 WrBr%53H D'*7&43!5!5!#!"!#5#"&54;#"'"32675#3. WDQ3m=1/"Uw1FT?1e$7#537"&=#5!#632&#"#5'3275#eeKf)GD/43G.;,78.cCU@HH>L &/""//&e%7#53!5!32654.'5!##"&'&5ee, =   # :(Eq0cHY!$%# H(6./ln?L)4>32&#"3!##"'73274&#'7&E!89!m5#73267#"&547.54632&#";#"u2:!8{7pS7#".'#732654+732k 69 j.wv21M* 8!*K9NO,?!eDh1&>!S'%+"'>74.'32>5"#".54632632&#"51k?Y"'    .8&UD(Q:/3l(1 -PF5(@XY'"%._"I1M^*:<(QPE75"&/73>54&#"#"'532>7'&#"7637632&   3*,937#"327.!/:*7B}$pp-H(UD9$UUk)7"&54637654&#"#&54632&#7>7i-C8^)3-_2W?ZPTI%"F2*3q SaQ  G$/3*1A\=EQ4>`B%'7267'.547&547654';#"-R:Df`g~Z!H4|{JGMGoC KAB(5OK  ! )QJ&Gm'463!##".%&#"7>^E; ]J >;$BXL&ARR.5C7'&''7&{>Jb&8\%U%;<|Y%OF L)*- NI_$7= : 7G(#3 gl:6$ %+-F4726=33#'&54>32&'".9lrqoY/STC^7P* It &74354.'.54>323#"&V(#-,%PK"4FA!@uih6L@_<" /9--+C>a;&TB:U++0 HI4&#"56323##"&543x '5"|ih;+5-`>*!V qeU#(:%_%%267#"&=46;265&+732"&#"4w UXq ]!(AW8Dx(  "(\2d8{Y';RT=~  %#574632&#"32>7#"'&Vj)0$31315(]GGQ)h O $G16K$ U JM$"&54>32&#>546;&#"a.0  e2PMY2KU!tFf3 K )<*X^kj$)}]74632&+3267#".nY+, 53(W UU4=,PaM.9i+`= -O/#.'&+'32>7'&'767+.54>32m`5f~638. '1#P 1%(:I;G)%HE*6Tb g5(U S 9'#A (? >2.:'K,%"&5754+73'3267'Nn-T|-%9O,^5R#"'-&23##;#"/#73265.+5%0"j6b- %D/, 5%+NH_R0R.!!(R&632&#";#"&".546776770&:[/$IcW~@$i;nU+/3Cb Q@$GP*DF$%DK=H \q34323#32?672'#"54>7654&#"#&dWtIFB ,?GLE6Fn",>;\#xG.K&)!K%;( 3 ]0}2>%&!#$".547#'!#"327<$DD2 vʐK@L\( +G.i1SSL4 2KV27'75.''4>)C& GM 5= );,>I3#ZKuCq +5&U -+7265'.54323265'.5467%&'&#"\5+4 B"+53n88/1(:'Lo+#,1/ WqK>c?,$ D.3 y     1<+f8$%= CE\"4632'%''7"&7"3654@cOPn[N4BQ$> Iy5GL4&#"5632#"'7326 '%'9BG 18D_-~BS&F<7;0H V $><#n3N8wRc$7"767'63.547.54>32&#";I+MPr* ^MS<%>>!d-*,H|?9 DeU:C2A)8%$5 S6?N +3267'7.'#732>54+732k 69 p)t+X 8% K9NV,?!`4 SS) D>S :SL'46327#"'767''74&#"327#"H9Aw4;(\ 6qPx-$ld5FYS F'-6Ls,>//P*? +77>7'7&'4637654&##&54632&#sE3*4o )-C8^)3-_2W?75 SJ%"4>TFM  G#03 )1A!?,EP/';#"3267'7&=47.547654'y8|{JG5,4s`+<~Z(0(s$QJ&HfE5)aA)H(J %'463!##"& '%'.#"76[H; ^JdX9%!X'&6@PM-5BX}Jo,"H#27'7'7654&+7h9gv5ɓ +,/O2U[Hgy R326=33##"'4632&#"'%il/8lnmm]\I+-+NX8(z5)ISQYTf JP'+74354&'.54>323##"&'%V4',.OC1PR+6?+ih7'&>+;%_;' .:->z ,?Lp9?*:U),/ewEp J23##"&54354&#"56'%fE6ih;-5,` #1 988fU#'9&^9)!V -eF]87265&+532632'74.#"+;#"./#5$1V2H 3",>>B;.I2dQ n (5( RR/-HO>]i<; ;J]R R 72#"&54626546;#"#"'47&546;#";#" !'H9$a( {^EBNW85*(.&`)%t^:IW);&#"3674&+'32654&+5322%,#'9[2! .LK( ,D?D~'XZ&%b1B> %!)#+5&DEa/Z;L@L$+T' QJ5h !GU @2#"&5464+532#"&54632#4'&#"3267'&+'32!!#G`0A9^֍nLS^&HF*9%7H 3XVG,&,$-g?QJ59FcFVdPCj`G:EM!?, #,& ,R?H&5432&"72#"&'73265&'#"&'73254''7&54>32.#"KR?&r&< ~W1n8$@$0b[fi=r Mc*^SE @0f B`3,@aM "Ge&&R+#M. E=R9;*=BW16I33#'P=,.+%2654&''7'7"&54>32&#"%2#"&'71>2RAbZ74.#"326?#"&UC,X?3ch  i) *B`'"  * FX>M^(:=*  *%ZYY2)&  _d0F265#"&'>74.#"327"&54>3273#".53Og ! .7?X8ZL A.H91q*OVO{J/hzpXJ b   F:0DUU@ I @F+-(9;)>'SM1)?TQ*a'46327#"'767''74&#"327#"H9Aw4;(\ 6qPx-$ld5FYS F'-6Ls,>//P*? @%2>54''7&#"#"'532>7'.#"763>32653#"'5"-H*"K9;T*=."3 5-.<'$6;'&-t'F!B-%,%4="9"6]HKV'&;.@BRW H 8 Cy#CA( R F<"&5467654'#"&54>7654&#"763"267#"3267zkbfg &y'{m3PIB765.#"76;#3272>54.##l+e#HYA=1?(Xk"A?[8M3H2:@%Uk:-"b5Nn5/3' 97! *D=2D@A1(5 8%i! Q8 'P:1''3JO     "!G4BO4>32&#"#"'#".5463&'67&5463&2654.'3254&'&'"I 74a>6Si2gJ$ l1PP*Fh4]&  uH! HK.)^"6Qd\C0U>).'I)g**  c(; ,,,< 2F)9" 4%!,@  #FP".5467&'73767'.'"#&'7632&#"#"'+.'732654#"*L@ 211o2MU .=?$n?+51=4cJ3-#"H3 ' bUO  :"%  #BQ1J#,FJ4#"#"'7>72.#"32#"32?&5432#"&54325&'&'7326S 5 (M2s ^hnhZ& OQIHL=9KGidGf0n4[D0_  L* ?() #,,!(  RAyPC{  BH1L37&54>367'.#3327&54;'&'#',*=#6&f)TD 4J6%'+.5467"&54>32&+;#"7674&5472 NZ<'$ ^y((=*S:m08 , *B$ I#'A7y' gTK:*-* S; I=#"D S)HO73267".54?654;7632#'&/#"&5467#".467327"&+*i .4'Q%# k'rL:J N-%5B W' >Co1YV +5%<.;*O ,, =#1I(G) )*(' Q(9,N2"+>1d+HNGN7< 8LI <54-<>@\4%&'#"&547327.54?65&/33274632NB')Q1\aN?2L>w *HG*g6e(AQp &2U,4~T) фyYn5645=JS!C.q( (:D;27c50"3%2#"'#'&'732>7'&''7'7&54632&5l% /bzbiHCT[219 )]Sj NKX.`E 'XT2GL{3@* ,$s0W3b@*BJ0%4#";!"/#53265&+7!2632#"'532kp(!/gK - (U/;j7Y/4 97!K>#?++[R0R,$LR:?!1`BNU O e=3632&'#327#".'#;!"&/#53265&+72;(@$tJr/PK@!  !)(2&N3iN (T/<k?)Nu/  E 8&([  RR,$LR2,%2#73267'.+532654&+5>;8GDPNSZV-"".1:g.u cp 6I4)CzG9[;(U%&V H?! 277>7'7.5467&+9E&9 ,3 iV04341 ZS= $C*Q]M.[$.%2>5#"&467''7&54>32#67>54#"(c>xjGT<,X.m?M-WtlR@--(")P#/9@{`;pJ 9fZ;.=*5H<$C1 K+O- :"6b#+"327#"&547&54672.#"#5'7.?.2v4^n=WTD39Bh7 <Lz>*65N b\Q sA%#"&546354#"327#"&54>7"&56732&#";233#5#>61'0-%;= A"$C!B.8 17)@[%E' oo$!7")2$4L'Wv6++ ,`J*$! J&$ koO472&#"#32327653#'#"&546;254+27#".54>3.jd 68 '#$TV,83#@;.mm]1Mb3L_FRg`= "0X[C*+;3UJ G*& !2( (i$]I#,*YG^oH'=fA7]4*I" <2654&#"'&/#67#"&54?''7&54>32E% =!B= Hp]15L?ARpƨBd%M36P%c$%2.!' -6$1K#4P6I!,B U>_+M6YT.9@ $)!0&3 &84'37>'2#%'7"&54>327#"&''%oP :1YZq  .WAMfIKc{iD,%BU"D9+ $I<  ^BfZ;D'*5&-nL<7PTG>2#"'54>7"'4>54'76323463236grK)@.<=WW=jP"P'0ZJ;UU;F,I.u=7654.#"#&eUmmtHFA!+?HLE XG$ޱJu+*!;U U'U8265'.543253#53265'.5467%&'&#"R5+4 A"+53q6oo:G+5 9'Ll,!-1/ YqJ@a=,$ D.3  1;+f 9&%= CG\ !"365446323#5'%''7"&%> IdMQlZllN3AM+!6.H69CL4&#"5632#"'7326#5'%3'9BG 18D_-~BS&F<7n;2m0H V $><#n3N8OSRIq#)7"7673#5'63&'&547.54>32&#";J+KQmmr* ]''S<&=?!c,*,J|?: C7lU: !2A)8%$5 S6?N5%#5'7.'#732654+532+326735n)u"0%7")K9N!69qm(pS)7$S&8SM@+>`2 E'/77>73#5'7&'4637654&##&54632&#jE3*&z oo)-D8^)4-`1W@66 TJ##5;&FM G#03*1A!?,FO+/+;#"32673#5'7&=47.547654'o5|{JG5+np3q_+;} X(0(s*QJ&F%~E5)aA)F*I  %@ #%&#"7>%463!53#5'%5##"&FW&& [H:nn:!]LcYNH# APf[I!33CU273#5'7'54+7^8fxoo6ʏ,,.N1ZIfzR!326=3353#5'%5##"'4632&#"/32353#5'%5#"&T3&)3 0PC1PS+5?.imm;%h8L=d;' M>?z ,>Lo9?+:_xEpg),-"2353#5'%5##"&54354&#"56]E6ioo:i;-4,_ #288f>eF]j#&8'^9* V =7265&+5326323#7'7.#"+;#"/#5%1U3!"K;9ln; % 2cQ n/ (4'!RR ,ID ]i 0  ;J] R0R77>73#5'7.467&+w:C'9 mm-SKiU13441 0~S>V_ M+ 932654#"#5#"&'7>7''7"&54>32#76732673GP#/<n;d,DU BX/W?M-WthR7 +,(< nC-:",P&'>5#(<9fZ;D'*5H^,M6YT.;?/F!( H$4 $%3/!'.6%'.+8%3275%'7"&54632#53#5#"&''%74'37>IIJc|-XfTXs  mmbDU!C@Q :6%-BfZ;E&3=J;  aq=6PT9+%*432&#"#.֍ $&3:((zx : "(e&4EL@#'#73^{`D3?73267'3265'.'"&5754+7367&'>72&#"#"'&,8O$S@)LMA-Ri-)05nZA*(DX\ '1`A!7-.6A;+#^5R%(@K XC!")8 =;$873267'"&5754+73>54&#"76323267#"&'-%8PLRi- {F)92@*M#A?&54&#"763232767'72&32>5'.'%32767'eX;O\')77]{`89Pj-'24nZ?,'RA11FH-2 ;.D "(:'@( ēo^5R "(AKX6A2%(#-4&#"76323267#'#7.54>)*92?-I$@?%;TT;h0d8[B^{`$?:!=WX=o a :'-70':G%Z7 ɓ*G.*= "[T3#.''#"&563232>7'.'&543253To$*@D5EW*\L] 0LT6  * Dk"=*$n S$$ 9Z3,2I4    @T,73265'.'&=472&#"#'#7&'&'X k1:N Kz(=<4.Bd^#/ 8>$]{`OD:H1' "'7[< +!)4,E)Ǔ ,& 3%2654&'"4672&#"#'#7.5467&5)OFhITlp^@-(FWFSS7":@%^{a2N, [47*:.#4;'6CFCL[C G5/H*Ɠ$0+AS%1#'#7.54>54#"7633274>32^{a3M- >XY>l4A/Kvc=XW=>/ 2${fE퓓&2..@ !2gS90:)$.9)+`-< G67''73'&'77>54'" XRBV8T<;JC4IV)96( i=x)' 'L; ' <2654+'767+&'71E= 9&%/,-BhM`A,0)8 ;0-8=9514>324.'#;65'.1CQ-=mF*L+_80/; B# [/+01>.E94JN/ > 4T267#".5432#"2>#q ,v6=Y-D*N ,-t(q# 4632#"&#3Y'"!#2^e#)%`"#324&5432&!05Qڑ[*a'0"D m j P^!"#324&5432&2"4!!05PْY*Za'0"D m j P8 *TV= 2#"&546'7#%7#')1qe[N0&&%#E["#%7'7>;)!<[Nrd/"Gm1pE#6&LX! 4632#"&7"#%7'7>;="..""*W#A&<01^-u&"-+*"-Y<K&'#".533275432&#"{4 524^\$#?$%*!-^D} 6b2*#K&'#".533275432&#"{4 524^\$#?$%*!-^D} 6b2*#%!5!^72#".5464&#"326.;& . @p %()2>+- & /;j2)<'"%!5!=©^5B 62#"&5464>32&#"3%#"/732654&#'7"&'"#'$,#9;#n 9Ckkggi"I0Lg:&*32'"+2>;g)1"V>UkJ <2#"&546#34&#"5632#".54'7326h&,($*hh9CL->u9  .Q22" WB'9<*'1+1N X 9  :)<.! " ?LJ9 32#"&546'32673#5#"&547.54632&#";#")1)"62;"<}pqz;qU=nYe/*/L~}K')%"3'! ;@k-[JA*:':HV8@Q!F ?2#"&5462#"&5463265'.'&=472&#"#"&'( 5,"%-$j j2:N My'>:6/Bc=Pb/.LN*<)P( # "%).)!+G2& #'7\<')45N';<lB 82#"&54#"';2673#5#".'#73267'&/#732I>' &$L#:7k .upqx6$>)$8 *9P)" 10D fC9q1*3 U#  TN4Y <J2#"&546'47"&54>;#";#"27#"'4672#".32654.#"( '$5fX#G'! J<#I&)?TAM).S\PyQp!#!(=*" 1(!G/D3"5 T5#X.Y~Og;=v pV]Q@3'0 972#"&54627+.5467'."32>5#".546(')",$1gE-L #>*49*#y<(, /:(WB*)1*7'.#"7636321 '$5Xu%' C 66% ".4*+ ;;W*@.&6 6.-A%6AB"'" 1'"G#?6jHf0YWE8F&7_JMW&(>-@FSX*Fa +2#"&546353###"&'7327'.#"'6&1($**gyjopi{M*r )P N-L"=+*&!2+'lQ#_S:[ /&0;[ 12#"&5464&#"7633267#".54>)205+:2B-Ko^.c9wX*NK->YZ>R+&!(&# dQ8-:2'XE*\&>)Q7+>"" -:2#"&5464672&#"#".5467&52>54&'"' %,,4o_@-(FV FSR7-KM)@b8# X7724HfJTW)2))AMZD F57O($4/AR'3:'7C  22#"&546'3265'.'&=472&#"#"'&''0'$*: j2:N Lz'=<4/Ad^#/.LN*jU9Q)$#2+G2&!"'7\=+!)45N'7$ 52#"&5467 54>54#"7633274>32(!$)"5x>XY>l2C/Kvc,BMB,>/'%{Hcb*31'!9.@ !3 gS8)7(.9(7 `#8d (82#"&54%#3%#"'53674&#""76"&533267c>& '$-poE_$H1#&(M,$ %%jsM=(Xt`*" 1n`P 99!Oc*7Rԅe=&!QK"$*11 )ESqO+5G> *72#".546#3".=4+7323767W')  +rp+E&&[<%# (CI&)>' " (MO$,! T-0!  Y 4C ?2#"&5464>32&#"3%2#"'#'&'7;>7'&''7&d&')"* 553b!>9>& 6g|fkKCWb" ._ Q>*)1*,  J( 'ZU.HO~5A"'59e 172#"&546726=3353##'&54>32&#"|&()"*z/:osopr +M0311'$5(8@,joqh(dU'%8().%R M#6GC1"'%"2(! A*:   k\=" 48K/,A?c<' (72#"&5464&#"5632353#5##"&543O' )",B"&=kpqj;.8+b!)" 1*6, X rj$ &;&`+ 972#"&546#3267#".=46;2654+532"&#"N& )"*qp4wW\:PA. `+EX9G|& ",)" 1)A}3f9 ,P3';TU> W +2#"&546265&+7!2;!"./#5>)'/4.>lIeV;K'W*-'(!-%NT\D&H!] U TN 12#"&546%#3#572>7#".54632&#"[(,54popΣ6*7E9's*1"5342#)>(#$'!R W&9a32&'3654r)"$'$6rNgs %! 2QV~ ?+" )2(X*11'" VHm"45V]_8l+QO1 R ^6E`k (2#"&546#3267#".54672&#}& )"*po([ VYA\,kX4.*55)" 1)+b?+GD%Q_N,;lwK :72#"&546#3"27+.54>32#.'&+'32>74&R2165poh+'1(;L5/<fX z%0< V <*91%73267'2#"&5467"&5754+7353#54:QJ()'$5Un. pqV(".*<)2&" `6T$pM 332#"&54>2353###;#"/#7326=4&+5''!* %&1#mop S=. 'F1, *..   7&-5a T1U,!*U# A2#"&5467"&547&54;.'"".=7654&#";27s& "$65̋ O+@-.Oy#=WV8(C$5YB?L cIxMON34"%&"w3$SP %@H6Q  !%.B;)8R7\( )'%"5632#"'53254"&533267 >$!0NS#G0"&%NShpK<(YqWvQgH88#Md^,c3@T Y 5)1"&533267"5632#"'53254.#5'%3pqK;(Zf1"!0LU %>'!&%N #*p=Do(`3?V YQiG+0$Md "W#"&##"&5463267 +W t5#//  E<Y]=&%( f`w'27#".'./&54676;53#";(  ()  % ,5#   "! *( 4`' ,T326=3#"&5432#V-!;-6BkR$<$K4)5Di/EZ#".'6532=35!5!## D*#.)gdAV  B %MAA1|".'#"54632353'32=!/  <1B (G2*)3x.@*H4@x#"&'>753"&#"32>72F.&4qN-(ZA;%\+?J)&9-8\T!1>u$#".54232>54&#"#"5432327 LL?.S(d$).H3+)0C@,-=,<$% 2!: $ k[5654&#"&54>353&8 i<=20=32=O >"$  5nY)!RR$6O #".'3s,VjH.2tIv#"&##"&54632675! f r5"0- 8 4/H N9$ ( G;;Be #&'5327%326=3#"&5432#PcSVbfRZ\W,#;O2CjR&%$2)((B4)LAi/D  gd #".'5327'"&547332>2+iY$G%fQZ]3P 2$! ' 8)(Wf+)MP0/'&z#"&'35!q?#9-.L-X&9665$5!5!2#"&##"&546326788v  q5"0- 11l0013 N9$ ( GR2!5!5!326=3#"&5432#VeeM6!;P1HeR&11p11nJ2+dhLBo$E  @ "#".54632#"54654'&/A! "HQRG'!!#6' J:/TR1/*G$1X 4632#"&10% !$%% 1(00 *3Y327#"'#"54?654'&#"#".54632327"'7&'&54675!5!!5>54&#"cOT]cQP_>  (_ @JKAXZT]^ZM>>|^_|2%,(zBMl**=! 9""3 # L.3,KJ" 8##1aNAAO0G) @45Jfq?455X 4632"&#+5;+,00!H k@``YYE$!&00FAA@ =G[#"'5327'4&##3263>7%4>32!!#"&/47#5!.#"%"&547332>53@kL[]cVX^8Z,kaA6FzajJ" &=kFTv8BLEt'L4OG^v7R/ BUI-$3 V((A('7[5!WYA%EO9&5ZW2AZn"Dk65 в$Ajn+=5KX=I<.' BW &GQe#"'53275#"'5327'4&##3263>7%4>32!!#"&/47#5!.#"%"&5473326534iYP\cUX^lLY]cUX^,Z,kaA6FzajJ" &=kFTv8BLEt'L4OG^v7R/ BU&%)MV''A('V((A('7[5!WYA%EO9&5ZW2AZn"Dk65 в$Ajn+=5KX=&8 ?F BW AL"&5473326534&#"#326!2"'"!!#"#53267{BUI-+KWBY- +Z=v_6F@Cq\=Z5%WMFu'L5D ##$z0X=I<@E CV8[g5 41*H8*AXo#Dk64 !AA;8:Q'"a&"f'"c'"'"+'"i '" '"o '"\ '"'"l'"['"'"'"'"Z'"}'"zz'"E'"'"tx'"'"t'"X!h'"/# T62#"&5426?5;#####"&54>=&'#"&54>54'4&+532676&6+;@@cAN/7 '$+$BJ;&  &8\>]p% "3[9'AFi JE>&:*C$ &WI]7/$;" 2#"&'67&'###535463235#&98F5̈^(8U?CK$>! c/nwu@}}kc52 |-{ %L:cA8'!f# 'bpLT[gn@A:g*P5 B62#"&543567&'#5!4&#"#4>323####"32>2#"&8&}-{MwZ2JC*@"C.am@_|:K$>! X:p+%/|T[gnAf>H$?<$g:A@8V!f# *_p@'&&@"z''&@"z'(&?"]h')M&",'"zh'+&",SX X4632"&26?5;+#+##"&54>=&'#"&54>54'4&+532676O00!H D6+;pWTTJ@ W/AN/7 '$+$BJ;&  &8\>]$!&00 "3[9'AFi JE>&:*C$ &WI]7/$;" %1 %,5% ''Z''W  ", %(E#(K#"&##"&5463267'7 D< r53/!45 @./1P4& Vk_B32=3#"&5432'7N3?:O3>gJ'Dr45p?M|{D9X-= a60''7'327#".'.546;53#";035?  *  1#,",5"LuW    +"J#)L&%3#"'53232=#3.XMG @vXeT58Q;1j%#####5354632&#"354632&#"WSSFFA: :A: : D88DY8?E5RY8?E5R ####53546;#.#";SSFFA:EK: 8DY8?f5R####53546325&#"3SSFFA:M@:'8DY8?G5RD+#5&#"3######5354632&#"3546323DS*:SzSySFFA: :yA: Oi"5R88DY8?E5RY8??")######5354632&#"35463235&#"?SuSySFFA: :yA:.):'88DY8?E5RY8?͆5R&#327#"&5#5353##5354632&#"V'14GGSSFFA: : DF+(DDY8?E5AO3273#5#"&5##5#"&5332>75#".=3;.54>;#"{10_XPWOAQVT) !!ARX$*,: w9B-=3!!!32=3#5#".5#"#5#"&'332>7u+3+-,Q/=WO:k$9% 6**T) !!AQX$*,: 6&@&$BDGaJU'!1%&+9O8G6-+2*A8@4.54>3!632#4&'"##"#5#"&'332>7u+3+-,>]dOX49*-X6**T) !!AQX$*,: 6&@&$GhaI?>"H3l%&+9O8G6-+2*A84<3273#5#"&5#3#".=332>=#"&54>;%;5#"10_XPWOAQ\V=_6I%Xn*-eX%O;C= 0%FS]F4D8 E;C.~"H3O;,-2hA8F4.54>;3253#5#".5'###"#5#"&'332>7u+3+-,+@XO9l1D$X6**T) !!AQX$*,: 6&@&$BF"JV%D7-}l%&+9O8G6-+2*:X&52- 273#"&'3J GRC@OG*RIPPI%-8WX'%X%>53+533"4fW,?L:ꥋZNT<v3R0! L :@X##=47'3>7538}rAZWzFVW{p"zGx)qA&X#!5!W  LL?4X #.'!53:{lWAZ WXamtQ: Lw9X4&#!5!2#!5!265|Tbxy\WysBWLY[LVC%!#467>=!53!W$C;6 aW>MWS`12!/ Hᕙ1P+7.H?5X 2!4&#! o]X[X+7^@%X #.'!5{mWAZ>XamtQ: L#uX4&#!#525#5!2#[Pux<oWtESgdLzFL}a2!5353F FF<&<&<'&<&&:}FX&:FX&:FX'm:6X&X&&X&?:X&1 X&3- (X&)=:X&5X&F'@&8X&9X&%!&H0:X&C3FX&u=9X&/98 X&ME?X&ZF3X&>8&X&)%X&<X'#{X&>&:6&09&?&8HF#53>=3>Q;fhW):WD'DZ9q #4&#"34632354>#3 r]NVYD-:/8**H**HH!PGS_\;A2)1''4,&-$'e!D]`[`]!e{#8!;V RX <&5":W RX\ %!#3!!!#3!!#H\TFWh[ ah#S cU &`g&?5!#'7"%7"''4 i'/;` ad<_- #&'#'#&'5o(O&i%pp%#T eQ bll"G #'5!#3!! 8&u M K 1k R&>7%37"''49)-6e@X$>/ J%##5##533533533##4 ;0*XXZ ;p Dd22^`_`^!!C O&'3!#3!!UX'.54#%%h47NP%4)|r-7&'5!.'5!.'5!g/W$"!W4Wd%(% % (& 3 (( C7%3V)-X$t|3!!!#$h56% &|t-.%!#'#&'5o%oq(S!h}kk}S  %73#&'!#3k _n&E `tj&N hepK'#3%#3#3#3#3l(& j '& 9P(& ~[/(& f#(&|p'Wl*W;\W\W@X 2j-X d%.:%'.'5!>7'67'67&'7"&#!567i> )2#W D. 0tR,-" 1  (&},  wT.'%v ''7237'"#'677{z|WUWX \ X|}z|W^!TX ^V}   7#3!!! `&  h'&d !7#3!!!!!#5&'53N^~X d~#Il~OW"$@aUg'Xj'&Iq%5Mmm$6ff8"!#3.'5%&''foX!k %   Rer)x&P i?X%r %   b iis'Lhd{:A%#5'535&'535&'5333#5&'535&'535&'5333'5!]!ee'>e!D]`[`]! Ee#Be E]`]`XcX\&5":W RX <#8!;W RO(&|,9 #&'5!9S'Y DtC##&'#'#&'57#3%!o(O&i%pp%#T! Zo eQ bll"G  a(c,,#'#&'5%##5##33533o%oq(S!` !y ! ! byZh}kk}S u    iq f`, &'5%#'##3!!%3S!Y%or'U bV(.}S S}kk i'U$|5!#73!!!# ^($m56L#&Sx-.N&< 7%3'5!#V)-^'X$Q  #'#&'5%3#33'co%pq'VU),[d)i}kk}T X%l)) ,&.##5#!!!!#333533%3R!z& WlZ&E`z\V'/R#u%  _&uc'&N iq hQ$%'#%3737&'5%#'#UV)-),xT!n%or'XX%T f}kk,"#'#&'57#3!!#33'o%oq(S! `!Z&h}kk}S  h' a)%^!'#5##335&'5!373U8'=k 6=X ;8),u 8nN6pX% C,'!!!!!#3!#3373#/B;.Wl'C&E d~ZP*,VR&:9_&u'J'&N kM a[$&|",33#7##5!#&#5'5'#&'5$l၃P!& ;4(V9l'p$L$'Q|w..S%=/VUfk%H~%D #&'#'#&'5#33' O(O&i%pp%#TZd! %GQ bll"Gfl( .#'#&'57#3!!o%oq(S! `"h}kk}S  h'!g'#'#&'5#33#3#3o&oq'VN_Z_#Ili}kk}T N)h'\h&&Iq%B#+5!#3#'#'33##33%3 c'H cl<^RkV(.Wj&o(g'T#}%:U%# 5!#%3%5!# ^'V%1^'SL%Q.!.#/#'&'57!!#7#'73#'53!!p%oq(R"l~V  b% a~!, xjllSL<GHF"  5!#&%3!!!#_'& $h56L!&T%r-/N# %'#-373%5!#UV9V(.9%1 ^(UL%S|%33#7##V%1T$i၃50&4N$Hs..73!'#%373337##zV9V'/9++,%j . &1QZ#Or/0 . Y %75337&'5!#5#%5!#&#5'5# ^#T $L% o(O@l&p ef"G%HeQPfkL(3'7##%3%#'5!0$h y !  &V(.]'u Lr/ |/ !  $UOkC#,%#5#/'73533'33###'33#VJ#I cJ(.])>jQ ^vv&IkUs e()f}%R%[g( %#5#%3533'#'5!NV(.]&~]'u }vUr e(&#OkA$-#5'#375'5!3#'#'33#33##]'!J Zt fl:_iQO Uawkl&p(h'k}%T#0&#7#5'#5&'57'##335&'5! p%oq(R"tM]tX bM(jllSW fZNXZg!#33#3#35!#N_Z_#Il* c'"N)h'\h&&Iq% WG87#37373#'#/# `*,9'/V9V! h[Q#  "7#333'5!#5#'%3'# `%nu ^'O!&8 yC h(vkSQ$,0 | A##'5!7#'#'33##33]'u fl;_NjOkl'p(h'N)}% &/5!#5##5##335335%5!# ^'% !z  !\z ^ ^(S$   t   frjkS%'#-373%#3!!wV9V(.9%1 `!UL% h'  #5'#5&'53!!!!#p%oq(R"_ 7l~V xjllSG (L<B 3#7##%3%3>$l yO!&V)-U),Bu. |/Q$.X&X%}#,4333##'##333#%5!#%3$Aقc&J% &$hL̓JL ^'V%1}C-.e(%!|t #SL%&,1:@KT]c5!#5##5##7##33533533&7#35#35#35&'#35#'35#35# ^'TLV! %   &%n]I]_^Jl76l{!- ^JKJlKI!- lLJ7RM<Q= &   |wDKDͅ F5L(DLu# F5L# L( ',5;FMS[c5!#5##5##5##33733733&7#35#37#3'&'#35#'35#35#%%3 ^(TLV "M&%n^I^_^Jl76l {!- @.JKI#lKIZlLJ 1%V%1RM<Q="[|wEKEͅ F5L(DLu# )"4L=L L%I*%%3'5!#%33#7#aV%1 ,E(V%1$ 6၃g&N$.=L%V;./i$W&7'#'7373'#'737375!#8%8%cd8&8#&c; Q!&6K6K7'Y0P(NW,7'#'7373'#'7373%#'#&'58%8%cd8&8#&c<o%oq'=86K6K7'Y0PD h}kk}<0G8!7537373#'#/#5##3J `+*8'/V8U!JJO Qp h]Q# UuY J27-37373#'#'##5##533533533##V)-G),8%1V9U?&4 TW] ;TXL%zJe&?Za]aa!!D '7"/  b. 5!# _(T'.'5!3#&'53w$  fq g(M't$!][WM! C7%3V)-X$  7'73'73y<il> kuy*Hty,F5!#673#&'!#3 _'&EYnO[T&N gY bKj 732654'7#".547&'767Q/0I]SI89{R;Z2!D;J(:AF7yCvH]Zu)AI%!4>/B9IX>H3267&54>73326?3&'#"&5463237#"'#"&54>73#"3268  _= ^) ?*$`n>O %$1"*<6J _fH*96P0D 81V RNkPE@>KF",,SP/=?4#%7IX 23254&#"3267#"&54?#"&54632>?3)-&,$R&>)OQ/>rIM+>(.! Z4< ))!%5`?OX0 hZ$x 6FG6=@2 Z7X3#[X^X7X"&54?'#3673327@_i?BZXZ .kZ5MPQUU(xxFY?X7?6XhZ 6b,%32>7#"&54654#"#>32&#"632-$ L@d <)`AVU6S(-6H.- & ,W %/GH>RP-C'nT$,KA:<F6FOOp "32654&4632#"&cFsT=FsTqaqa`R`Rզzզ0b##"&#"'>32327]$2XB .P 2v5X F#0l'#"&547>54&#"'63232654&COdiSejJ;#"*;2KZI^~9:.69RrdSOqtWK\7),)/J<;~>E'=E'=32326?26-KQbGY"(%1  > % =%&#-CMTPQX[N2tZ  z#/<?X)332?3&'#"&5463237#"&54>73#"326+&>%^) ?*$`n>O 0L1Y _fH*96"4)RNkPE@>KL(WL0D 81#%7:l*423267#"&54654&'#767&5463>54#"EQ $)-XYWKT,/# _!1I:71lH7.HQA &d TI-+2Wm>7N-G 1)9TX)%3267#"&547"&54>73326?3L-&,$R&>)OQ$dD _= Z4%5`?OX0 hZ*n)TO0D 81V,Z=!l=GO'632?6323267#"&54?#"546?654&#"3267>54#"FO40X9N==xl4[*(/ )!2P2X"3>327#"&5473326?3#7&#"2 #5#X-092D_5$ZX_)1*"5NG-4 Q:9FA.I!CPt5g'3267#"&54654.#"#>32+$$)2R %A*A^(!<?_F+D+OT@9$7i2B]7)[Z3#"&FC(^9X732654&#"#3632#"&5P,D+2)_,Z0-E%dYBqX>K8V1-GH!cZAFl,4#"'>3232>7# 54>7>u_ ]%H2ul\S > 1Q=$\ +FB$SNUG(+R_BX +6 #*@$ =9X1363232>7#"&54654#"##"&54733267&["%,W -$ L@d <)^<#52D ^=XF6F%/GH>RP-C*TO$29)V*OX0732>767#"&5467&5733254./3#"'J7" N&QM_u"*BZS: _ZD3C0@',THvX3M'MZs6%"!)-c7I b$/73267#"&54>7&54632&'7>54&#"C9@UTWZ! #H;6/,B:9F)/=lpP(D!2V:H,.. 8 "+.+l%2.#"#"'73254.546# 8"83#.CB.}PTB2K.AB.Il 2'#?25L.K[_9>U847K(9fNX73267#"&5473-&,$R&>)OQ/Z4%5`?OX0 hZ$xZ8l 4.#"32$4632!'267#"l,"/D6.SlTBT,RK +>[a'49;87Au&ShOUPO0&l063263232>7#"&54654#"#654&#"0+mOQ)",W -$ L@d <# -Z4-& rhZF6F%/GH>RP-C6Z(%5#3l 632#7&"#>327654&#"+mOQ/Z$T"_ #5#O* -& rhZ$x1Pt5NG-(MZ(%5#Dl&#"32673#7#".54632hK,D+2)_,Z0-E%dYBqX>K8VϷ-GH!cZANX'%3267#"'#"&54733267473-&,$R&>)U)+QOQ/Z4-&# /Z4%5`?OX0 <3232>7#"&54654#"#7>54&#"#654&#"0+mOQ)"9# L,W -$ L@d <#Z!# -Z4-& rhZ-F6F%/GH>RP-C $Ȫ "!6Z(%5#rrpj#7lz J l'.#"3"3267#"&5467&54632 +4+343@OE=9WQ6`;T6"2wO?m%'27].5?U+c`@g_@a-GAJG41X%%32>7#"&54654#"##7!!632-$ L@d <*`R&,W %/GH>RP-C'RRF6Fnjd#Al!,"&54>54&4632#"'3267>54&#"Yz$A-DSF&S>39[Tz,fV%735&2^)  '?S:[O +<9[ _!5&K[X.% P`^F#VM0D 81. p632#"&'732654&#"qRdaq=eS,JFsT=<4XzF=1Z`R<O,p%#"&54632&#"327Rdaq=eS,JFsT=<4@XzF=1Z`R<NX"&547332>73=Q/Z4-& 7&'7'6_I0B[R S_'N5'"M B.3,=p$dJDyT>,>[N@+  0*yu`Hd97P%'>54'#"54632'&'32J >@eq%=!Zg$V<5|P0$T>e'7R'6?&CD55-T6S Y_fT yj7P 4632&'#"%&'327$5 (VE~/%E,-8pI 1SKX3JP7 mP>32&''67''67&'7> 2*4H =* %;;yV%',JugTT~AI0 (7kO)#F57R.547#"&54732>7M-9/=1CC':L#9 (H+% 1,RTyX_\5'(/#2=*,  '3OW7UP267#"."'>32*Y1cn!A'%1N .'(2%0o<>I>6P'#"&'7632.'&'&'67'>\=][Y3 C<+ #4'p&?'X3_'EaB #b0S65 ?$ee_m) 7=ao-%&''7#52672>54'7#"&547 -&82/&0".#@[:0 (L`}>GTΉ|46tb725#-=7$1E;aZM^-U5;7 Ke "&54632654'7'67&''7&0Qr6fua 3S7+.Eq2n lN  fh$$.(>=[=78"&54732>767'672CF%5?,G;3I*18J.)>@(/' ,!*T:ӛ%7 7"&54>732632'>54#"-;Xmf 5c?G$%#3mB4)= b 0#_!( F 78.547376?'>'3JN'?CJ3?:B74.3_:?&30&NP&@8 "SK^78J2'54#"#"54326,8*-&B1$@&7-".7$EM7 dB2>7.'#"54>7#"5467'632>S.@` 9#5%"84 ~0" !"  $4:A({>3 *")$'/;_W_(bV\$%4H &! *# %I$% ,$ 7R?P 2#"&543254&#"pOK;5M6-O."-PD57#".'&'76--%5 ] (/<"l/'5 1LPKK19WDQ [J/g -ed78 ",52.'#"&54632>4#"%"327&$V_M+*1>TiE#+Y,=RX/M07& % hA7]C/!=uc";V38(-$ 5 -' P 3LXu 'x7P 462&#"6"3277>BM/ApC1~!Ȁm } 7k^>53#"&54747.1:6#1@,Ly6W37W?:X.kH$ /KsID78]'654#"'67632]1-(_D3,Qr-D64=EP<27# 7>77%)!5!+&7WL H[7P2'67654'"#"'732<.$    v XTP+# 0 - 6 7P9>32'>7#"54>7&#"#"'732632 LL6f* &0 O8, & Y " Y V$. $ go 5  ,  $   5 0 7Z>3267.#"7z$+)"h4WN,?98!!$&)M*g(P+7# 7>7'>7&(!5"*%%)!5!+&7XL G\WL H[7#, %>7'>7'>7y%)!5$($&(!5"*%%)!5!+&7T K QYXL G\WL H[7 2#"&546}!/*#-),".,! .n) 9`$&*-24679:;<=DIJMPQSUVWXYZ[\]  !"#$%&+-/389:;<=>?@2  ; Q Z [ \ ] d e f g  $$$$&$*$,$2$4$6$7$9$:$;$<$=$D$F$G$H$I$J$P$Q$R$S$T$U$V$W$X$Y$Z$\$]$m$}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$ $!$"$#$$$%$&$+$-$/$1$3$8$9$:$;$<$=$>$?$@$ ;$ Q$ Z$ [$ \$ ]$ d$ e$ f$ g$ $ $ $ $ $ $ $$$$%%%%$%&%*%,%2%4%6%7%9%:%;%<%=%D%I%J%M%P%Q%R%S%U%V%W%X%Y%Z%[%\%]%m%}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%% %!%"%#%$%%%&%+%-%/%1%3%8%9%:%;%<%=%>%?%@% ;% Q% Z% [% \% ]% d% e% f% g% % % % % % % %%%%&&&$&&&*&,&2&4&6&7&9&:&;&<&=&D&I&J&M&P&Q&R&S&U&V&W&X&Y&Z&[&\&]&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&& &!&"&#&$&%&&&+&-&/&1&3&8&9&:&;&<&=&>&?&@& ;& Q& Z& [& \& ]& d& e& f& g& & & & & & &&&&'''$'&'*','-'2'4'6'7'9':';'<'='D'F'G'H'I'J'M'P'Q'R'S'T'U'V'W'X'Y'Z'['\']'}''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''' '!'"'#'$'%'&'+'-'/'1'3'8'9':';'<'='>'?'@' ;' Q' Z' [' \' ]' d' e' f' g' ' ' ' ' ' ''''($(&(*(,(-(2(4(6(7(9(:(;(<(=(D(F(G(H(I(J(M(P(Q(R(S(T(U(V(W(X(Y(Z([(\(]((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( (((((((((((( (!("(#($(%(&(+(-(/(1(3(8(9(:(;(<(=(>(?(@( ;( Q( Z( [( \( ]( d( e( f( g( ( (((())))$)&)*),)-)2)4)6)9):);)<)=)D)F)G)H)I)J)M)P)Q)R)S)T)U)V)W)X)Y)Z)[)\)])m)}))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))) )!)")#)%)+)-)/)1)3)8)9):);)<)=)>)?)@) ;) Q) Z) [) \) ]) e) g) ) ) ) ))))***$*&***,*2*4*6*7*9*:*;*<*=*D*I*J*M*P*Q*R*S*U*V*W*X*Y*Z*[*\*]*}*********************************************************** ************ *!*"*#*$*%*&*+*-*/*1*3*8*9*:*;*<*=*>*?*@* ;* Q* Z* [* \* ]* d* e* f* g* * * * * * ****,$,&,*,,,2,4,6,7,9,:,;,<,=,D,F,G,H,I,J,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,],,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,!,",#,$,%,&,+,-,/,1,3,8,9,:,;,<,=,>,?,@, ;, Q, Z, [, \, ], d, e, f, g, , ,,,,-$-&-*-,-2-4-6-9-:-;-<-=-D-F-G-H-J-M-P-Q-R-S-T-U-V-X-Y-Z-[-\-]----------------------------------------------------------------------- ------------ -!-"-#-+---/-1-3-8-9-:-;-<-=->-?-@- ;- Q- Z- [- \- ]- - ....&.*.,.2.4.6.D.F.G.H.I.J.M.P.Q.R.S.T.U.V.W.X.Y.Z.[.\.].m.}............................................................ ............ .!.".#.%.+.-./.1.3.9.<.>.@. ;. Q. Z. [. \. ]. e. g. . . . . . ....////&/*/,/2/4/6/7/9/:/</D/F/G/H/I/J/M/P/Q/R/T/U/V/W/X/Y/Z/\/]/m/}///////////////////////////////////////////////////////////// //////////// /!/"/#/$/%/&/+/-///1/3/8/9/:/</>/@/ ;/ Z/ [/ \/ ]/ d/ e/ f/ g/ / / / / / / ////222$2,2627292:2;2<2=2D2J2P2Q2S2U2X2]2}222222222222222222222222222222222222 222 2"2$2&2+2-2/2123282:2;2<2=2>2?2@2 ;2 Q2 Z2 \2 d2 f2 2 2 2 2 3333$3&3*3,3-32343637393:3;3<3=3D3F3G3H3J3P3Q3R3S3T3U3V3X3[3]3m3}333333333333333333333333333333333333333333333333333333333333333333333 333333333333 3!3"3#3$3&3+3-3/3133383:3;3<3=3>3?3@3 ;3 Q3 Z3 [3 \3 ]3 d3 f3 3 3 3 3 3 444$4,4647494:4;4<4=4D4J4P4Q4S4U4X4]4}444444444444444444444444444444444444 444 4"4$4&4+4-4/4143484:4;4<4=4>4?4@4 ;4 Q4 Z4 \4 d4 f4 4 4 4 4 5$5&5*5,52545657595:5;5<5=5D5F5G5H5J5M5P5Q5R5S5T5U5V5X5Y5Z5\5]55555555555555555555555555555555555555555555555555555555555555555555555 555555555555 5!5"5#5$5&5+5-5/515358595:5;5<5=5>5?5@5 ;5 Q5 Z5 [5 \5 ]5 d5 f5 5 6666$6&6*6,62646667696:6;6<6=6I6M6P6Q6R6S6U6W6X6Y6Z6[6\6]6m6}6666666666666666666666666666666666666666666666 66666666666 6"6$6%6&6+6-6/616368696:6;6<6=6>6?6@6 ;6 Q6 Z6 \6 d6 e6 f6 g6 6 6 6 6 6 6 66667777$7&7*7,7-727476797:7;7<7=7D7F7G7H7I7J7P7Q7R7S7T7U7V7W7X7Y7Z7[7\7]7m7}77777777777777777777777777777777777777777777777777777777777777777777777 777777777777 7!7"7#7%7+7-7/717378797:7;7<7=7>7?7@7 ;7 Q7 Z7 [7 \7 ]7 e7 g7 7 7 7 77779999$9&9*9,9-9294969;9=9D9F9G9H9I9J9P9Q9R9S9T9U9V9W9X9Y9Z9[9\9]9m9}9999999999999999999999999999999999999999999999999999999999999999999999 999999999999 9!9"9#9%9+9-9/9193999;9<9=9>9?9@9 ;9 Q9 Z9 [9 \9 ]9 e9 g9 9 9 9999::::$:&:*:,:-:2:4:6:;:=:D:F:G:H:I:J:P:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:m:}:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::: :!:":#:%:+:-:/:1:3:9:;:<:=:>:?:@: ;: Q: Z: [: \: ]: e: g: : : ::::;;;;&;*;,;2;4;6;D;F;G;H;I;J;M;P;Q;R;S;T;U;V;W;X;Y;Z;[;\;];m;};;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;; ;!;";#;%;+;-;/;1;3;9;<;>;@; ;; Q; Z; [; \; ]; e; g; ; ; ; ; ; ;;;;<<<<$<&<*<,<-<2<4<6<;<=<D<F<G<H<I<J<P<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<m<}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<< <!<"<#<%<+<-</<1<3<9<;<<<=<><?<@< ;< Q< Z< [< \< ]< e< g< < < <<<<====&=*=,=2=4=6=D=F=G=H=I=J=M=P=Q=R=S=T=U=V=W=X=Y=Z=[=\=]=m=}============================================================ ============ =!="=#=%=+=-=/=1=3=9=<=>=@= ;= Q= Z= [= \= ]= e= g= = = = = = ====DDDDDDFDGDIDJDPDQDRDTDUDVDWDXDYDZD[D\D]DmD}DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDD!D#D%D+D-D/D1D3D9D<D>D@D2D D D [D ]D eD gD D D D D D DDDDDEEEMEPEQEUEXEYEZE[E\E]EEEEEEEEEE EE+E-E/E1E3E9E<E>E@E2E E E E FFFPFQFUFXF[F]FFFFFFFF FF+F-F/F1F3F<F>F@F2F F F GDGHGJGPGQGSGUGVGXG]GGGGGGGGGGGGGGGGGGGGGGGGGGGG GGG!G#G+G-G/G1G3G<G>G@G2G QG [G ]HHHHDHIHJHMHPHQHSHUHVHWHXHYHZH[H\H]HmHHHHHHHHHHHHHHHHHHHHHHH HHH!H#H%H+H-H/H1H3H9H<H>H@H2H H QH [H ]H eH gH H H H H HHHHHIIIIDIFIGIHIJIPIQIRITIUIVIXI[I]ImI}IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIII!I#I+I-I/I1I3I<I>I@I2I I [I ]I I JJJJFJGJHJRJTJmJ}JJJJJJJJJJJJJJJJJJJJJJJ J J J J J KKKKFKGKHKMKPKQKRKSKTKUKVKXKYKZK[K\K]KmK}KKKKKKKKKKKKKKKKKKKKKKKKKKKK KKKKKKK!K#K+K-K/K1K3K9K<K>K@K2K K QK [K ]K K K K K K NNNNDNFNGNHNJNPNQNRNSNTNUNVNXNYNZN\N]NmN}NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNN!N#N+N-N/N1N3N9N<N>N@N2N N QN [N ]N N N N N N PPPPFPGPHPMPPPQPRPSPTPUPVPXPYPZP[P\P]PmP}PPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPP!P#P+P-P/P1P3P9P<P>P@P2P P QP [P ]P P P P P P QQQQFQGQHQMQPQQQRQSQTQUQVQXQYQZQ[Q\Q]QmQ}QQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQ!Q#Q+Q-Q/Q1Q3Q9Q<Q>Q@Q2Q Q QQ [Q ]Q Q Q Q Q Q RRRRDRIRJRMRPRQRSRURVRWRXRYRZR[R\R]RmRRRRRRRRRRRRRRRRRRRRRRR RRR!R#R%R+R-R/R1R3R9R<R>R@R2R R QR [R ]R eR gR R R R R RRRRRSSSMSPSQSUSXSYSZS[S\S]SSSSSSSSSS SS+S-S/S1S3S9S<S>S@S2S S S S UUUUDUFUGUHUJUPUQURUTUVUXU[U]UmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU UUUUUU!U#U+U-U/U1U3U<U>U@U2U U [U ]U VVVVDVFVIVJVMVPVQVRVSVUVVVWVXVYVZV[V\V]VmV}VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVV!V#V%V+V-V/V1V3V9V<V>V@V2V V QV [V ]V eV gV V V V V V VVVVVWDWFWGWHWIWJWPWQWRWTWUWVWWW[W]W}WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWW!W#W%W<W>W@W2W W W [W ]W eW gW WWWWWXXXXFXGXHXRXTXmX}XXXXXXXXXXXXXXXXXXXXXXX X X X X X YYYYDYFYGYHYIYJYMYPYQYRYSYTYUYVYWYXY[Y]YmY}YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY YYYYYYY!Y#Y%Y+Y-Y/Y1Y3Y<Y>Y@Y2Y Y Y QY [Y ]Y eY gY Y Y Y Y YYYYYZZZZDZFZGZHZIZJZMZPZQZRZSZTZUZVZWZXZ[Z]ZmZ}ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZ!Z#Z%Z+Z-Z/Z1Z3Z<Z>Z@Z2Z Z Z QZ [Z ]Z eZ gZ Z Z Z Z ZZZZZ[[[[D[F[G[H[J[P[Q[R[S[T[U[V[X[Y[Z[\[][m[}[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[![#[+[-[/[1[3[9[<[>[@[2[ [ Q[ [[ ][ [ [ [ [ [ \\\\D\F\G\H\I\J\M\P\Q\R\S\T\U\V\W\X\[\]\m\}\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\!\#\%\+\-\/\1\3\<\>\@\2\ \ \ Q\ [\ ]\ e\ g\ \ \ \ \ \\\\\]]]]D]F]G]H]I]J]M]P]Q]R]S]T]U]V]W]X]Y]Z][]\]]]m]}]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]!]#]%]+]-]/]1]3]9]<]>]@]2] ] ] Q] [] ]] e] g] ] ] ] ] ] ]]]]]m$m&m*m2m4m6m7m9m:m;m<m=mDmFmGmHmImJmMmPmQmRmSmTmUmWmXmYmZm[m\m]mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm mmmmmmmmmmm m"m$m%m&m+m-m/m3m8m9m:m;m<m=m>m?m@m2m m ;m Qm Zm \m dm em fm gm m mmmmm}$}&}*}-}2}4}6}7}9}:};}<}=}D}I}J}M}P}Q}S}U}V}W}X}Y}Z}[}\}]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}} }!}"}#}$}%}&}+}-}/}3}8}9}:};}<}=}>}?}@}2} } ;} Q} Z} [} \} ]} d} e} f} g} } }}}}}&*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DFGHIJPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DFGHIJPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DFGHIJPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DFGHIJPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DIJMPQRSUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $&*,-246;=DFGHIJPQRSTUVWXYZ[\]m}  !"#%+-/139;<=>?@ ; Q Z [ \ ] e g  $&*,24679:;<=DIJMPQRSUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DIJMPQSUVWXYZ[\] !#%+-/139<>@2  Q [ ] e g PQUX[] +-/13<>@2 DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g FGHMPQRSTUVXYZ[\]m} !#+-/139<>@2  Q [ ]  DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g FGHRTm}   FGHRTm}   FGHRTm}   FGHRTm}   DFGHIJMPQRSTUVWX[]m} !#%+-/13<>@2   Q [ ] e g  DFGHIJMPQRSTUVWX[]m} !#%+-/13<>@2   Q [ ] e g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  )H 7DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g DFGIJPQRTUVWXYZ[\] !#%+-/139<>@2   [ ] e g $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g PQUX[] +-/13<>@2$&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g PQUX[] +-/13<>@2 $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g PQUX[] +-/13<>@2$&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g PQUX[] +-/13<>@2 $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\] !#%+-/139<>@2  Q [ ] e g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g DIJMPQSUVWXYZ[\] !#%+-/139<>@2  Q [ ] e g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g DIJMPQSUVWXYZ[\] !#%+-/139<>@2  Q [ ] e g $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g FGHRTm}   $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g FGHRTm}   $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g FGHRTm}   &*,246DFGHIJMPQRSTUVWXYZ[\]m}  !"#%+-/139<>@ ; Q Z [ \ ] e g  DFGHJPQRSTUVXYZ\]m} !#+-/139<>@2  Q [ ]  &*,24679:<DFGHIJMPQRTUVWXYZ\]m}  !"#$%&+-/1389:<>@ ; Z [ \ ] d e f g  &*,24679:<DFGHIJMPQRTUVWXYZ\]m}  !"#$%&+-/1389:<>@ ; Z [ \ ] d e f g  &*,24679:<DFGHIJMPQRTUVWXYZ\]m}  !"#$%&+-/1389:<>@ ; Z [ \ ] d e f g  &*,24679:<DFGHIJMPQRTUVWXYZ\]m}  !"#$%&+-/1389:<>@ ; Z [ \ ] d e f g       FGHMPQRSTUVXYZ[\]m} !#+-/139<>@2  Q [ ]      FGHMPQRSTUVXYZ[\]m} !#+-/139<>@2  Q [ ]          F G H M P Q R S T U V X Y Z [ \ ] m }                                    ! # + - / 1 3 9 < > @ 2  Q [ ]      $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f     DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g     $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f     DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g     $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f     DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g     $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  DIJMPQSUVWXYZ[\] !#%+-/139<>@2  Q [ ] e g $&*,24679:;<=DFGHJMPQRSTUVXYZ\]  !"#$&+-/1389:;<=>?@ ; Q Z [ \ ] d f  DFGHJPQRTVX[]m !#+-/13<>@2  [ ] $&*,24679:;<=IMPQRSUWXYZ[\]m}  "$%&+-/1389:;<=>?@ ; Q Z \ d e f g       DFIJMPQRSUVWXYZ[\]m} !#%+-/139<>@2  Q [ ] e g          $ & * , 2 4 6 7 9 : ; < = I M P Q R S U W X Y Z [ \ ] m }                                                            " $ % & + - / 1 3 8 9 : ; < = > ? @ ; Q Z \ d e f g           !!!!D!F!I!J!M!P!Q!R!S!U!V!W!X!Y!Z![!\!]!m!}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!#!%!+!-!/!1!3!9!<!>!@!2! ! Q! [! ]! e! g! ! ! ! ! ! !!!!!""""$"&"*","2"4"6"7"9":";"<"="I"M"P"Q"R"S"U"W"X"Y"Z"["\"]"m"}"""""""""""""""""""""""""""""""""""""""""""""" """"""""""" """$"%"&"+"-"/"1"3"8"9":";"<"=">"?"@" ;" Q" Z" \" d" e" f" g" " " " " " " """"####D#F#I#J#M#P#Q#R#S#U#V#W#X#Y#Z#[#\#]#m#}################################ #######!###%#+#-#/#1#3#9#<#>#@#2# # Q# [# ]# e# g# # # # # # #####$$$$$$&$*$,$-$2$4$6$9$:$;$<$=$D$F$G$H$I$J$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$m$}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$ $!$"$#$%$+$-$/$1$3$8$9$:$;$<$=$>$?$@$ ;$ Q$ Z$ [$ \$ ]$ e$ g$ $ $ $ $$$$%D%F%G%H%I%J%P%Q%R%T%U%V%W%[%]%}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%!%#%%%<%>%@%2% % % [% ]% e% g% %%%%%&$&&&*&,&-&2&4&6&9&:&;&<&=&D&F&G&H&I&J&P&Q&R&S&T&U&V&W&X&Y&Z&[&\&]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&& &!&"&#&%&+&-&/&1&3&8&9&:&;&<&=&>&?&@& ;& Q& Z& [& \& ]& e& g& & &&&&+F+G+H+R+T+++++++++++++++++++++++ ----F-G-H-R-T-m-}----------------------- - - - - - ////F/G/H/R/T/m/}/////////////////////// / / / / / 1F1G1H1R1T11111111111111111111111 3333F3G3H3R3T3m3}33333333333333333333333 3 3 3 3 3 8888$8&8*8,8-8284868;8=8D8F8G8H8I8J8P8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8m8}8888888888888888888888888888888888888888888888888888888888888888888888 888888888888 8!8"8#8%8+8-8/8183898;8<8=8>8?8@8 ;8 Q8 Z8 [8 \8 ]8 e8 g8 8 8 88889999D9F9G9H9I9J9M9P9Q9R9S9T9U9V9W9X9[9]9m9}999999999999999999999999999999999999999 9999999!9#9%9+9-9/91939<9>9@929 9 9 Q9 [9 ]9 e9 g9 9 9 9 9 99999::::$:&:*:,:-:2:4:6:;:=:D:F:G:H:I:J:P:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:m:}:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::: :!:":#:%:+:-:/:1:3:9:;:<:=:>:?:@: ;: Q: Z: [: \: ]: e: g: : : ::::;;;;m;}; ; ; ; ; <<<<D<F<G<H<I<J<M<P<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<m<}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<!<#<%<+<-</<1<3<9<<<><@<2< < < Q< [< ]< e< g< < < < < < <<<<<====m=}= = = = = >>>>D>F>G>H>I>J>M>P>Q>R>S>T>U>V>W>X>Y>Z>[>\>]>m>}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>!>#>%>+>->/>1>3>9><>>>@>2> > > Q> [> ]> e> g> > > > > > >>>>>????&?*?,?2?4?6?D?F?G?H?I?J?M?P?Q?R?S?T?U?V?W?X?Y?Z?[?\?]?m?}???????????????????????????????????????????????????????????? ???????????? ?!?"?#?%?+?-?/?1?3?9?<?>?@? ;? Q? Z? [? \? ]? e? g? ? ? ? ? ? ????@@@@D@F@G@H@I@J@M@P@Q@R@S@T@U@V@W@X@Y@Z@[@\@]@m@}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@!@#@%@+@-@/@1@3@9@<@>@@@2@ @ @ Q@ [@ ]@ e@ g@ @ @ @ @ @ @@@@@y$y&y*y,y2y4y6y7y9y:y;y<y=yDyIyJyMyPyQyRySyUyVyWyXyYyZy[y\y]yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy yyyyyyyyyyyy y!y"y#y$y%y&y+y-y/y1y3y8y9y:y;y<y=y>y?y@y ;y Qy Zy [y \y ]y dy ey fy gy y yyyy$&*,-24679:;<=DFGHJPQRSTUVX[]m}  !"#$&+-/138:;<=>?@ ; Q Z [ \ ] d f      2222m2}2 2 2 2 2 jkjwj~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkksks~sssssssssssssssssssssssssssssssssssssssssssssssssssssukuwu~uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuzkzwz~zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz~~k~kw~kw~kw~    $ & * , 2 4 6 7 9 : ; < = D I J M P Q R S U V W X Y Z [ \ ] m }                ! " # $ % & + - / 1 3 8 9 : ; < = > ? @ ; Q Z [ \ ] d e f g         $ & * , - 2 4 6 7 9 : ; < = D F G H I J M P Q R S T U V W X Y Z [ \ ]                                                                                    ! " # $ % & + - / 1 3 8 9 : ; < = > ? @  ;  Q  Z  [  \  ]  d  e  f  g       D H J P Q S U V X ]                               ! # + - / 1 3 < > @ 2  Q  [  ]    $ & * , - 2 4 6 9 : ; < = D F G H I J M P Q R S T U V W X Y Z [ \ ] m }                                                                                    ! " # % + - / 1 3 8 9 : ; < = > ? @  ;  Q  Z  [  \  ]  e  g              D F G H J P Q R T U V X [ ] m }                                              ! # + - / 1 3 < > @ 2    [  ]        F G H M P Q R S T U V X Y Z [ \ ] m }                                   ! # + - / 1 3 9 < > @ 2    Q  [  ]         ; ; ; ;F ;G ;H ;M ;P ;Q ;R ;S ;T ;U ;V ;X ;Y ;Z ;[ ;\ ;] ;m ;} ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;! ;# ;+ ;- ;/ ;1 ;3 ;9 ;< ;> ;@ ;2 ;  ; Q ; [ ; ] ; ; ; ; ;  ;  P P P P$ P& P* P, P- P2 P4 P6 P7 P9 P: P; P< P= PD PF PG PH PJ PP PQ PR PS PT PU PV PX P[ P] Pm P} P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P! P" P# P$ P& P+ P- P/ P1 P3 P8 P: P; P< P= P> P? P@ P ; P Q P Z P [ P \ P ] P d P f P P P P P  P  Q Q QM QP QQ QU QX QY QZ Q[ Q\ Q] Q Q Q Q Q Q Q Q Q Q Q Q+ Q- Q/ Q1 Q3 Q9 Q< Q> Q@ Q2 Q Q Q Q Z Z Z Z$ Z& Z* Z, Z2 Z4 Z6 Z7 Z9 Z: Z; Z< Z= ZI ZM ZP ZQ ZR ZS ZU ZW ZX ZY ZZ Z[ Z\ Z] Zm Z} Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z" Z$ Z% Z& Z+ Z- Z/ Z1 Z3 Z8 Z9 Z: Z; Z< Z= Z> Z? Z@ Z ; Z Q Z Z Z \ Z d Z e Z f Z g Z Z Z Z Z Z  Z  Z Z Z Z [ [ [ [D [F [I [J [M [P [Q [R [S [U [V [W [X [Y [Z [[ [\ [] [m [} [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [! [# [% [+ [- [/ [1 [3 [9 [< [> [@ [2 [  [ Q [ [ [ ] [ e [ g [ [ [ [ [  [  [ [ [ [ [ \ \ \ \$ \& \* \, \2 \4 \6 \7 \9 \: \; \< \= \I \M \P \Q \R \S \U \W \X \Y \Z \[ \\ \] \m \} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \" \$ \% \& \+ \- \/ \1 \3 \8 \9 \: \; \< \= \> \? \@ \ ; \ Q \ Z \ \ \ d \ e \ f \ g \ \ \ \ \ \  \  \ \ \ \ ] ] ] ]D ]F ]I ]J ]M ]P ]Q ]R ]S ]U ]V ]W ]X ]Y ]Z ][ ]\ ]] ]m ]} ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]! ]# ]% ]+ ]- ]/ ]1 ]3 ]9 ]< ]> ]@ ]2 ]  ] Q ] [ ] ] ] e ] g ] ] ] ] ]  ]  ] ] ] ] ] d d d d$ d& d* d, d- d2 d4 d6 d9 d: d; d< d= dD dF dG dH dI dJ dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] dm d} d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d! d" d# d% d+ d- d/ d1 d3 d8 d9 d: d; d< d= d> d? d@ d ; d Q d Z d [ d \ d ] d e d g d d d  d  d d d d eD eF eG eH eI eJ eP eQ eR eT eU eV eW e[ e] e} e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e! e# e% e< e> e@ e2 e  e  e [ e ] e e e g e  e e e e e f f f f$ f& f* f, f- f2 f4 f6 f9 f: f; f< f= fD fF fG fH fI fJ fP fQ fR fS fT fU fV fW fX fY fZ f[ f\ f] fm f} f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f! f" f# f% f+ f- f/ f1 f3 f8 f9 f: f; f< f= f> f? f@ f ; f Q f Z f [ f \ f ] f e f g f f f  f  f f f f gD gF gG gH gI gJ gP gQ gR gT gU gV gW g[ g] g} g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g! g# g% g< g> g@ g2 g  g  g [ g ] g e g g g  g g g g g $ & * , - 2 4 6 7 9 : ; < = D F G H I J M P Q R S T U V W X Y Z [ \ ]                ! " # $ % & + - / 1 3 8 9 : ; < = > ? @ ; Q Z [ \ ] d e f g        $ & * , - 2 4 6 ; = D F G H I J P Q R S T U V W X Y Z [ \ ] m }                ! " # % + - / 1 3 9 ; < = > ? @ ; Q Z [ \ ] e g          D F G H I J M P Q R S T U V W X [ ] m }          ! # % + - / 1 3 < > @ 2   Q [ ] e g        $ & * - 2 4 6 ; = D F G H J P Q R S T U V X ]                ! " # + - / 3 ; < = > ? @ 2 ; Q Z [ \ ] $ & * 2 4 6 9 : < D F G H J P Q R S T U V X Y Z [ \ ]                ! " # + - / 3 8 9 : < > @ 2 ; Q Z [ \ ] & * 2 4 6 7 9 : ; < = D F G H I J P Q R S T U V W X Y Z [ \ ]                ! " # $ % & + - / 3 8 9 : ; < = > ? @ 2  ; Q Z [ \ ] d e f g      $ & * - 2 4 6 ; = D F G H J P Q R S T U V X ]                ! " # + - / 3 ; < = > ? @ 2 ; Q Z [ \ ] & * 2 4 6 7 9 : ; < = D F G H I J P Q R S T U V W X Y Z [ \ ]                ! " # $ % & + - / 3 8 9 : ; < = > ? @ 2  ; Q Z [ \ ] d e f g      $ & * 2 4 6 7 9 : ; < = D F G H I J M P Q R S T U W X Y Z [ \ ]                                                                          " $ % & + - / 3 8 9 : ; < = > ? @ 2    ;  Q  Z  \  d  e  f  g        $ & * - 2 4 6 7 9 : ; < = D I J M P Q S U V W X Y Z [ \ ]                                                      ! " # $ % & + - / 3 8 9 : ; < = > ? @ 2    ;  Q  Z  [  \  ]  d  e  f  g       DFGHJPQRTUVX[]m} !#+-/13<>@2  [ ]  0FE%N   +e  -$E   t     J t 6   V   H      f H     !T" r$& :'$*j-Copyleft 2002, 2003, 2005, 2008, 2009, 2010 Free Software Foundation.Copyleft 2002, 2003, 2005, 2008, 2009, 2010 Free Software Foundation.FreeSansFreeSansMediumMediumFontForge 2.0 : Free Sans : 19-9-2010FontForge 2.0 : Free Sans : 19-9-2010Free SansFree SansVersion $Revision: 1.344 $ Version $Revision: 1.344 $ FreeSansFreeSansGNUGNUhttps://savannah.gnu.org/projects/freefont/https://savannah.gnu.org/projects/freefont/This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.htmlva?@O<V9NormalNormalNormalNavadnoNormlne1KG=K9NormalNormalOdmiana ZwykBaNormalnormalusisvidjsMediomenengahNormlMittelNormalNormaaliGemiddeldnormaloby ejn=>@<0;5=ArruntaP2  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ softhyphenmicromiddotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexTcedillatcedillaTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018F Epsilonlatinuni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019EObarOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6Yoghuni01B8uni01B9uni01BAuni01BBuni01BEwynnuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFicaronuni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9Oogonekoogonekuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5Wynnuni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208 idblgraveuni020Aiinvertedbreveuni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0224uni0225 A_dotaccent a_dotaccentuni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233dotlessjaturnascript ascriptturnbhookcturnccurldtaildhookerevschwa schwahook epsilonlatinepsilonlatinrevepsilonlatinrevhookepsilonlatinrevclosed jdotlessbarghookgscript Gsmallcap gammalatinramshornhturnhhookhenghookibar iotalatin Ismallcap lmidtildelbeltlrthooklezhmturnedmlonglegturnedmhook nhookleftnrthook Nsmallcapobar OEsmallcap omegaclosedphilatinrturnrlonglegturned rhookturnedrlonglegrhook rfishhook rfishhookrev Rsmallcap Rsmallcapinvshookeshdotlessjstrokehook eshshortreveshcurltturntrthookubar upsilonlatinvhookvturnwturnyturn Ysmallcapzrthookzcurlezhezhcurl glottalstopglottalstoprevinvglottalstopinvcstretch bilabialclick Bsmallcap epsilonclosed Gsmallhook Hsmallcap jcrosstailkturn Lsmallcapqhookglottalstopbarglottalstopbarrevdzaltonedezhdzcurltsteshtccurluni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFhsuper hhooksuperjsuperrsuper rturnsuperrturnrthooksuper Rturnsuperwsuperysuperprimemod dblprimemod quoteleftmod apostrophe apostropherev ringhalfright ringhalfleftglottalstopmodglottalstopreversedmodfrontedbackedraisedloweredverticallinemodmacronmodifier acutemodifier gravemodifierverticallinelowmod macronlowmodgravesubacutesubcolontriangularmodcolontriangularhalfmodringhalfrightcenteredringhalfleftcentered tackupmid tackdownmidplusmodminusmoduni02DEuni02DF gammasuperlsuperssuperxsuperglottalrevsuper toneextrahightonehightonemidtonelow toneextralowuni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecomb circumflexcmb tildecomb macroncmb overlinecmbbrevecmb dotaccentcmb diaeresiscomb hookabovecombringcmbhungarumlautcmbcaroncmbverticallineabovecmbdblverticallineabovecmb gravedblnospcandrabinducmbbreveinvertedcmbcommaturnedabovecmb psilicomb dasiacombcommaaboverightcmb gravebelowcmb acutebelowcmblefttackbelowcmbuni0319uni031Ahorncmbringlefthalfsubnospuptackbelowcmbuni031Euni031F minusbelowcmbhookpalatalizedbelowcmbhookretroflexbelowcmb dotbelowcombdieresisbelowcmb ringbelowcmb commasubnosp cedillacmb ogonekcmblinevertsubnospbridgebelowcmbdblarchinvertedbelowcmb caronbelowcmbcircumflexbelowcmb brevebelowcmbbreveinvertedbelowcmb tildebelowcmbmacronbelowcmb lowlinecmb dbllowlinecmbtildeoverlaycmbstrokeshortoverlaycmbstrokelongoverlaycmbsolidusshortoverlaycmbsoliduslongoverlaycmbringrighthalfsubnospbridgeinvertedbelowcmbsquarebelowcmbseagullbelowcmb xabovecmbtildeverticalcmbdbloverlinecmbuni0340uni0341uni0342uni0343diaeresistonosnospuni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375 ypogegrammeniuni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonostheta1 UpsilonhookUpsilonhooktonosUpsilonhookdiaeresisphi1 pisymbolgreekuni03D7uni03F0rhosymbolgreekuni03f4uni03F5Iecyrillic_grave Iocyrillic Djecyrillic Gjecyrillic Ecyrillic Dzecyrillic Icyrillic Yicyrillic Jecyrillic Ljecyrillic Njecyrillic Tshecyrillic KjecyrillicIicyrillic_graveUshortcyrillic Dzhecyrillic Acyrillic Becyrillic Vecyrillic Gecyrillic Decyrillic Iecyrillic Zhecyrillic Zecyrillic IicyrillicIishortcyrillic Kacyrillic Elcyrillic Emcyrillic Encyrillic Ocyrillic Pecyrillic Ercyrillic Escyrillic Tecyrillic Ucyrillic Efcyrillic Khacyrillic Tsecyrillic Checyrillic Shacyrillic ShchacyrillicHardsigncyrillic YericyrillicSoftsigncyrillicEreversedcyrillic IUcyrillic IAcyrillic acyrillic becyrillic vecyrillic gecyrillic decyrillic iecyrillic zhecyrillic zecyrillic iicyrilliciishortcyrillic kacyrillic elcyrillic emcyrillic encyrillic ocyrillic pecyrillic ercyrillic escyrillic tecyrillic ucyrillic efcyrillic khacyrillic tsecyrillic checyrillic shacyrillic shchacyrillichardsigncyrillic yericyrillicsoftsigncyrillicereversedcyrillic iucyrillic iacyrilliciecyrillic_grave iocyrillic djecyrillic gjecyrillic ecyrillic dzecyrillic icyrillic yicyrillic jecyrillic ljecyrillic njecyrillic tshecyrillic kjecyrilliciicyrillic_graveushortcyrillic dzhecyrillic Omegacyrillic omegacyrillicuni0470uni0471 Fitacyrillic fitacyrillicOmegatitlocyrillicomegatitlocyrillic Otcyrillic otcyrillicthousandcyrillictitlocyrilliccmbpalatalizationcyrilliccmbdasiapneumatacyrilliccmbpsilipneumatacyrilliccmbuni0487uni0488uni0489uni048auni048buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04d9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFDzeabkhasiancyrillicuni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04f6uni04f7uni04F8uni04F9uni0510uni0511uni0512uni0513uni051auni051buni051cuni051duni051euni051funi0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564 echarmenianuni0566uni0567uni0568uni0569uni056A iniarmenianuni056C xeharmenianuni056Euni056Funi0570uni0571uni0572uni0573 menarmenianuni0575 nowarmenianuni0577uni0578uni0579uni057Auni057Buni057Cuni057D vewarmenianuni057Funi0580uni0581 yiwnarmenianuni0583uni0584uni0585uni0586echyiwnarmenianuni0589uni058A afii57799 afii57801 afii57800 afii57802 hiriqhebrew tserehebrew segolhebrew patahhebrew qamatshebrew holamhebrew afii57796 dageshhebrew afii57839 afii57645 rafehebrew afii57842 shindothebrew sindothebrewsofpasuqhebrewupperdothebrew alefhebrew bethebrew gimelhebrew dalethebrewhehebrew vavhebrew zayinhebrew hethebrew tethebrew yodhebrewfinalkafhebrew kafhebrew lamedhebrewfinalmemhebrew memhebrewfinalnunhebrew nunhebrew samekhhebrew ayinhebrew finalpehebrewpehebrew tsadifinal tsadihebrew qofhebrew reshhebrew shinhebrew tavhebrew vavvavhebrew vavyodhebrew yodyodhebrew gereshhebrewgershayimhebrewuni0700uni0701uni0702uni0703uni0704uni0705uni0706uni0707uni0708uni0709uni070Auni070Buni070Cuni070Duni070Funi0710uni0711uni0712uni0713uni0714uni0715uni0716uni0717uni0718uni0719uni071Auni071Buni071Cuni071Duni071Euni071Funi0720uni0721uni0722uni0723uni0724uni0725uni0726uni0727uni0728uni0729uni072Auni072Buni072Cuni0730uni0731uni0732uni0733uni0734uni0735uni0736uni0737uni0738uni0739uni073Auni073Buni073Cuni073Duni073Euni073Funi0740uni0741uni0742uni0743uni0744uni0745uni0746uni0747uni0748uni0749uni074Auni0900candrabindudeva anusvaradeva visargadevauni0904adevaaadevaidevaiidevaudevauudeva rvocalicdeva lvocalicdeva ecandradeva eshortdevaedevaaideva ocandradeva oshortdevaodevaaudevakadevakhadevagadevaghadevangadevacadevachadevajadevajhadevanyadevattadevatthadevaddadevaddhadevannadevatadevathadevadadevadhadevanadevannnadevapadevaphadevabadevabhadevamadevayadevaradevarradevaladevalladevallladevavadevashadevassadevasadevahadeva nuktadeva avagrahadevaaavowelsigndevaivowelsigndevaiivowelsigndevauvowelsigndevauuvowelsigndevarvocalicvowelsigndevarrvocalicvowelsigndevaecandravowelsigndevaeshortvowelsigndevaevowelsigndevaaivowelsigndevaocandravowelsigndevaoshortvowelsigndevaovowelsigndevaauvowelsigndeva viramadevauni094eomdeva udattadeva anudattadeva gravedeva acutedevauni0955qadevakhhadevaghhadevazadeva dddhadevarhadevafadevayyadeva rrvocalicdeva llvocalicdevalvocalicvowelsigndevauni0963uni0964dbldandazerodevaonedevatwodevauni0969uni096Auni096Bsixdevauni096D eightdevaninedevaabbreviationsigndevauni0971uni0972uni0979uni097auni097buni097cuni097duni097euni097fbn_candrabindu bn_anusvara bn_visargabn_abn_aabn_ibn_iibn_ubn_uubn_ribn_libn_ebn_aibn_obn_aubn_kabn_khabn_gabn_ghabn_ngabn_cabn_chabn_jabn_jhabn_nyabn_ttabn_tthabn_ddabn_ddhabn_nnabn_tabn_thabn_dabn_dhabn_nabn_pabn_phabn_babn_bhabn_mabn_yabn_rabn_labn_shabn_ssabn_sabn_habn_nukta bn_avagraha bn_aakaarbn_ikaar bn_iikaarbn_ukaar bn_uukaar bn_rikaar bn_rrikaarbn_ekaar bn_aikaarbn_okaar bn_aukaar bn_hasanta bn_half_ta bn_aumarkbn_rrabn_rhabn_yyabn_rribn_lli bn_likaar bn_llikaarbn_zerobn_onebn_twobn_threebn_fourbn_fivebn_sixbn_sevenbn_eightbn_nine bn_asamira bn_asamiba bn_rupeemark bn_rupeesign bn_currency1 bn_currency2 bn_currency3 bn_currency4bn_currencyless bn_currency16 bn_issharuni0A01 bindigurmukhiuni0A03 agurmukhi aagurmukhi igurmukhi iigurmukhi ugurmukhi uugurmukhi eegurmukhi aigurmukhi oogurmukhi augurmukhi kagurmukhi khagurmukhi gagurmukhi ghagurmukhi ngagurmukhi cagurmukhi chagurmukhi jagurmukhi jhagurmukhi nyagurmukhi ttagurmukhi tthagurmukhi ddagurmukhi ddhagurmukhi nnagurmukhi tagurmukhi thagurmukhi dagurmukhi dhagurmukhi nagurmukhi pagurmukhi phagurmukhi bagurmukhi bhagurmukhi magurmukhi yagurmukhi ragurmukhi lagurmukhiuni0A33 vagurmukhi shagurmukhi sagurmukhi hagurmukhi nuktagurmukhiaamatragurmukhiimatragurmukhiiimatragurmukhiumatragurmukhiuumatragurmukhieematragurmukhiaimatragurmukhioomatragurmukhiaumatragurmukhihalantgurmukhiuni0a51 khhagurmukhi ghhagurmukhi zagurmukhi rragurmukhi fagurmukhi zerogurmukhi onegurmukhi twogurmukhi threegurmukhi fourgurmukhi fivegurmukhi sixgurmukhi sevengurmukhi eightgurmukhi ninegurmukhi tippigurmukhi addakgurmukhi irigurmukhi uragurmukhiekonkargurmukhiuni0a75candrabindugujaratianusvaragujarativisargagujarati agujarati aagujarati igujarati iigujarati ugujarati uugujaratirvocalicgujaratiuni0a8cecandragujarati egujarati aigujaratiocandragujarati ogujarati augujarati kagujarati khagujarati gagujarati ghagujarati ngagujarati cagujarati chagujarati jagujarati jhagujarati nyagujarati ttagujarati tthagujarati ddagujarati ddhagujarati nnagujarati tagujarati thagujarati dagujarati dhagujarati nagujarati pagujarati phagujarati bagujarati bhagujarati magujarati yagujarati ragujarati lagujarati llagujarati vagujarati shagujarati ssagujarati sagujarati hagujarati nuktagujaratiuni0ABDaavowelsigngujaratiivowelsigngujaratiiivowelsigngujaratiuvowelsigngujaratiuuvowelsigngujaratiuni0AC3 guj_rrvocalicecandravowelsigngujaratievowelsigngujaratiaivowelsigngujaratiocandravowelsigngujaratiovowelsigngujaratiauvowelsigngujarativiramagujarati omgujaratirrvocalicgujaratiuni0ae1uni0ae2uni0ae3 zerogujarati onegujarati twogujarati threegujarati fourgujarati fivegujarati sixgujarati sevengujarati eightgujarati ninegujaratiuni0AF1uni10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10f9uni10fbuni10fcuni13A0uni13A1uni13A2uni13A3uni13A4uni13A5uni13A6uni13A7uni13A8uni13A9uni13AAuni13ABuni13ACuni13ADuni13AEuni13AFuni13B0uni13B1uni13B2uni13B3uni13B4uni13B5uni13B6uni13B7uni13B8uni13B9uni13BAuni13BBuni13BCuni13BDuni13BEuni13BFuni13C0uni13C1uni13C2uni13C3uni13C4uni13C5uni13C6uni13C7uni13C8uni13C9uni13CAuni13CBuni13CCuni13CDuni13CEuni13CFuni13D0uni13D1uni13D2uni13D3uni13D4uni13D5uni13D6uni13D7uni13D8uni13D9uni13DAuni13DBuni13DCuni13DDuni13DEuni13DFuni13E0uni13E1uni13E2uni13E3uni13E4uni13E5uni13E6uni13E7uni13E8uni13E9uni13EAuni13EBuni13ECuni13EDuni13EEuni13EFuni13F0uni13F1uni13F2uni13F3uni13F4uni1401uni1402uni1403uni1404uni1405uni1406uni1407uni1408uni1409uni140Auni140Buni140Cuni140Duni140Euni140Funi1410uni1411uni1412uni1413uni1414uni1415uni1416uni1417uni1418uni1419uni141Auni141Buni141Cuni141Duni141Euni141Funi1420uni1421uni1422uni1423uni1424uni1425uni1426uni1427uni1428uni1429uni142Auni142Buni142Cuni142Duni142Euni142Funi1430uni1431uni1432uni1433uni1434uni1435uni1436uni1437uni1438uni1439uni143Auni143Buni143Cuni143Duni143Euni143Funi1440uni1441uni1442uni1443uni1444uni1445uni1446uni1447uni1448uni1449uni144Auni144Buni144Cuni144Duni144Euni144Funi1450uni1451uni1452uni1453uni1454uni1455uni1456uni1457uni1458uni1459uni145Auni145Buni145Cuni145Duni145Euni145Funi1460uni1461uni1462uni1463uni1464uni1465uni1466uni1467uni1468uni1469uni146Auni146Buni146Cuni146Duni146Euni146Funi1470uni1471uni1472uni1473uni1474uni1475uni1476uni1477uni1478uni1479uni147Auni147Buni147Cuni147Duni147Euni147Funi1480uni1481uni1482uni1483uni1484uni1485uni1486uni1487uni1488uni1489uni148Auni148Buni148Cuni148Duni148Euni148Funi1490uni1491uni1492uni1493uni1494uni1495uni1496uni1497uni1498uni1499uni149Auni149Buni149Cuni149Duni149Euni149Funi14A0uni14A1uni14A2uni14A3uni14A4uni14A5uni14A6uni14A7uni14A8uni14A9uni14AAuni14ABuni14ACuni14ADuni14AEuni14AFuni14B0uni14B1uni14B2uni14B3uni14B4uni14B5uni14B6uni14B7uni14B8uni14B9uni14BAuni14BBuni14BCuni14BDuni14BEuni14BFuni14C0uni14C1uni14C2uni14C3uni14C4uni14C5uni14C6uni14C7uni14C8uni14C9uni14CAuni14CBuni14CCuni14CDuni14CEuni14CFuni14D0uni14D1uni14D2uni14D3uni14D4uni14D5uni14D6uni14D7uni14D8uni14D9uni14DAuni14DBuni14DCuni14DDuni14DEuni14DFuni14E0uni14E1uni14E2uni14E3uni14E4uni14E5uni14E6uni14E7uni14E8uni14E9uni14EAuni14EBuni14ECuni14EDuni14EEuni14EFuni14F0uni14F1uni14F2uni14F3uni14F4uni14F5uni14F6uni14F7uni14F8uni14F9uni14FAuni14FBuni14FCuni14FDuni14FEuni14FFuni1500uni1501uni1502uni1503uni1504uni1505uni1506uni1507uni1508uni1509uni150Auni150Buni150Cuni150Duni150Euni150Funi1510uni1511uni1512uni1513uni1514uni1515uni1516uni1517uni1518uni1519uni151Auni151Buni151Cuni151Duni151Euni151Funi1520uni1521uni1522uni1523uni1524uni1525uni1526uni1527uni1528uni1529uni152Auni152Buni152Cuni152Duni152Euni152Funi1530uni1531uni1532uni1533uni1534uni1535uni1536uni1537uni1538uni1539uni153Auni153Buni153Cuni153Duni153Euni153Funi1540uni1541uni1542uni1543uni1544uni1545uni1546uni1547uni1548uni1549uni154Auni154Buni154Cuni154Duni154Euni154Funi1550uni1551uni1552uni1553uni1554uni1555uni1556uni1557uni1558uni1559uni155Auni155Buni155Cuni155Duni155Euni155Funi1560uni1561uni1562uni1563uni1564uni1565uni1566uni1567uni1568uni1569uni156Auni156Buni156Cuni156Duni156Euni156Funi1570uni1571uni1572uni1573uni1574uni1575uni1576uni1577uni1578uni1579uni157Auni157Buni157Cuni157Duni157Euni157Funi1580uni1581uni1582uni1583uni1584uni1585uni1586uni1587uni1588uni1589uni158Auni158Buni158Cuni158Duni158Euni158Funi1590uni1591uni1592uni1593uni1594uni1595uni1596uni1597uni1598uni1599uni159Auni159Buni159Cuni159Duni159Euni159Funi15A0uni15A1uni15A2uni15A3uni15A4uni15A5uni15A6uni15A7uni15A8uni15A9uni15AAuni15ABuni15ACuni15ADuni15AEuni15AFuni15B0uni15B1uni15B2uni15B3uni15B4uni15B5uni15B6uni15B7uni15B8uni15B9uni15BAuni15BBuni15BCuni15BDuni15BEuni15BFuni15C0uni15C1uni15C2uni15C3uni15C4uni15C5uni15C6uni15C7uni15C8uni15C9uni15CAuni15CBuni15CCuni15CDuni15CEuni15CFuni15D0uni15D1uni15D2uni15D3uni15D4uni15D5uni15D6uni15D7uni15D8uni15D9uni15DAuni15DBuni15DCuni15DDuni15DEuni15DFuni15E0uni15E1uni15E2uni15E3uni15E4uni15E5uni15E6uni15E7uni15E8uni15E9uni15EAuni15EBuni15ECuni15EDuni15EEuni15EFuni15F0uni15F1uni15F2uni15F3uni15F4uni15F5uni15F6uni15F7uni15F8uni15F9uni15FAuni15FBuni15FCuni15FDuni15FEuni15FFuni1600uni1601uni1602uni1603uni1604uni1605uni1606uni1607uni1608uni1609uni160Auni160Buni160Cuni160Duni160Euni160Funi1610uni1611uni1612uni1613uni1614uni1615uni1616uni1617uni1618uni1619uni161Auni161Buni161Cuni161Duni161Euni161Funi1620uni1621uni1622uni1623uni1624uni1625uni1626uni1627uni1628uni1629uni162Auni162Buni162Cuni162Duni162Euni162Funi1630uni1631uni1632uni1633uni1634uni1635uni1636uni1637uni1638uni1639uni163Auni163Buni163Cuni163Duni163Euni163Funi1640uni1641uni1642uni1643uni1644uni1645uni1646uni1647uni1648uni1649uni164Auni164Buni164Cuni164Duni164Euni164Funi1650uni1651uni1652uni1653uni1654uni1655uni1656uni1657uni1658uni1659uni165Auni165Buni165Cuni165Duni165Euni165Funi1660uni1661uni1662uni1663uni1664uni1665uni1666uni1667uni1668uni1669uni166Auni166Buni166Cuni166Duni166Euni166Funi1670uni1671uni1672uni1673uni1674uni1675uni1676uni1677uni1678uni1679uni167auni167buni167cuni167duni167euni167funi18b0uni18b1uni18b2uni18b3uni18b4uni18b5uni18b6uni18b7uni18b8uni18b9uni18bauni18bbuni18bcuni18bduni18beuni18bfuni18c0uni18c1uni18c2uni18c3uni18c4uni18c5uni18c6uni18c7uni18c8uni18c9uni18cauni18cbuni18ccuni18cduni18ceuni18cfuni18d0uni18d1uni18d2uni18d3uni18d4uni18d5uni18d6uni18d7uni18d8uni18d9uni18dauni18dbuni18dcuni18dduni18deuni18dfuni18e0uni18e1uni18e2uni18e3uni18e4uni18e5uni18e6uni18e7uni18e8uni18e9uni18eauni18ebuni18ecuni18eduni18eeuni18efuni18f0uni18f1uni18f2uni18f3uni18f4uni18f5uni1E00uni1E01 Bdotaccent bdotaccentuni1E04uni1E05uni1E06uni1E07uni1E08uni1E09 Ddotaccent ddotaccentuni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1D Fdotaccent fdotaccentuni1E20uni1E21 Hdotaccent hdotaccentuni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Eidieresisacuteuni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3F Mdotaccent mdotaccentuni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55 Pdotaccent pdotaccent Rdotaccent rdotaccentuni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5F Sdotaccent sdotaccent Sdotbelow sdotbelowuni1E64uni1E65uni1E66uni1E67uni1E68uni1E69 Tdotaccent tdotaccent Tdotbelow tdotbelowuni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8D Ydotaccent ydotaccentuni1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1e9auni1E9B Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookaboveuni1EE8 uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBClenisprosgegrammenipsili perispomenidialytikaperispomeniuni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCC psilivaria psilioxiapsiliperispomeniuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDB dasiavaria dasiaoxiadasiaperispomeniuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECdialytikavaria dialytikaoxiavariauni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCoxiadasiaenquademquadenspaceemspacethreeperemspacefourperemspace sixperemspace figurespacepunctuationspace thinspace hairspacezerowidthspacezerowidthnonjoinerzerojoinuni200Euni200F hyphentwo hyphennobreak figuredash quotedashdblverticalbar underscoredbl quotereversed quotedblrevtrianglebulletonedotenleadertwodotenleader hyphendot lineseparatorparagraphseparatorlrerlepdflrorlouni202Fpertenthousandprimesecond primetripleprimerev primedblrevprimetriplerevcaret referencemark exclamdbl interrobangoverlineuni203Ftie caretinsertasterism hyphenbulletuni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Fclosureuni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064 zerosuperioruni2071 foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior plussuperior minussuperior equalsuperiorparenleftsuperiorparenrightsuperior nsuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior plusinferioruni208B equalinferiorparenleftinferiorparenrightinferioruni2090uni2091uni2092uni2093uni2094 colonmonetarycruzeiroliramilluni20A6pesetauni20A8won afii57636dongEurouni20ADuni20AEuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20b8leftharpoonaccentrightharpoonaccentuni20D2uni20D3uni20d4uni20d5uni20D6uni20D7uni20d8uni20d9uni20dauni20DBuni20DCuni20DDuni20DEuni20DFuni20E0uni20E1uni20e4uni20E5uni20E6uni20E7uni20E8uni20E9uni20EAuni20EBuni20ECuni20EDuni20EEuni20EFuni20F0 accountofaddresssubjectCbb centigradeCLcareofcadaunaEulerscruple fahrenheitHscript HblackletterHbbplanck planckover2piIscriptIfrakturLscriptlitrelbbarNbbnumero recordright weierstrassPbbQbbRscriptRfrakturRbb prescriptionresponse servicemark telephoneversicleZbbOhmmho Zblackletteriotaturn degreekelvinangstromBscript Cblackletter estimatedescriptEscriptFscriptFturnMscript alephmathbethmath gimelmath dalethmathuni2139uni213auni213buni213cuni213euni213funi2141uni2142uni2143uni2144uni214auni214buni214duni214eonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217F arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupleft arrowuprightarrowdownright arrowdownleft arrowbarright arrowhookleftarrowhookrightcarriagereturnharpoonleftbarbuparrowleftbothalfharpoonupright harpoonupleftharpoonrightbarbuparrowrightbothalfharpoondownrightharpoondownleftharpoonrightleft arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblboth arrowdblbothvarrowsquiggleright universal existentialemptyset Delta.mathgradientelement notelementuni220Asuchthat notcontains ownersmalluni2210uni2213dotplus slashmath backslashmath asteriskmathuni2219 proportionalangledividesnotbarparallel notparallel logicaland logicalor intersectionunionuni222Cuni222Duni222E thereforesimilar reversedtildelazysinv wreathproduct notsimilaruni2242 asymptequalnotasymptequal congruentapproxnotequalnotapproxequaluni2249equivasymptotic approaches equivalence notidenticalmuchless muchgreaternotequivasymptoticnotless notgreater notlessequalnotgreaterequaluni2272uni2273precedesfollows precedesequal followsequal notprecedes notsucceedssubsetsuperset notsubset notsuperset reflexsubsetreflexsuperset notsubseteqlnotsuperseteqluni228C squareimagesquareoriginal subsetsqequalsupersetsqequalintersectionsqunionsq circleplusuni2296circlemultiply circledivide circledot turnstilelefttacklefttackdown perpendicular assertion truestate triangleright trianglelefttriangleftequaltriangrightequalnarylogicaland narylogicalornaryintersection naryuniondotmathuni22C6bowtiepreceedsnotequalfollowsnotequalnotsubsetsqequalnotsupersetsqequaluni2300 ceilingleft ceilingright floorleft floorright integraltp integralbtfrown slurbelow angleleft anglerightuni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23AEuni2400uni2401uni2402uni2403uni2404uni2405uni2406uni2407uni2408uni2409uni240auni240buni240cuni240duni240euni240funi2410uni2411uni2412uni2413uni2414uni2415uni2416uni2417uni2418uni2419uni241auni241buni241cuni241duni241euni241funi2420uni2421blankbblankuni2424uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254BSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxsquare boxrounded boxnestedsquarehorizontalfillsquareverticalfillsquareorthogonalcrosshatchfillboxleftdiaghatchboxrtdiaghatchboxcrossdiaghatchsquaresmallsolidwhitesmallsquare filledrect rectanglefilledvertrect vertrectanglefilledparallelogram parallelogram trianglesolidtrianglesmalltrianglesld smalltriangleblackrightpointingtrianglewhiterightpointingtrianglesmalltrianglerightsldsmalltrianglerightblackrightpointingpointer triagrtopentriangledownsld triangleinvsmalltriangleinvsldsmalltriangleinvblackleftpointingtrianglewhiteleftpointingtrianglesmalltriangleleftsldsmalltriangleleftblackleftpointingpointer triaglfopen diamondsolid diamondrhombdiamondrhombnestedfisheyecircle dottedcirclecircleverthatchbullseye circlesolid circleleftsldcirclerightsldcirclebottomsld circletopsld circlenesld circlenwopensemicircleleftsldsemicirclelertsld bulletinversewhitecircleinverseinvsemicircleupinvsemicircledn nwquadarc nequadarc sequadarc swquadarctoparc bottomarc trianglesesld triangleswsld tranglenwsld trianglenesld whitebullet squareleftsldsquarerightsld squarenwsld squaresesldsquarevertbisect triangledottriangleleftsldtrianglerightsld largecircleuni25f0uni25f1uni25f2uni25f3uni25f4uni25f5uni25f6uni25f7uni25f8uni25f9uni25fauni25fbuni25fcuni25fduni25feuni25ffuni262Cspade heartopen diamondopenclubspadesuitwhiteheartdiamond clubsuitwhiteuni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2740uni2A00uni2A01uni2A02uni2A03uni2A04uni2A09uni2D30uni2D31uni2D32uni2D33uni2D34uni2D35uni2D36uni2D37uni2D38uni2D39uni2D3Auni2D3Buni2D3Cuni2D3Duni2D3Euni2D3Funi2D40uni2D41uni2D42uni2D43uni2D44uni2D45uni2D46uni2D47uni2D48uni2D49uni2D4Auni2D4Buni2D4Cuni2D4Duni2D4Euni2D4Funi2D50uni2D51uni2D52uni2D53uni2D54uni2D55uni2D56uni2D57uni2D58uni2D59uni2D5Auni2D5Buni2D5Cuni2D5Duni2D5Euni2D5Funi2D60uni2D61uni2D62uni2D63uni2D64uni2D65uni2D6Funi2E17uniA500uniA501uniA502uniA503uniA504uniA505uniA506uniA507uniA508uniA509uniA50AuniA50BuniA50CuniA50DuniA50EuniA50FuniA510uniA511uniA512uniA513uniA514uniA515uniA516uniA517uniA518uniA519uniA51AuniA51BuniA51CuniA51DuniA51EuniA51FuniA520uniA521uniA522uniA523uniA524uniA525uniA526uniA527uniA528uniA529uniA52AuniA52BuniA52CuniA52DuniA52EuniA52FuniA530uniA531uniA532uniA533uniA534uniA535uniA536uniA537uniA538uniA539uniA53AuniA53BuniA53CuniA53DuniA53EuniA53FuniA540uniA541uniA542uniA543uniA544uniA545uniA546uniA547uniA548uniA549uniA54AuniA54BuniA54CuniA54DuniA54EuniA54FuniA550uniA551uniA552uniA553uniA554uniA555uniA556uniA557uniA558uniA559uniA55AuniA55BuniA55CuniA55DuniA55EuniA55FuniA560uniA561uniA562uniA563uniA564uniA565uniA566uniA567uniA568uniA569uniA56AuniA56BuniA56CuniA56DuniA56EuniA56FuniA570uniA571uniA572uniA573uniA574uniA575uniA576uniA577uniA578uniA579uniA57AuniA57BuniA57CuniA57DuniA57EuniA57FuniA580uniA581uniA582uniA583uniA584uniA585uniA586uniA587uniA588uniA589uniA58AuniA58BuniA58CuniA58DuniA58EuniA58FuniA590uniA591uniA592uniA593uniA594uniA595uniA596uniA597uniA598uniA599uniA59AuniA59BuniA59CuniA59DuniA59EuniA59FuniA5A0uniA5A1uniA5A2uniA5A3uniA5A4uniA5A5uniA5A6uniA5A7uniA5A8uniA5A9uniA5AAuniA5ABuniA5ACuniA5ADuniA5AEuniA5AFuniA5B0uniA5B1uniA5B2uniA5B3uniA5B4uniA5B5uniA5B6uniA5B7uniA5B8uniA5B9uniA5BAuniA5BBuniA5BCuniA5BDuniA5BEuniA5BFuniA5C0uniA5C1uniA5C2uniA5C3uniA5C4uniA5C5uniA5C6uniA5C7uniA5C8uniA5C9uniA5CAuniA5CBuniA5CCuniA5CDuniA5CEuniA5CFuniA5D0uniA5D1uniA5D2uniA5D3uniA5D4uniA5D5uniA5D6uniA5D7uniA5D8uniA5D9uniA5DAuniA5DBuniA5DCuniA5DDuniA5DEuniA5DFuniA5E0uniA5E1uniA5E2uniA5E3uniA5E4uniA5E5uniA5E6uniA5E7uniA5E8uniA5E9uniA5EAuniA5EBuniA5ECuniA5EDuniA5EEuniA5EFuniA5F0uniA5F1uniA5F2uniA5F3uniA5F4uniA5F5uniA5F6uniA5F7uniA5F8uniA5F9uniA5FAuniA5FBuniA5FCuniA5FDuniA5FEuniA5FFuniA600uniA601uniA602uniA603uniA604uniA605uniA606uniA607uniA608uniA609uniA60AuniA60BuniA60CuniA60DuniA60EuniA60FuniA610uniA611uniA612uniA613uniA614uniA615uniA616uniA617uniA618uniA619uniA61AuniA61BuniA61CuniA61DuniA61EuniA61FuniA620uniA621uniA622uniA623uniA624uniA625uniA626uniA627uniA628uniA629uniA62AuniA62B lowcircumflex colonmodifier shortequalsSaltillosaltillocresc_cyrillic dot_cyrillictitlo_cyrillicyi_yi_lig_ukrainian ucas.ringucas.horizlineucas.shortvertucas.righttack ucas.lefttack NameMe.E968 NameMe.E969 NameMe.96A bn_initekaar bn_initaikaarbn_reph bn_kaphala bn_nnaphala bn_taphala bn_thaphala bn_thaphala1 bn_dhaphala bn_naphala bn_below_ba bn_bhaphala bn_raphala bn_laphala bn_half_ka bn_half_kha bn_half_ga bn_half_gha bn_half_nga bn_half_ca bn_half_ca1 bn_half_cha bn_half_ja bn_half_jha bn_half_nya bn_half_tta bn_half_ttha bn_half_dda bn_half_ddha bn_half_nna bn_half_tha bn_half_dha bn_half_da bn_half_na bn_half_pa bn_half_pha bn_half_ba bn_half_bha bn_half_ma bn_half_ya bn_half_ra bn_half_la bn_half_sha bn_half_ssa bn_half_sa bn_half_ha bn_half_rra bn_half_rha bn_half_yyabn_half_asamirabn_half_asamiba bn_khaphala bn_phaphala bn_baphala1 bn_maphala bn_maphala1 bn_yaphalabn_k_rabn_k_ra1bn_kh_rabn_g_rabn_gh_rabn_c_rabn_ch_rabn_j_rabn_tt_ra bn_tth_rabn_dd_ra bn_ddh_rabn_t_rabn_t_ra1bn_th_rabn_d_rabn_dh_rabn_n_rabn_n_ra1bn_p_rabn_ph_rabn_b_rabn_bh_ra bn_bh_ra1bn_m_rabn_y_rabn_sh_rabn_ss_rabn_s_rabn_s_ra1bn_h_ra bn_asamir_ra bn_asamib_ra bn_k_ss_rabn_k_kabn_k_tta bn_k_tt_rabn_k_tabn_k_ta1 bn_k_t_ba bn_k_t_ba1 bn_k_t_ra bn_k_t_ra1 bn_k_t_ra2bn_k_nabn_k_mabn_k_labn_k_ssa bn_k_ss_nna bn_k_ss_mabn_k_sabn_g_gabn_g_dabn_g_dha bn_g_dh_babn_g_labn_g_nabn_g_mabn_gh_nabn_ng_ka bn_ng_k_ra bn_ng_k_ssa bn_ng_k_ss_ra bn_ng_khabn_ng_ga bn_ng_gha bn_ng_gh_rabn_ng_ma bn_ng_ma1bn_c_cabn_c_cha bn_c_ch_ba bn_c_ch_rabn_c_nyabn_c_nabn_j_ja bn_j_j_babn_j_jhabn_j_nyabn_ny_ca bn_ny_chabn_ny_ja bn_ny_jha bn_tt_tta bn_tt_tt_rabn_tt_mabn_dd_ga bn_dd_ddabn_dd_ma bn_nn_tta bn_nn_tt_ra bn_nn_ttha bn_nn_dda bn_nn_dda1 bn_nn_dd_ra bn_nn_dd_ra1 bn_nn_ddha bn_nn_nnabn_nn_mabn_t_ta bn_t_t_babn_t_thabn_t_nabn_t_mabn_t_ma1bn_t_labn_d_gabn_d_ghabn_d_da bn_d_d_ba bn_d_d_rabn_d_dha bn_d_dh_babn_d_nabn_d_bha bn_d_bh_ra bn_d_bh_ra1bn_d_mabn_dh_nabn_dh_mabn_n_tta bn_n_tt_ra bn_n_tthabn_n_dda bn_n_dd_ra bn_n_ddhabn_n_ta bn_n_t_ba bn_n_t_ra bn_n_t_ra1bn_n_thabn_n_da bn_n_d_ba bn_n_d_rabn_n_dha bn_n_dh_ba bn_n_dh_rabn_n_nabn_n_mabn_n_ma1bn_n_sabn_p_ttabn_p_tabn_p_pabn_p_mabn_p_nabn_p_labn_p_sa bn_ph_ttabn_ph_labn_b_jabn_b_da bn_b_d_rabn_b_dhabn_b_nabn_b_bhabn_b_labn_bh_labn_m_tabn_m_thabn_m_dabn_m_nabn_m_na1bn_m_pa bn_m_p_ra bn_m_p_labn_m_pha bn_m_ph_rabn_m_bha bn_m_bh_ra bn_m_bh_ra1bn_m_mabn_m_ma1bn_m_labn_m_la1bn_m_sa bn_m_s_rabn_l_kabn_l_gabn_l_tta bn_l_tt_rabn_l_dda bn_l_dd_rabn_l_tabn_l_dabn_l_dhabn_l_pabn_l_pha bn_l_ph_rabn_l_mabn_l_labn_sh_ca bn_sh_chabn_sh_tabn_sh_nabn_sh_mabn_sh_labn_ss_ka bn_ss_k_ra bn_ss_k_ra1 bn_ss_tta bn_ss_tta1 bn_ss_tt_ra bn_ss_tt_ra1 bn_ss_ttha bn_ss_nnabn_ss_pa bn_ss_p_ra bn_ss_pha bn_ss_ph_rabn_ss_ma bn_ss_ma1bn_s_ka bn_s_k_ra bn_s_k_ra1bn_s_khabn_s_tta bn_s_tta1 bn_s_tt_ra bn_s_tt_ra1bn_s_ta bn_s_t_ba bn_s_t_ra bn_s_t_ra1bn_s_thabn_s_nabn_s_na1bn_s_pa bn_s_p_ra bn_s_p_labn_s_pha bn_s_ph_rabn_s_mabn_s_ma1bn_s_labn_s_la1bn_h_nnabn_h_nabn_h_mabn_h_labn_h_la1bn_rr_gabn_k_babn_g_babn_gh_babn_c_babn_ch_babn_j_babn_tt_babn_dd_babn_nn_babn_t_babn_th_babn_d_babn_dh_ba bn_dh_ba1bn_n_babn_n_ba1bn_p_babn_b_babn_bh_babn_m_ba bn_m_b_rabn_m_ba1 bn_m_b_ra1bn_l_babn_sh_babn_s_babn_s_ba1bn_h_babn_h_ba1 bn_kh_r_ukaarbn_kh_r_uukaar bn_g_ukaar bn_g_r_ukaar bn_g_r_uukaar bn_g_l_ukaar bn_g_l_uukaar bn_j_r_ukaar bn_j_r_uukaar bn_t_r_ukaar bn_t_r_uukaar bn_th_r_ukaarbn_th_r_uukaar bn_d_ukaar bn_d_r_ukaar bn_d_r_uukaar bn_dh_r_ukaarbn_dh_r_uukaar bn_n_ukaar bn_n_uukaar bn_n_rikaar bn_n_t_ukaarbn_n_d_r_ukaarbn_n_d_r_uukaar bn_p_r_ukaar bn_p_r_uukaar bn_p_l_ukaar bn_p_l_uukaar bn_b_r_ukaar bn_b_r_uukaar bn_b_l_ukaar bn_b_l_uukaar bn_bh_r_ukaarbn_bh_r_uukaar bn_m_r_ukaar bn_m_r_uukaarbn_m_p_r_ukaarbn_m_p_r_uukaar bn_r_ukaar bn_r_uukaar bn_l_g_ukaar bn_sh_ukaar bn_sh_r_ukaarbn_sh_r_uukaar bn_sh_l_ukaarbn_sh_l_uukaarbn_ss_p_r_ukaarbn_ss_p_r_uukaar bn_s_ukaar bn_s_uukaar bn_s_rikaar bn_s_t_ukaar bn_s_r_ukaar bn_s_r_uukaarbn_s_p_r_ukaarbn_s_p_r_uukaarbn_s_p_l_ukaarbn_s_p_l_uukaar bn_s_l_ukaar bn_s_l_uukaar bn_h_ukaar bn_h_rikaarbn_asamir_ukaarbn_asamir_uukaarbn_asamib_ukaarbn_asamib_uukaarbn_asamib_r_ukaarbn_asamib_r_uukaar bn_k_hasanta bn_kh_hasanta bn_g_hasanta bn_gh_hasanta bn_ng_hasanta bn_c_hasanta bn_ch_hasanta bn_j_hasanta bn_jh_hasanta bn_ny_hasanta bn_tt_hasantabn_tth_hasanta bn_dd_hasantabn_ddh_hasanta bn_nn_hasanta bn_t_hasanta bn_th_hasanta bn_d_hasanta bn_dh_hasanta bn_n_hasanta bn_p_hasanta bn_ph_hasanta bn_b_hasanta bn_bh_hasanta bn_m_hasanta bn_y_hasanta bn_r_hasanta bn_l_hasanta bn_sh_hasanta bn_ss_hasanta bn_s_hasanta bn_h_hasanta bn_rr_hasanta bn_rh_hasanta bn_yy_hasantabn_asamir_hasantabn_asamib_hasanta bn_post_k_raglyph569glyph570glyph571glyph572glyph57487 bn_baphala bn_below_ba2glyph578glyph579glyph580glyph581glyph582glyph583 bn_sh_ra.001bn_yaphala.002bn_d_yabn_n_ya bn_la.001bn_sh_yabn_ss_yabn_s_yaglyph593bn_h_yaglyph595 bn_ss_tta.002glyph597glyph598 bn_uukaar.1glyph600Adeva002Adeva003 deva_tta_nuktdeva_ttha_nukta.nuktglyph240glyph241deva_ii_anusvara.abvsdeva_e_candra_bindu.abvsdeva_o_cand_bindu.abvsdeva_au_ra_virama_candra_bindudeva_ai_ra_virama_candra_bindudeva_ra_virama_candra_binduhadeva_viramadeva.halnchadeva_virama.nuktchadeva_viramadeva.halnhadeva_rrvoc_ic_deva.blwskadeva_viramadeva_ssadeva.akhnjadeva_viramadeva_nyadeva.akhnuni924_94D.half_924.presuni924_930_94D.blwf.vatuuni936_94D.half_91A.presuni936_930_94D.blwf.vatuuni936_94D.half_935.presuni95B_930_94D.blwf.vatuuni92B_930_94D.blwf.vatuuni95E_930_94D.blwf.vatuuni92A_930_94D.blwf.vatuuni938_930_94D.blwf.vatudeva_ra_u.blwsdeva_ra_uu.blwsuni915_94D.half_928.preskhadeva_094D.half_0928.presghadeva_094D.half_0928.presglyph269deva_ka_virama.halfdeva_kha_virama.halfdeva_ga_virama.halfdeva_gha_virama.halfdeva_ca_virama.halfglyph275deva_ja_virama.halfdeva_jha_virama.halfdeva_nya_virama.halftadeva_094D.half_0928.presthadeva_094D.half_0928.presdadeva_094D.half_0928.presdeva_dha_094D.half_0928.presdeva_nna_virama.halfdeva_ta_virama.halfdeva_tha_virama.halfuni926_94D.hlf2_926_94D.presdeva_dha_virama.halfdeva_na_virama.halfglyph289deva_pa_virama.halfdeva_pha_virama.halfdeva_ba_virama.halfdeva_bha_virama.halfdeva_ma_virama.halfdeva_ya_virama.halfpadeva_094D.half_0928.presglyph297deva_la_virama.halfdeva_lla_virama.halfdeva_llla_virama.halfdeva_va_virama.halfdeva_sha_virama.halfdeva_ssa_virama.halfdeva_sa_virama.halfdeva_ha_virama.halfglyph306badeva_094D.half_0928.presglyph308madeva_094D.half_0928.presvadeva_094D.half_0928.presshadeva_094D.half_0928.preskadeva_094D.half_0915.presngadeva_094D.half_0915.presngadeva_094D.half_0916.presngadeva_094D.half_0917.presngadeva_094D.half_0918.presnyadeva_094D.half_091C.presdadeva_094D.half_0918.presdadeva_094D.half_0926.presdadeva_094D.half_0927.presdadeva_094D.half_092C.presdadeva_094D.half_092D.presdadeva_094D.half_092E.presdadeva_094D.half_092F.presdadeva_094D.half_0935.presttadeva_094D.half_091F.presttadeva_094D.half_0920.prestthadeva_094D.half_0920.presglyph329glyph330glyph331hadeva_094D.half_092E.preshadeva_094D.half_092F.presladeva_094D.half_0939.presglyph335u9_38_4D.hlf_24_4D_30prespresglyph337ra_viramadeva_afii301.halfu91A_94D.hlf2_91A_94D.halfsadeva_0928_094D.half.presglyph341glyph342glyph343glyph344glyph345glyph346glyph347glyph348glyph349uni915_94D_937.akhn_94D.halfu91C_94D_91E.akhn_94D.halfglyph352u924_94D.half_930_94D.blwf.vatuglyph354glyph355glyph356glyph357glyph358glyph359uni939_930_94D.blwf.blwsdeva_ra_virama.rphfdeva_ra_virama.blwfdeva_aa_candrabindu.abvsdeva_aa_anusvara.abvsglyph365glyph366glyph367glyph368glyph369deva_e_anusvara.abvsglyph371glyph372deva_ai_anusvara.abvsglyph374glyph375glyph376glyph377glyph378u9_38_4Dhalf1F_30_4Dblwfvtu2glyph380nadeva_094D.half_0928.presnga_viramadeva.halftta_viramadeva.halfttha_viramadeva.halfdda_viramadeva.halfddha_viramadeva.halfda_viramadeva.halfuni915_930_94D.blwf.vatuuni916_930_94D.blwf.presuni917_930_94D.blwf.presuni918_930_94D.blwf.vatuuni919_930_94D.blwf.vatuuni91A_930_94D.blwf.vatuuni91B_930_94D.blwf.vatuuni91C_930_94D.blwf.vatuuni91D_930_94D.blwf.vatuuni91E_930_94D.blwf.vatuuni91F_930_94D.blwf.vatuuni920_930_94D.blwf.vatuuni921_930_94D.blwf.vatuglyph402uni923_930_94D.blwf.vatutadeva_viramadeva_radeva.presuni925_930_94D.blwf.vatuuni926_930_94D.blwf.vatuuni927_930_94D.blwf.vatuuni928_930_94D.blwf.vatuuni92C_930_94D.blwf.vatuuni92D_930_94D.blwf.vatuuni92E_930_94D.blwf.vatuuni92F_930_94D.blwf.vatuuni930_930_94D.blwf.vatuuni932_930_94D.blwf.vatuuni936_94D.hlf2_932_94D.presuni937_94D.half_91F.presuni937_94D.half_920.presglyph418glyph419glyph420uni936_94D.hlf2_928_94D.presu938_4D.hlff24_4D.30_4Dbfvtuprsu926_94D.half_92E_94D.half.presuni924_94D.hlf2_928_94D.presuni939_94D.half_923.presuni939_94D.half_932.presuni939_94D.half_935.presu92A_94D.half_924_94D.half.presuni939_94D.half_928.presu939_94D.half_92E_94D.half.presu92A_94D.half_930_94D.blwf.vatungadeva_nuktadeva.nukt hadeva_nukt dadeva_nuktttadeva_nukt.halnuni920_93C.nukt_94D.halndddhadeva_viramadeva.halnrhadeva_viramadeva.halndadeva_nukt_viramauni939_93C.nukt_94D.halnuni919_93C.nukt_94D.halnu937_94D.half_91F.pres_94D.halnu937_94D.half_920.pres_94D.halnu939_94D.half_923.pres_94D.halnu939_94D.half_928.pres_94D.halnu939_94D.half_932.pres_94D.halnu939_94D.half_935.pres_94D.halnphadev_nuktadev_vir_dev.nuktjadev_nuktadev_vir_dev.nuktkagujarati_viramagujarati.halfkhagujarati_viramagujarati.halfgagujarati_viramagujarati.halfghagujarati_viramagujarati.halfcagujarati_viramagujarati.halfjagujarati_viramagujarati.halfjhagujarati_viramagujarati.halfnyagujarati_viramagujarati.halfnnagujarati_viramagujarati.halftagujarati_viramagujarati.halfthagujarati_viramagujarati.halfdhagujarati_viramagujarati.halfnagujarati_viramagujarati.halfpagujarati_viramagujarati.halfphagujarati_viramagujarati.halfbagujarati_viramagujarati.halfbhagujarati_viramagujarati.halfmagujarati_viramagujarati.halfyagujarati_viramagujarati.halflagujarati_viramagujarati.halfllagujarati_viramagujarati.halfvagujarati_viramagujarati.halfshagujarati_viramagujarati.halfssagujarati_viramagujarati.halfsagujarati_viramagujarati.halfhagujarati_viramagujarati.halfuniA95_ACD_AB7.akhn_ACD.halfuAA4_ACD.half_AA4_ACD.half.presuniAA4_ACD.half_AB0_ACD.vatuuAA8_ACD.half_AA8.pres_ACD.presuAB6_ACD.half_AB0_ACD.blwf.vatuuA96_ACD.half_AB0_ACD.blwf.vatuuA97_ACD.half_AB0_ACD.blwf.vatuuA98_ACD.half_AB0_ACD.blwf.vatuuA9A_ACD.half_AB0_ACD.blwf.vatuuA9C_ACD.half_AB0_ACD.blwf.vatuuAA5_ACD.half_AB0_ACD.blwf.vatuuAA7_ACD.half_AB0_ACD.blwf.vatuuAA8_ACD.half_AB0_ACD.blwf.vatuuAAA_ACD.half_AB0_ACD.blwf.vatuuAAC_ACD.half_AB0_ACD.blwf.vatuuAAD_ACD.half_AB0_ACD.blwf.vatuuAAE_ACD.half_AB0_ACD.blwf.vatuuAB8_ACD.half_AB0_ACD.blwf.vatuigujarati_anusvaragujarati.abvsguj_ii_anusvara.abvsugujarati_anusvaragujarati.abvsguj_uu_anusvara.abvsuniA95_ACD.half_A95.presuniA95_AB0_ACD.blwf.vatuguj_ja_aa.pstsguj_ja_ii.pstsuniA9C_AB0_ACD.blwf.vatuuniA9D_AB0_ACD.blwf.vatuguj_tta_virama_tta.presguj_tta_virama_ttha.presguj_ttha_virama_ttha.presguj_dda_virama_dda.presguj_dda_virama_ddha.presuniAA6_AB0_ACD.blwf.vatuguj_da_virama_ma.presguj_da_virama_da.presguj_da_virama_dha.presguj_da_virama_va.presuniAAB_AB0_ACD.blwf.vatu guj_ra_u.blwsguj_ra_uu.blwsnounicode_3_1_cduAB5_ACD.half_AB0_ACD.blwf.vatuuniAB6_ACD.half_AB5_ACD.presuniAB9_AB0_ACD.blwf.vatuuniAB9_ACD.half_AAE.presuniAB9_ACD.half_AAF.presuAB6_ACD.half_AA8.pres_ACD.presuniAB6_ACD.half_A9A_ACD.presguj_ddha_virama_ddha.presguj_ka_virama_ssa.akhnuniAA4_ACD.half_AA4.presuniAA4_AB0_ACD.blwf.vatuuniAA8_ACD.half_AA8.presuniAB6_AB0_ACD.blwf.vatuuniA96_AB0_ACD.blwf.vatuuniA97_AB0_ACD.blwf.vatuuniA98_AB0_ACD.blwf.vatuuniA9A_AB0_ACD.blwf.vatuuniAA5_AB0_ACD.blwf.vatuuniAA7_AB0_ACD.blwf.vatuuniAA8_AB0_ACD.blwf.vatuuniAAA_AB0_ACD.blwf.vatuuniAAC_AB0_ACD.blwf.vatuuniAAD_AB0_ACD.blwf.vatuuniAAE_AB0_ACD.blwf.vatuuniAB8_AB0_ACD.blwf.vatuuniAB5_AB0_ACD.blwf.vatuuniAB6_ACD.half_AB5.presuniAB6_ACD.half_AA8.presuniAB6_ACD.half_A9A.presguj_ra_virama.rphfguj_ra_virama.blwfuniAB7_ACD.half_AA0.presuniAB7_ACD.half_A9F.presuA_B7_CD.half_9F_B0_CD.blwfvatuuA_B7_CD.half_A0_B0_CDblwfvatuuniA9F_AB0_ACD.blwf.vatuguj_ja_virama_nya.akhnuniAA1_AB0_ACD.blwf.vatuuniAA0_AB0_ACD.blwf.vatuuniAA2_AB0_ACD.blwf.vatuglyph437glyph438glyph440glyph441guj_e_anusvara.abvsglyph443glyph444glyph445glyph446glyph447glyph448glyph449glyph450glyph451glyph452glyph453kagujarati_nuktagujarati.nuktkhagujarati_nuktagujarati.nuktgagujarati_nuktagujarati.nuktghagujarati_nuktagujarati.nuktngagujarati_nuktagujarati.nuktcagujarati_nuktagujarati.nuktchagujarati_nuktagujarati.nuktjagujarati_nuktagujarati.nuktjhagujarati_nuktagujarati.nuktnyagujarati_nuktagujarati.nuktttagujarati_nuktagujarati.nukttthagujarati_nuktagujarati.nuktddagujarati_nuktagujarati.nuktddhagujarati_nuktagujarati.nuktnnagujarati_nuktagujarati.nukttagujarati_nuktagujarati.nuktthagujarati_nuktagujarati.nuktdagujarati_nuktagujarati.nuktdhagujarati_nuktagujarati.nuktnagujarati_nuktagujarati.nuktpagujarati_nuktagujarati.nuktphagujarati_nuktagujarati.nuktbagujarati_nuktagujarati.nuktbhagujarati_nuktagujarati.nuktmagujarati_nuktagujarati.nuktyagujarati_nuktagujarati.nuktragujarati_nuktagujarati.nuktlagujarati_nuktagujarati.nuktllagujarati_nuktagujarati.nuktvagujarati_nuktagujarati.nuktshagujarati_nuktagujarati.nuktssagujarati_nuktagujarati.nuktsagujarati_nuktagujarati.nukthagujarati_nuktagujarati.nuktuniAA3_ACD.half_AB0_ACD.vatuguj_nna_ra_virama.vatugur_ra_halant.blwfgur_va_halant.blwfgur_ha_halant.blwfgur_ya_halant.pstfglyph152glyph153glyph154glyph155glyph156glyph157uniA30_A4D.blwf_A41.blwsuniA39_A4D.blwf_A41.blwsnounicode_3_1_3glyph161ragurmukhi_A4D.blwf_A42.blwsuniA39_A4D.blwf_A42.blwsnounicode_3_1_2fnounicode_3_1_30gur_na_uumatra_tippi.abvsgur_aamatra_bindi.abvsgur_u_addak.pstsgur_uu_addak.pstsgur_oo_addak.psts gur_ka.nukt gur_gha.nukt gur_nga.nukt gur_ca.nukt gur_cha.nukt gur_jha.nukt gur_nya.nukt gur_tta.nukt gur_ttha.nukt gur_ddha.nukt gur_nna.nukt gur_ta.nukt gur_tha.nukt gur_da.nukt gur_dha.nukt gur_na.nukt gur_pa.nukt gur_ba.nukt gur_bha.nukt gur_ma.nukt gur_ya.nukt gur_ra.nukt gur_va.nuktglyph194 gur_ha.nukt gur_a.nukt gur_aa.nukt gur_i.nukt gur_ii.nukt gur_u.nukt gur_uu.nukt gur_ee.nukt gur_ai.nukt gur_oo.nukt gur_au.nuktgur_aa_bindi.abvsglyph207uniA35_A4D.blwf_A41.blwsuniA35_A4D.blwf_A42.blwsuniA30_A4D.blwf_A4D.blwsuniA39_A4D.blwf_A4D.blwsuniA35_A4D.blwf_A4D.blwsEngsamiffffiffllongs_t m_n_armenian m_e_armenian m_i_armenian v_n_armenian m_x_armenianyodhiriqhebrewuniFB1EyodyodpatahhebrewayinaltonehebrewuniFB21uniFB22uniFB23uniFB24uniFB25uniFB26uniFB27uniFB28uniFB29shinshindothebrewshinsindothebrewshindageshshindothebrewshindageshsindothebrewalefpatahhebrewalefqamatshebrewalefdageshhebrewbetdageshhebrewgimeldageshhebrewdaletdageshhebrewhedageshhebrewvavdageshhebrewzayindageshhebrewtetdageshhebrewyoddageshhebrewfinalkafdageshhebrewkafdageshhebrewlameddageshhebrewmemdageshhebrewnundageshhebrewsamekhdageshhebrewpefinaldageshhebrewpedageshhebrewtsadidageshhebrewqofdageshhebrewreshdageshhebrewshindageshhebrewtavdageshhebrewvavholamhebrew betrafehebrew kafrafehebrew perafehebrewaleflamedhebrewuniFFFDuni10380uni10381uni10382uni10383uni10384uni10385uni10386uni10387uni10388uni10389uni1038auni1038buni1038cuni1038duni1038euni1038funi10390uni10391uni10392uni10393uni10394uni10395uni10396uni10397uni10398uni10399uni1039auni1039buni1039cuni1039duni1039funi103a0uni103a1uni103a2uni103a3uni103a4uni103a5uni103a6uni103a7uni103a8uni103a9uni103aauni103abuni103acuni103aduni103aeuni103afuni103b0uni103b1uni103b2uni103b3uni103b4uni103b5uni103b6uni103b7uni103b8uni103b9uni103bauni103bbuni103bcuni103bduni103beuni103bfuni103c0uni103c1uni103c2uni103c3uni103c8uni103c9uni103cauni103cbuni103ccuni103cduni103ceuni103cfuni103d0uni103d1uni103d2uni103d3uni103d4uni103d5uni10480uni10481uni10482uni10483uni10484uni10485uni10486uni10487uni10488uni10489uni1048auni1048buni1048cuni1048duni1048euni1048funi10490uni10491uni10492uni10493uni10494uni10495uni10496uni10497uni10498uni10499uni1049auni1049buni1049cuni1049duni1049euni1049funi104a0uni104a1uni104a2uni104a3uni104a4uni104a5uni104a6uni104a7uni10900uni10901uni10902uni10903uni10904uni10905uni10906uni10907uni10908uni10909uni1090auni1090buni1090cuni1090duni1090euni1090funi10910uni10911uni10912uni10913uni10914uni10915uni10916uni10917uni10918uni10919uni1091auni1091buni1091f r-./0abcdpqrs^__`#$$%%&&''(()fghiijjknopqqrvw %&,--.011223<=>?BCDEz{         t u        GHHIIJOPQRSTXYYZ[\\]effg    $%%&,--.45566778899:QRRSSTTUUVVW]^^_`aabcddeeffgijjklmmnsttuuvvwz{{|    #$BCCDHIIJ^__`ijjk9::;bcfgijrs"  F 8DFLTzarmnbengbng2cyrldev2devageor$gjr2.grekLgujrVgur2tguruhebrlatnphnxsyrctml2ugarxpeo$  %(*.1  %(*.1  "&-/2  "&-/2  #'+03  #'+03 $), $), JII "ISM .LSM .NLD 6NSM .SKS .! 4aalt:abvs@abvsFabvsLakhnRakhnXakhn^blwfdblwfjblwfpblwfvblws|blwsblwsblwsccmpccmpccmpdligfrachalfhalfhalfhalnhalnhlighliginitligaligaligaligaligaloclnuktnuktnuktprespres pres(pstf0pstf6psts\""# #8'v'')),)D)*,X, -M,L6",bqcr28RX ,>Pbt     .     / $(,28DHLRX&8Z|                                         I "JT^hr|&0:DNXblvsvtvuvvvwvxvyvzv{v|v}v~vvvvvvvvvvvvvvvvvvvvvvvTu$.8BL`jt~w^x^y^^^oz^$^%^{^|^^^o}^~^^/^W^9:;=@CDEFJOS]0V(V`jt~ (2<FPZdnx"""""""""""."/"""""0"""""""""""""2"""""""""" % !&" Cs_]T[" 2o[3oB9@6 , XnoT TTBHNTZ`flrx~   6 "(IOILOLIIWA*  ,,,!YnoT &0:DNXblvUVWXZ[ ]^_^ J<FPZdnx",6@     TWYY[]bdfm ouCC +\fpz$.8BLVblvDoEoFoGooHoJoKoLoooooQoRoSooUoVoXoYoZo[o\o]oo o`oaobocodoeofogoooooooHho9>@LN]24#68&HH)*%PZdnx",6@JT^hr|`abcdeghijklmnoprqstuvwxyz{|}~ #,*  &Pf    "          "         *  TY=YYqu)Xblv",6@JT^hr~(YHYIYJYKY+Y,Y^YaY`YbYnEYLY2YMYNYOY7YPYQYRYGYSYYYYYnnYYYYY Y!Y;YY]_Y\^Y"Y TWYY[\^lrrtt" %S!HR\fpz$.8BLV`jt~5<:7=9;!9<=>?@ABCDEGHIJKLNOPQRTVZ\z}RXfV>HR\fpz$.8BL^^^^^^^^^^^^^^^^^^^^^^^^^^^^  4@Vb._-^/_1a0`Ba "6q5f4e3l'TFg "(AY<qUqWYVg [^Z_@ ^_`ae FV $.@Z n9@LFE; &,LYVGSR }D|C~D  &,28>D\{YzSyRxQwPvKuJt<Dc ?m>l :;DTg@:DNZdv  J\noTV n9@LALBLs@VML4HNLFE;PLL R^LiLkL]lL $V`mL8Y6> DC "(.4\LYVGSR r<q;p:o9 }D|C~D $*06<BHNT\{YzSyRxQwPvKuJt<TOL:;H\DEGLRSTUVXZ\`cdefg:d,NhT"T^J|Xz $  &,28>D &,$*06<  $*06< $*06<"(.4:@FLRX^djpv|   "(.4   &,'&$#"!( &,28>DJPV\bhnt;:8643210/.,+*)$*06<BHNTZ`flIHGFEDCBA@?>=< &,ONMLKJ $*06<BHNT]\[ZYXWUSQP"(.4:@FLRX^djpv|usrqponlkigecb`_ zyxw|`bcdehjkmoqrstuvwx{|}~Z &@,'&,'&,'& 9|8{n.  ?d>c 1fT]:z  *4FPbl(:L^p"4FXbt}  ~                                                         h    : '/=OZgopu, "'=#T$.8#D$D%D&DiXDhXgDHIJK "FPr(& &&% &)% $&,-P *%& +-&Q-%& ,`bijmn*  >>> *z)x[Z*6BN      &0:DNXblv0o.oooooooooooooo?]{|$%%PZdnx",6@JT^hr| #*  &'&/  TDFLTzarmnbengbng2cyrldev2devageorgjr2grekgujr gur2guru(hebr2latnLphnxZsyrcftml2rugar~xpeo    JII    abvmVabvm\blwmbblwmhkernnkerntlfbdzmarkmarkmarkmarkmarkmkmkrtbd     "*2:BLT\dlt|LhPB "$&l,6,-6<DJPV\bhnt,,,,,,,,dX,, P &,28>DJPV\bhntz "(.4:@FLRX^djpv|u}HuuQT6CTSCrn`=y66LT<nYiu!!!Q!!|!!!!!A!!!!6!!!!!!!X!W!!o!!!!;!!!vT!P!!]}G iikmpqv/EIK H 28>DJPV\bhnt].L7W.T+Z.^=@.<#:%_8c8 0&6 XXW{BN  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<X:|bXXkX.W:lP1mXMW;8nX8l88naiXXXXXXjXXXXmmnmW:{yzyiiXXXbXX{{|{;mml mmS`xZNX8mclX88 888l86888W8($=D]4;CHMU]bglrtz|*389HHPRWWZZ^^beggqrtt  &&//44:;==AE !#')*+ , -1 &,28>DJPV\bhntzK]XbT\\[( # "ZXYVWZ  Z"F. d $*06<BHNTZ`flrx~ &,28>DJPV\bhntz X=aDo6xXXXXXX====aDDDD|z{z66666xxXX=D=D=D=D||||666ax$$((,,2288<<DDHHLLRR XX \\ $*27<AGIOQ*3W89arrcj< y $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|O3}[XXk{Xp3eO4mXMW? nonfodj3OYk};m `x^NWX9mm?&?m eo<W.#} y$%&'()*+,-./0123456789:;<=DFHJKLMNOPQRSTUVXZ\]45HPQRVWZ^bcdegqrtvyz{| /12347:;=ABCDE__ #&()+- u v: y |< @ B C D EF &,28>DJPV\bhntz "(.4:@FLRX^djpv|^OUR>X>RAUUUU/UU#U :U,X,S[XURUBB=X&U03>s=[T 2:.@  Yh  28RXy B >~ &,28>DJPV\bhntzSSS l SSSmb SS/<yvh^h^hbhhlphhM/hhjhhAhhjhKl5hkoUhQvU3hMkBkBRnR00b$= D]$ w x } ~  V\bhntz ^Adn1;Q(<   (((((d(\4B "FLRX^djpv| [ $8+TKt  2FFTmou{|}~"(.|`C]%f. D &,28>DJPV\bhntz |yfDmJUUkM_wq)bg.&O L|Q6?.'303h00m_weR; idbD9=?CDEFJOTUWX]w}=>?@DKOTY_abdtuvwxyz{|}~cdefo"(.Xtpk<&J #HNTZ`flrx~T ! *O;$&#0+). - #9TMx *   +FGTmouCD"(.zawlf $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTxaejgdi9jjedce _eqehaXaed ciecgffegaggaeac d hcea egeifga>>5|7@^^ag[i_didieeYgaeagWi#aeg4cge.e:cc^d^gddigcgg^g;e>>A;D>>kjd^^gdaedaagda aeWchgaj^9ddaddd ceecg ddg|7@jigeadaa++,.499 <= ?F HHJQSUWY ]]#ww${}%()$%*)),,1-=@3DD7KK8OO9TT:YY;__<ab=dd?t@TUX^_fghlmnotuxz%&ghijr"(.4:@FLkUgXdGLi@8Xjjkkssuuzz~~ kkww~~jksuz~M$$%%&&''(())**,,--..// 22 33 44 55 66 779:;;<<==          "" $$&&88::??yy      P P Z Z \ \ d d f f  x$$&&**,,--224466779:;;<<==DDFFGGHHII JJMM PQ RRSSTTUUVV WW XXYZ[[ \\]]         !! ""## $$%% &&++--//11338899::;;<< ==>> ??@@ ; ; Q Q Z Z [ [ \ \ ] ] d d e e f f g g    ]$%&'()*,-./2345679:;<= "$&8:?y   P Z \ d f ^NDDEEFFGGHHIIJJ KKNN PQRRSSUU VV WW XX YZ[[ \\]]      !! ## %% ++ -- // 11 33 99<<>>@@       ; ; Q Q [ [ ] ] e e g g HDDFF GGHHIIJJMMPQRR SS TTUU VVWWXX YZ[[\\]]          !!##%%++ -- // 11 33 99<<>>@@22     Q Q [ [ ] ] e e g g _DEFGHIJKNPQRSUVWXYZ[\] !#%+-/139<>@    ; Q [ ] e g ,}$$%%&'))**.. //22334466779: ;; << == DD EE FF HHIIJJKKNNPQRRSS UUVVWWXXYZ[[\\]]          !!""##$$%%--//3388 99:: ;; <<== >>?? @@22        ; ; P P Q Q Z Z [ [ \ \ ] ] d d e e f f g g  mm}}      $%&')*./234679:;<=DEFHIJKNPQRSUVWXYZ[\]  !"#$%-/389:;<=>?@2    ; P Q Z [ \ ] d e f g  mm}}         p$$&&**--224466779:;;<<==DDFHII JJMM PQ RRSS TTUU VV WW XX YZ[[ \\]]           !! ""## $$%% &&++ -- // 33 8899::;;<< ==>> ??@@ 22   ; ; Q Q Z Z [ [ \ \ ] ] d d e e f f g g    m}  YȻ!DarkRadiant-2.0.2/install/ui/lightinspector.fbp000066400000000000000000003264511245424655700215420ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY LightInspectorMainPanel 600,345 wxTAB_TRAVERSAL bSizer4 wxVERTICAL none 12 wxALL|wxEXPAND 1 bSizer5 wxHORIZONTAL none 5 wxEXPAND 0 bSizer6 wxVERTICAL none 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Light Volume 0 0 1 LightInspectorVolumeLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 1 bSizer8 wxHORIZONTAL none 12 wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Omni 0 0 80,80 1 LightInspectorOmniButton 1 protected 1 Resizable 1 -1,-1 0 wxFILTER_NONE wxDefaultValidator 0 0 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 m_staticline1 1 protected 1 Resizable 1 wxLI_VERTICAL 0 0 wxEXPAND 0 bSizer9 wxVERTICAL none 12 wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Projected 0 0 80,80 1 LightInspectorProjectedButton 1 protected 1 Resizable 1 -1,-1 0 wxFILTER_NONE wxDefaultValidator 1 6 wxALIGN_RIGHT|wxTOP 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Use start/end 0 0 1 LightInspectorStartEnd 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Colour 0 0 1 LightInspectorColourLabel 1 protected 1 Resizable 1 0 -1 12 wxLEFT|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 70,25 1 LightInspectorColour 1 protected 1 Resizable 1 -1,-1 wxCLRP_DEFAULT_STYLE|wxCLRP_USE_TEXTCTRL 0 wxFILTER_NONE wxDefaultValidator 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Options 0 0 1 LightInspectorOptionsLabel 1 protected 1 Resizable 1 0 -1 12 wxLEFT 0 bSizer7 wxVERTICAL none 5 wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Parallel 0 0 1 LightInspectorParallel 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Do not cast shadows (fast) 0 0 1 LightInspectorNoShadows 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Skip specular lighting 0 0 1 LightInspectorSkipSpecular 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Skip diffuse lighting 0 0 1 LightInspectorSkipDiffuse 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 12 wxEXPAND|wxLEFT 1 bSizer10 wxVERTICAL none 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Light Texture 0 0 1 LightInspectorTextureLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 LightInspectorChooserPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer81 wxVERTICAL none DarkRadiant-2.0.2/install/ui/lightinspector.xrc000066400000000000000000000135031245424655700215560ustar00rootroot00000000000000 600,345 wxVERTICAL wxALL|wxEXPAND 12 wxHORIZONTAL wxEXPAND 5 wxVERTICAL wxALL 5 -1 wxEXPAND|wxLEFT 12 wxHORIZONTAL wxRIGHT 12 0 wxEXPAND 0 wxEXPAND 0 wxVERTICAL wxLEFT 12 1 wxALIGN_RIGHT|wxTOP 6 0 wxALL 5 -1 wxLEFT|wxRIGHT 12 #000000 wxALL 5 -1 wxLEFT 12 wxVERTICAL wxALL 5 0 wxALL 5 0 wxALL 5 0 wxALL 5 0 wxEXPAND|wxLEFT 12 wxVERTICAL wxALL 5 -1 wxEXPAND|wxLEFT 12 wxVERTICAL DarkRadiant-2.0.2/install/ui/modelselector.fbp000066400000000000000000001722301245424655700213370ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject1 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY -1,-1 ModelSelectorPanel -1,-1 wxTAB_TRAVERSAL bSizer1 wxVERTICAL none 12 wxALL|wxEXPAND 1 bSizer2 wxHORIZONTAL none 5 wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 50 0 1 ModelSelectorSplitter 1 protected 1 Resizable 0.0 0 -1 1 wxSPLIT_VERTICAL wxSP_3D|wxSP_LIVE_UPDATE 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ModelSelectorLeftPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer4 wxVERTICAL none 0 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ModelSelectorOptionsPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer5 wxHORIZONTAL none 6 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Options: 0 0 1 m_staticText1 1 protected 1 Resizable 1 0 -1 6 wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Surround with monsterclip brush 0 0 1 ModelSelectorMonsterClipOption 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ModelSelectorRightPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer61 wxVERTICAL none 12 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT 0 bSizer6 wxHORIZONTAL none 6 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_CANCEL Cancel 0 0 1 ModelSelectorCancelButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_OK OK 0 0 1 ModelSelectorOkButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/modelselector.xrc000066400000000000000000000060231245424655700213600ustar00rootroot00000000000000 wxVERTICAL wxALL|wxEXPAND 12 wxHORIZONTAL wxEXPAND 5 0 0 50 vertical wxVERTICAL wxEXPAND 0 wxHORIZONTAL wxALL 6 -1 wxALL 6 0 wxVERTICAL wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT 12 wxHORIZONTAL 6 0 wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/objectivecomponentsdialog.fbp000066400000000000000000011472341245424655700237450ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY ObjCompMainPanel 700,600 wxTAB_TRAVERSAL bSizer10 wxVERTICAL none 12 wxALL|wxEXPAND 1 bSizer11 wxVERTICAL none 0 wxEXPAND 0 2 wxBOTH 1 12 fgSizer1 wxFLEX_GROWMODE_SPECIFIED none 8 10 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Description 0 0 1 m_staticText4 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompDescription 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Difficulty 0 0 1 Diff 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 1 bSizer12 wxHORIZONTAL none 0 wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompDiffPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer13 wxHORIZONTAL none 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Iniital State 0 0 1 m_staticText6 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompInitialState 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Flags 0 0 1 m_staticText26 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer34 wxHORIZONTAL none 0 wxALIGN_CENTER_VERTICAL|wxALL 1 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Mandatory 0 0 1 ObjCompObjMandatory 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALIGN_CENTER_VERTICAL|wxLEFT 1 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Ongoing 0 0 1 ObjCompObjOngoing 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALIGN_CENTER_VERTICAL|wxLEFT 1 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Irreversible 0 0 1 ObjCompObjIrreversible 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALIGN_CENTER_VERTICAL|wxLEFT 1 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Visible 0 0 1 ObjCompObjVisible 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Enabling Objectives 0 0 1 m_staticText7 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompEnablingObjectives 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Sucess Logic 0 0 1 m_staticText8 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 1 bSizer14 wxHORIZONTAL none 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompSuccessLogic 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Failure Logic 0 0 1 m_staticText9 1 protected 1 Resizable 1 0 -1 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompFailureLogic 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Completion Script 0 0 1 m_staticText81 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer141 wxHORIZONTAL none 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompCompletionScript 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Failure Script 0 0 1 m_staticText91 1 protected 1 Resizable 1 0 -1 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompFailureScript 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Completion Target 0 0 1 m_staticText811 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer1411 wxHORIZONTAL none 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompCompletionTarget 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Failure Target 0 0 1 m_staticText911 1 protected 1 Resizable 1 0 -1 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompFailureTarget 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 12 wxBOTTOM|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Components 0 0 1 ObjCompListLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 1 bSizer25 wxVERTICAL none 5 wxEXPAND 1 bSizer26 wxVERTICAL none 12 wxBOTTOM|wxEXPAND 0 bSizer27 wxHORIZONTAL none 5 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 -1,80 1 ObjCompListViewPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer17 wxVERTICAL none 5 wxEXPAND 0 bSizer28 wxVERTICAL none 6 wxEXPAND|wxLEFT 0 bSizer29 wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ADD Add 0 0 1 ObjCompAddComponentButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Delete 0 0 1 ObjCompDeleteComponentButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompComponentEditPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer35 wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 2 wxBOTH 1 12 fgSizer2 wxFLEX_GROWMODE_SPECIFIED none 2 12 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Type 0 0 1 m_staticText24 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompComponentType 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Flags 0 0 1 m_staticText25 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 0 bSizer31 wxHORIZONTAL none 0 wxALIGN_CENTER_VERTICAL|wxALL 1 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Satisfied at start 0 0 1 ObjCompSatisfiedAtStart 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Irreversible 0 0 1 ObjCompIrreversible 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL|wxALL 1 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Boolean NOT 0 0 1 ObjCompBooleanNOT 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL|wxALL 1 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Player responsible 0 0 1 ObjCompPlayerResponsible 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCompEditorContainer 1 protected 1 Resizable 1 0 wxSTATIC_BORDER|wxTAB_TRAVERSAL bSizer32 wxVERTICAL none 12 wxEXPAND|wxTOP 0 0 1 0 0 0 1 0 0 m_sdbSizer1 protected DarkRadiant-2.0.2/install/ui/objectivecomponentsdialog.xrc000066400000000000000000000405131245424655700237610ustar00rootroot00000000000000 700,600 wxVERTICAL wxALL|wxEXPAND 12 wxVERTICAL wxEXPAND 0 8 2 10 12 1 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 5 -1 wxEXPAND 0 wxHORIZONTAL wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 0 wxALIGN_CENTER_VERTICAL|wxALL 0 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxALL 0 0 wxALIGN_CENTER_VERTICAL|wxLEFT 6 0 wxALIGN_CENTER_VERTICAL|wxLEFT 6 0 wxALIGN_CENTER_VERTICAL|wxLEFT 6 0 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 5 wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 5 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 5 wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 5 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 5 wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 5 wxBOTTOM|wxTOP 12 -1 wxEXPAND|wxLEFT 12 wxVERTICAL wxEXPAND 5 wxVERTICAL wxBOTTOM|wxEXPAND 12 wxHORIZONTAL wxEXPAND | wxALL 5 wxVERTICAL wxEXPAND 5 wxVERTICAL wxEXPAND|wxLEFT 6 wxVERTICAL wxBOTTOM|wxEXPAND 6 0 wxEXPAND 5 0 wxEXPAND | wxALL 0 wxVERTICAL wxBOTTOM|wxEXPAND 6 2 2 12 12 1 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 0 wxALIGN_CENTER_VERTICAL|wxALL 0 -1 wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxALL 0 0 wxALIGN_CENTER_VERTICAL 0 0 wxALIGN_CENTER_VERTICAL|wxALL 0 0 wxALIGN_CENTER_VERTICAL|wxALL 0 0 wxEXPAND 0 wxVERTICAL wxEXPAND|wxTOP 12 wxALIGN_CENTER_HORIZONTAL|wxALL 5 wxALIGN_CENTER_HORIZONTAL|wxALL 5 DarkRadiant-2.0.2/install/ui/objectiveconditionsdialog.fbp000066400000000000000000004503441245424655700237270ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY ObjCondDialogMainPanel 500,600 wxTAB_TRAVERSAL bSizer5 wxVERTICAL none 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Objective Conditions 0 0 1 ObjCondDialogTopLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 1 bSizer61 wxHORIZONTAL none 6 wxEXPAND|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCondDialogConditionViewPanel 1 protected 1 Resizable 1 -1,120 0 wxTAB_TRAVERSAL bSizer7 wxVERTICAL none 5 wxEXPAND 0 ButtonSizer1 wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Add 0 0 1 ObjCondDialogAddConditionButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Delete 0 0 1 ObjCondDialogDeleteConditionButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Condition 0 0 1 ObjCondDialogConditionLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 0 bSizer6 wxHORIZONTAL none 12 wxEXPAND|wxLEFT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCondDialogConditionEditPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL 2 wxBOTH 1 12 fgSizer1 wxFLEX_GROWMODE_SPECIFIED none 7 6 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Source Mission: 0 0 1 m_staticText6 1 protected 1 Resizable 1 0 -1 0 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ObjCondDialogSourceMission 1 protected 1 Resizable 1 wxSP_ARROW_KEYS 0 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Source Objective: 0 0 1 m_staticText7 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ObjCondDialogSourceObjective 1 protected 1 Resizable 1 wxSP_ARROW_KEYS 0 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Source Objective State: 0 0 1 m_staticText8 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCondDialogSourceObjectiveState 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Target Objective: 0 0 1 m_staticText71 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCondDialogTargetObjective 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Action: 0 0 1 m_staticText9 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCondDialogAction 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Action Value: 0 0 1 m_staticText10 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjCondDialogActionValue 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Sentence 0 0 1 ObjCondDialogSentenceLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 0 bSizer91 wxHORIZONTAL none 12 wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY - 0 0 1 ObjCondDialogSentence 1 protected 1 Resizable 1 0 -1 12 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 0 bSizer8 wxHORIZONTAL none 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Cancel 0 0 1 ObjCondDialogCancelButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY OK 0 0 1 ObjCondDialogOkButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/objectiveconditionsdialog.xrc000066400000000000000000000177271245424655700237600ustar00rootroot00000000000000 500,600 wxVERTICAL wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxRIGHT 6 -1,120 wxVERTICAL wxEXPAND 5 wxVERTICAL wxBOTTOM|wxEXPAND 6 80,-1 0 wxEXPAND 6 80,-1 0 wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxLEFT 12 7 2 6 12 1 wxALIGN_CENTER_VERTICAL 0 -1 wxALL|wxEXPAND 0 0 0 10 wxALIGN_CENTER_VERTICAL 0 -1 wxEXPAND 5 0 0 10 wxALIGN_CENTER_VERTICAL 0 -1 wxEXPAND 0 0 wxALIGN_CENTER_VERTICAL 0 -1 wxEXPAND 0 0 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 0 wxALIGN_CENTER_VERTICAL|wxALL 0 -1 wxEXPAND 0 0 wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxLEFT 12 -1 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxLEFT 6 0 wxEXPAND|wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/objectiveseditor.fbp000066400000000000000000003761071245424655700220530ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY ObjDialogMainPanel 500,600 wxTAB_TRAVERSAL bSizer5 wxVERTICAL none 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Objective Entities 0 0 1 ObjDialogEntityLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 1 bSizer61 wxHORIZONTAL none 6 wxEXPAND|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjDialogEntityPanel 1 protected 1 Resizable 1 -1,120 0 wxTAB_TRAVERSAL bSizer7 wxVERTICAL none 5 wxEXPAND 0 ButtonSizer1 wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Add 0 0 1 ObjDialogAddEntityButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Delete 0 0 1 ObjDialogDeleteEntityButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Objectives 0 0 1 ObjDialogObjectivesLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 1 bSizer6 wxHORIZONTAL none 6 wxEXPAND|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjDialogObjectivesPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer9 wxVERTICAL none 5 wxEXPAND | wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ObjDialogObjectiveButtonPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL ButtonSizer wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Add 0 0 1 ObjDialogAddObjectiveButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Delete 0 0 1 ObjDialogDeleteObjectiveButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Clear 0 0 1 ObjDialogClearObjectiveButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Edit 0 0 1 ObjDialogEditObjectiveButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 5 wxEXPAND | wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 m_staticline1 1 protected 1 Resizable 1 wxLI_HORIZONTAL 0 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Move up 0 0 1 ObjDialogMoveObjUpButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Move down 0 0 1 ObjDialogMoveObjDownButton 1 protected 1 Resizable 1 80,-1 0 wxFILTER_NONE wxDefaultValidator 12 wxLEFT|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Success Logic 0 0 1 ObjDialogLogicLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 0 bSizer91 wxHORIZONTAL none 12 wxLEFT 1 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Edit Mission Success Logic 0 0 1 ObjDialogSuccessLogicButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 1 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Edit Objective Conditions 0 0 1 ObjDialogObjConditionsButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 12 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 0 bSizer8 wxHORIZONTAL none 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Cancel 0 0 1 ObjDialogCancelButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY OK 0 0 1 ObjDialogOkButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/objectiveseditor.xrc000066400000000000000000000160551245424655700220710ustar00rootroot00000000000000 500,600 wxVERTICAL wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxRIGHT 6 -1,120 wxVERTICAL wxEXPAND 5 wxVERTICAL wxBOTTOM|wxEXPAND 6 80,-1 0 wxEXPAND 6 80,-1 0 wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxRIGHT 6 wxVERTICAL wxEXPAND | wxALL 5 wxVERTICAL wxBOTTOM|wxEXPAND 6 80,-1 0 wxBOTTOM|wxEXPAND 6 80,-1 0 wxBOTTOM|wxEXPAND 6 80,-1 0 wxBOTTOM|wxEXPAND 6 80,-1 0 wxEXPAND | wxALL 5 wxBOTTOM|wxEXPAND 6 80,-1 0 wxBOTTOM|wxEXPAND 6 80,-1 0 wxLEFT|wxRIGHT|wxTOP 12 -1 wxEXPAND|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxLEFT 12 0 wxLEFT 6 0 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT|wxTOP 12 wxHORIZONTAL wxEXPAND|wxLEFT 6 0 wxEXPAND|wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/overlaydialog.fbp000066400000000000000000004645321245424655700213500ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject1 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY OverlayDialogMainPanel 500,380 wxTAB_TRAVERSAL bSizer1 wxVERTICAL none 12 wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Use background image 0 0 1 OverlayDialogUseBackgroundImage 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 12 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 OverlayDialogControlPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL 2 wxBOTH 1 6 fgSizer1 wxFLEX_GROWMODE_SPECIFIED none 6 6 5 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Image file 0 0 1 OverlayDialogLabelFile 1 protected 1 Resizable 1 0 -1 5 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 Select a file 0 1 OverlayDialogFilePicker 1 protected 1 Resizable 1 wxFLP_DEFAULT_STYLE|wxFLP_OPEN 0 wxFILTER_NONE wxDefaultValidator *.* 5 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Transparency 0 0 1 OverlayDialogLabelTrans 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer11 wxHORIZONTAL none 6 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY transparent 0 0 1 m_staticText8 1 protected 1 Resizable 1 0 -1 3 wxEXPAND|wxTOP 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 OverlayDialogTransparencySlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 12 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY opaque 0 0 1 m_staticText81 1 protected 1 Resizable 1 0 -1 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Image scale 0 0 1 OverlayDialogLabelScale 1 protected 1 Resizable 1 0 -1 0 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 OverlayDialogScalePanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer5 wxHORIZONTAL none 3 wxTOP 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 2000 0 0 0 1 OverlayDialogScaleSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 100 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Horizontal offset 0 0 1 OverlayDialogLabelHOffset 1 protected 1 Resizable 1 0 -1 0 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 OverlayDialogHorizOffsetPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer51 wxHORIZONTAL none 3 wxTOP 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 2000 0 -2000 0 1 OverlayDialogHorizOffsetSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 0 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Vertical offset 0 0 1 OverlayDialogLabelVOffset 1 protected 1 Resizable 1 0 -1 0 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 OverlayDialogVertOffsetPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer52 wxHORIZONTAL none 3 wxTOP 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 2000 0 -2000 0 1 OverlayDialogVertOffsetSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 0 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Options 0 0 1 OverlayDialogLabelOptions 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 1 bSizer4 wxVERTICAL none 6 wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Keep aspect ratio 0 0 1 OverlayDialogKeepAspect 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Zoom image with viewport 0 0 1 OverlayDialogZoomWithViewport 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Pan image with viewport 0 0 1 OverlayDialogPanWithViewport 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 12 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_CLOSE Close 0 0 1 OverlayDialogCloseButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/overlaydialog.xrc000066400000000000000000000172301245424655700213620ustar00rootroot00000000000000 500,380 wxVERTICAL wxALL 12 0 wxEXPAND | wxALL 12 6 2 6 6 1 wxALIGN_CENTER_VERTICAL|wxALL 5 -1 wxALL|wxEXPAND 5 Select a file *.* wxALIGN_CENTER_VERTICAL|wxALL 5 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxLEFT 6 -1 wxEXPAND|wxTOP 3 50 0 100 wxALIGN_CENTER_VERTICAL|wxRIGHT 12 -1 wxALL 5 -1 wxEXPAND | wxALL 0 wxHORIZONTAL wxTOP 3 100 0 2000 wxALL 5 -1 wxEXPAND | wxALL 0 wxHORIZONTAL wxTOP 3 0 -2000 2000 wxALL 5 -1 wxEXPAND | wxALL 0 wxHORIZONTAL wxTOP 3 0 -2000 2000 wxALL 5 -1 wxEXPAND 0 wxVERTICAL wxALL 6 0 wxALL 6 0 wxALL 6 0 wxALIGN_RIGHT|wxBOTTOM|wxLEFT|wxRIGHT 12 0 DarkRadiant-2.0.2/install/ui/particleeditor.fbp000066400000000000000000066073111245424655700215210ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject1 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY ParticleEditorMainPanel 800,665 wxTAB_TRAVERSAL bSizer1 wxVERTICAL none 12 wxALL|wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 0 1 ParticleEditorSplitter 1 protected 1 Resizable 0.0 0 -1 1 wxSPLIT_VERTICAL wxSP_3D 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 250,-1 1 m_panel1 1 protected 1 Resizable 1 250,-1 0 wxTAB_TRAVERSAL bSizer2 wxVERTICAL none 6 wxBOTTOM 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Particle Definitions 0 0 1 ParticleEditorDefinitionLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 3 bSizer5 wxHORIZONTAL none 5 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 -1,120 1 ParticleEditorDefinitionView 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer135 wxVERTICAL none 6 wxEXPAND|wxLEFT 0 bSizer6 wxVERTICAL none 0 wxALL 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_NEW New 0 0 1 ParticleEditorNewDefButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxTOP 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_SAVE Save 0 0 1 ParticleEditorSaveDefButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxTOP 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_COPY Copy 0 0 1 ParticleEditorCopyDefButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Particle Stages 0 0 1 ParticleEditorStageLabel 1 protected 1 Resizable 1 0 -1 0 wxEXPAND | wxALL 2 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 -1,120 1 ParticleEditorStagePanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer8 wxHORIZONTAL none 12 wxEXPAND|wxLEFT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 -1,120 1 ParticleEditorStageView 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer136 wxVERTICAL none 6 wxEXPAND|wxLEFT 0 bSizer9 wxVERTICAL none 6 wxBOTTOM|wxEXPAND 1 bSizer11 wxHORIZONTAL none 6 wxRIGHT 1 bSizer61 wxVERTICAL none 0 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Add 0 0 1 ParticleEditorAddStageButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxTOP|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Remove 0 0 1 ParticleEditorRemoveStageButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxTOP|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Toggle Visibility 0 0 1 ParticleEditorToggleStageButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 1 bSizer62 wxVERTICAL none 0 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Up 0 0 1 ParticleEditorMoveUpStageButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxTOP|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Down 0 0 1 ParticleEditorMoveDownStageButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxTOP|wxEXPAND 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Duplicate 0 0 1 ParticleEditorDuplicateStageButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_RIGHT 0 bSizer14 wxHORIZONTAL none 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Depth Hack: 0 0 1 m_staticText4 1 protected 1 Resizable 1 0 -1 0 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorDepthHack 1 protected 1 Resizable 1 80,-1 wxSP_ARROW_KEYS 0 12 wxBOTTOM 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Stage Settings 0 0 1 ParticleEditorStageSettingsLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ParticleEditorSettingsNotebook 1 protected 1 Resizable 1 0 Shader 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 m_panel5 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer26 wxVERTICAL none 6 wxALL|wxEXPAND 1 2 wxBOTH 1 12 fgSizer1 wxFLEX_GROWMODE_SPECIFIED none 7 6 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Shader: 0 0 1 m_staticText8 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ParticleEditorStageShader 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Colour: 0 0 1 m_staticText9 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ParticleEditorStageColour 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Fade Colour: 0 0 1 m_staticText10 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer15 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ParticleEditorStageFadeColour 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALL|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Use Entity Colour 0 0 1 ParticleEditorStageUseEntityColour 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Fade In Fraction: 0 0 1 m_staticText11 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer16 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageFadeInFrac 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageFadeInFracSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Fade Out Fraction: 0 0 1 m_staticText12 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer161 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageFadeOutFrac 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageFadeOutFracSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Fade Index Fraction: 0 0 1 m_staticText13 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer1611 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageFadeIdxFrac 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageFadeIdxFracSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Animation: 0 0 1 m_staticText14 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 1 bSizer19 wxHORIZONTAL none 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Frames: 0 0 1 m_staticText15 1 protected 1 Resizable 1 0 -1 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 9999 0 0 0 1 ParticleEditorStageAnimFrames 1 protected 1 Resizable 1 60,-1 wxSP_ARROW_KEYS 0 6 wxLEFT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Rate: 0 0 1 m_staticText16 1 protected 1 Resizable 1 0 -1 0 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageAnimRate 1 protected 1 Resizable 1 60,-1 wxSP_ARROW_KEYS 0 6 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY FPS 0 0 1 m_staticText17 1 protected 1 Resizable 1 0 -1 Count / Time 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 m_panel6 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer261 wxVERTICAL none 6 wxALL|wxEXPAND 1 2 wxBOTH 1 12 fgSizer11 wxFLEX_GROWMODE_SPECIFIED none 7 6 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Count: 0 0 1 m_staticText111 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer162 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 999 0 0 0 1 ParticleEditorStageCount 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 999 0 0 0 1 ParticleEditorStageCountSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 0 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Duration / sec: 0 0 1 m_staticText121 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer1612 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageDuration 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageDurationSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Bunching: 0 0 1 m_staticText131 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer16111 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageBunching 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageBunchingSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Cycles: 0 0 1 m_staticText1311 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer161111 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 999 0 0 0 1 ParticleEditorStageCycles 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 999 0 1 0 1 ParticleEditorStageCyclesSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 1 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Time Offset / sec: 0 0 1 m_staticText13111 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer1611111 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageTimeOffset 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageTimeOffsetSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Dead Time / sec: 0 0 1 m_staticText131111 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 1 bSizer16111111 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageDeadTime 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageDeadTimeSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 Size / Speed 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 m_panel7 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer2611 wxVERTICAL none 6 wxALL|wxEXPAND 1 2 wxBOTH 1 12 fgSizer111 wxFLEX_GROWMODE_SPECIFIED none 7 6 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Speed: 0 0 1 m_staticText1111 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer1621 wxHORIZONTAL none 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY From: 0 0 1 m_staticText66 1 protected 1 Resizable 1 0 -1 6 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageSpeedFrom 1 protected 1 Resizable 1 50,-1 wxSP_ARROW_KEYS 0 0 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageSpeedFromSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY To: 0 0 1 m_staticText67 1 protected 1 Resizable 1 0 -1 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageSpeedTo 1 protected 1 Resizable 1 50,-1 wxSP_ARROW_KEYS 0 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageSpeedToSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Size: 0 0 1 m_staticText1211 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer16211 wxHORIZONTAL none 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY From: 0 0 1 m_staticText661 1 protected 1 Resizable 1 0 -1 6 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageSizeFrom 1 protected 1 Resizable 1 50,-1 wxSP_ARROW_KEYS 0 0 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageSizeFromSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY To: 0 0 1 m_staticText671 1 protected 1 Resizable 1 0 -1 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageSizeTo 1 protected 1 Resizable 1 50,-1 wxSP_ARROW_KEYS 0 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageSizeToSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Rotation Speed: 0 0 1 m_staticText1312 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer162111 wxHORIZONTAL none 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY From: 0 0 1 m_staticText6611 1 protected 1 Resizable 1 0 -1 6 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageRotationSpeedFrom 1 protected 1 Resizable 1 50,-1 wxSP_ARROW_KEYS 0 0 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageRotationSpeedFromSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY To: 0 0 1 m_staticText6711 1 protected 1 Resizable 1 0 -1 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageRotationSpeedTo 1 protected 1 Resizable 1 50,-1 wxSP_ARROW_KEYS 0 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageRotationSpeedToSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Aspect Ratio: 0 0 1 m_staticText13112 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer162112 wxHORIZONTAL none 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY From: 0 0 1 m_staticText6612 1 protected 1 Resizable 1 0 -1 6 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageAspectFrom 1 protected 1 Resizable 1 50,-1 wxSP_ARROW_KEYS 0 0 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageAspectFromSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY To: 0 0 1 m_staticText6712 1 protected 1 Resizable 1 0 -1 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageAspectTo 1 protected 1 Resizable 1 50,-1 wxSP_ARROW_KEYS 0 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageAspectToSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Gravity: 0 0 1 m_staticText131112 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer16111112 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageGravity 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageGravitySlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 6 wxLEFT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Use World Gravity 0 0 1 ParticleEditorStageUseWorldGravity 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Bounds Expansion: 0 0 1 m_staticText1311111 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 1 bSizer161111111 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageBoundsExpansion 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 Distribution 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 m_panel61 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer2612 wxVERTICAL none 6 wxALL|wxEXPAND 1 2 wxBOTH 1 12 fgSizer112 wxFLEX_GROWMODE_SPECIFIED none 7 6 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Shape: 0 0 1 m_staticText1112 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer1622 wxHORIZONTAL none 3 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Rectangular 0 0 1 ParticleEditorStageShapeRect 1 protected 1 Resizable 1 wxRB_GROUP 0 wxFILTER_NONE wxDefaultValidator 0 3 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Cylindric 0 0 1 ParticleEditorStageShapeCyl 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 3 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Spherical 0 0 1 ParticleEditorStageSpherical 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY X Size: 0 0 1 m_staticText1212 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer16121 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageXSize 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageXSizeSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Y Size: 0 0 1 m_staticText1313 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer161112 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageYSize 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageYSizeSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Z Size: 0 0 1 m_staticText13113 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer1611112 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageZSize 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageZSizeSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Ring Size: 0 0 1 ParticleEditorStageRingSizeLabel 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer16111113 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageRingSize 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageRingSizeSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Offset: 0 0 1 m_staticText1311112 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ParticleEditorStageOffset 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Randomness: 0 0 1 m_staticText97 1 protected 1 Resizable 1 0 -1 3 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Distribute Particles randomly within Volume 0 0 1 ParticleEditorStageRandomDist 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator Direction / Orientation 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 m_panel611 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer26121 wxVERTICAL none 6 wxALL|wxEXPAND 1 2 wxBOTH 1 12 fgSizer1121 wxFLEX_GROWMODE_SPECIFIED none 7 6 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Direction: 0 0 1 m_staticText11121 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer16221 wxHORIZONTAL none 3 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Cone 0 0 1 ParticleEditorStageCone 1 protected 1 Resizable 1 wxRB_GROUP 0 wxFILTER_NONE wxDefaultValidator 0 3 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Outward 0 0 1 ParticleEditorStageOutward 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Cone Angle: 0 0 1 ParticleEditorStageConeAngleLabel 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer161211 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageConeAngle 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageConeAngleSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Upward Bias: 0 0 1 ParticleEditorStageUpwardBiasLabel 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer1611121 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageUpwardBias 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageUpwardBiasSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Orientation: 0 0 1 m_staticText131131 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer16111121 wxHORIZONTAL none 3 wxALL|wxBOTTOM|wxRIGHT|wxTOP|wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY View 0 0 1 ParticleEditorStageOrientView 1 protected 1 Resizable 1 wxRB_GROUP 0 wxFILTER_NONE wxDefaultValidator 0 3 wxALL|wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Aimed 0 0 1 ParticleEditorStageOrientAimed 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 3 wxALL|wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY X 0 0 1 ParticleEditorStageOrientX 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 3 wxALL|wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Y 0 0 1 ParticleEditorStageOrientY 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 3 wxALL|wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Z 0 0 1 ParticleEditorStageOrientZ 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Trails: 0 0 1 ParticleEditorStageTrailsLabel 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer161111131 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 500 0 0 0 1 ParticleEditorStageTrails 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageTrailsSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Time: 0 0 1 ParticleEditorStageTimeLabel 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 1 bSizer1611111121 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageAimedTime 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageAimedTimeSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Initial Angle: 0 0 1 m_staticText971 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 1 bSizer16111111211 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageInitialAngle 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageInitialAngleSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 Path 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 m_panel6111 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer261211 wxVERTICAL none 6 wxALL|wxEXPAND 1 2 wxBOTH 1 12 fgSizer11211 wxFLEX_GROWMODE_SPECIFIED none 7 6 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Path Type: 0 0 1 m_staticText111211 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer162211 wxHORIZONTAL none 3 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Standard 0 0 1 ParticleEditorStagePathStandard 1 protected 1 Resizable 1 wxRB_GROUP 0 wxFILTER_NONE wxDefaultValidator 0 3 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Flies 0 0 1 ParticleEditorStagePathFlies 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 3 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Helix 0 0 1 ParticleEditorStagePathHelix 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Radial Speed: 0 0 1 ParticleEditorStageRadialSpeedLabel 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer1612111 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageRadialSpeed 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageRadialSpeedSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Axial Speed: 0 0 1 ParticleEditorStageAxialSpeedLabel 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer16111211 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageAxialSpeed 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageAxialSpeedSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Sphere Radius: 0 0 1 ParticleEditorStageSphereRadiusLabel 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer161112111 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageSphereRadius 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageSphereRadiusSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Cylinder Size X: 0 0 1 ParticleEditorStageCylSizeXLabel 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer1611111311 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageCylSizeX 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageCylSizeXSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Cylinder Size Y: 0 0 1 ParticleEditorStageCylSizeYLabel 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 1 bSizer16111111212 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageCylSizeY 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageCylSizeYSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Cylinder Size Z: 0 0 1 ParticleEditorStageCylSizeZLabel 1 protected 1 Resizable 1 0 -1 0 wxEXPAND 1 bSizer161111112111 wxHORIZONTAL none 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ParticleEditorStageCylSizeZ 1 protected 1 Resizable 1 70,-1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 100 0 0 0 1 ParticleEditorStageCylSizeZSlider 1 protected 1 Resizable 1 wxSL_HORIZONTAL 0 wxFILTER_NONE wxDefaultValidator 50 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ParticleEditorPreviewPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer137 wxVERTICAL none 12 wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT 0 bSizer3 wxHORIZONTAL none 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Note: changes will be written to the file ..... 0 0 1 ParticleEditorSaveNote 1 protected 1 Resizable 1 0 -1 6 wxALIGN_RIGHT|wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_CLOSE Close 0 0 1 ParticleEditorCloseButton 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/particleeditor.xrc000066400000000000000000002436641245424655700215470ustar00rootroot00000000000000 800,665 wxVERTICAL wxALL|wxEXPAND 12 0 0 0 vertical 250,-1 wxVERTICAL wxBOTTOM 6 -1 wxEXPAND|wxLEFT 12 wxHORIZONTAL wxEXPAND | wxALL 5 wxVERTICAL wxEXPAND|wxLEFT 6 wxVERTICAL wxALL 0 0 wxTOP 6 0 wxTOP 6 0 wxBOTTOM|wxTOP 6 -1 wxEXPAND | wxALL 0 wxHORIZONTAL wxEXPAND|wxLEFT 12 wxVERTICAL wxEXPAND|wxLEFT 6 wxVERTICAL wxBOTTOM|wxEXPAND 6 wxHORIZONTAL wxRIGHT 6 wxVERTICAL wxALL|wxEXPAND 0 0 wxTOP|wxEXPAND 6 0 wxTOP|wxEXPAND 6 0 0 wxVERTICAL wxALL|wxEXPAND 0 0 wxTOP|wxEXPAND 6 0 wxTOP|wxEXPAND 6 0 wxALIGN_RIGHT 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALL 0 80,-1 0 0 10 wxBOTTOM 12 -1 wxEXPAND|wxLEFT 12 0 wxVERTICAL wxALL|wxEXPAND 6 7 2 6 12 1 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 wxALL|wxALIGN_CENTER_VERTICAL 5 0 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL|wxRIGHT 6 60,-1 0 0 9999 wxLEFT|wxALIGN_CENTER_VERTICAL 6 -1 wxALL 0 60,-1 0 0 10 wxALIGN_CENTER_VERTICAL|wxLEFT 6 -1 1 wxVERTICAL wxALL|wxEXPAND 6 7 2 6 12 1 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 999 wxALIGN_CENTER_VERTICAL 5 0 0 999 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 999 wxALIGN_CENTER_VERTICAL 5 1 1 999 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 0 wxVERTICAL wxALL|wxEXPAND 6 7 2 6 12 1 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 6 50,-1 0 0 10 wxALIGN_CENTER_VERTICAL 0 50 0 100 wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 5 50,-1 0 0 10 wxALIGN_CENTER_VERTICAL 0 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 6 50,-1 0 0 10 wxALIGN_CENTER_VERTICAL 0 50 0 100 wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 5 50,-1 0 0 10 wxALIGN_CENTER_VERTICAL 0 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 6 50,-1 0 0 10 wxALIGN_CENTER_VERTICAL 0 50 0 100 wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 5 50,-1 0 0 10 wxALIGN_CENTER_VERTICAL 0 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 6 50,-1 0 0 10 wxALIGN_CENTER_VERTICAL 0 50 0 100 wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 5 50,-1 0 0 10 wxALIGN_CENTER_VERTICAL 0 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxLEFT|wxALIGN_CENTER_VERTICAL 6 0 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 0 wxVERTICAL wxALL|wxEXPAND 6 7 2 6 12 1 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 3 0 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 3 0 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM 3 0 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 0 wxALIGN_CENTER_VERTICAL 5 -1 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM 3 0 0 wxVERTICAL wxALL|wxEXPAND 6 7 2 6 12 1 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 3 0 wxALIGN_CENTER_VERTICAL|wxALL 3 0 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxALL|wxBOTTOM|wxRIGHT|wxTOP|wxALIGN_CENTER_VERTICAL 3 0 wxALL|wxALIGN_CENTER_VERTICAL 3 0 wxALL|wxALIGN_CENTER_VERTICAL 3 0 wxALL|wxALIGN_CENTER_VERTICAL 3 0 wxALL|wxALIGN_CENTER_VERTICAL 3 0 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 500 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 0 wxVERTICAL wxALL|wxEXPAND 6 7 2 6 12 1 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 3 0 wxALIGN_CENTER_VERTICAL|wxALL 3 0 wxALL 3 0 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxALIGN_CENTER_VERTICAL 5 -1 wxEXPAND 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 6 70,-1 0 0 10 wxALIGN_CENTER_VERTICAL 5 50 0 100 wxVERTICAL wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT 12 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 5 -1 wxALIGN_RIGHT|wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/patchcreatedialog.fbp000066400000000000000000001251671245424655700221500ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject4 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY PatchCreatePanel 200,110 wxTAB_TRAVERSAL bSizer25 wxVERTICAL none 12 wxBOTTOM|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Create simple Patch Mesh 0 0 1 PatchCreateTopLabel 1 protected 1 Resizable 1 0 -1 6 wxLEFT 0 bSizer26 wxVERTICAL none 12 wxBOTTOM|wxEXPAND 0 2 wxBOTH 12 fgSizer3 wxFLEX_GROWMODE_SPECIFIED none 2 6 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Width: 0 0 1 m_staticText15 1 protected 1 Resizable 1 0 -1 0 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 PatchCreateWidthChoice 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Height: 0 0 1 m_staticText16 1 protected 1 Resizable 1 0 -1 0 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 PatchCreateHeightChoice 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Remove selected Brush 0 0 1 PatchCreateRemoveSelectedBrush 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/patchcreatedialog.xrc000066400000000000000000000047111245424655700221640ustar00rootroot00000000000000 200,110 wxVERTICAL wxBOTTOM|wxRIGHT 12 -1 wxLEFT 6 wxVERTICAL wxBOTTOM|wxEXPAND 12 2 2 6 12 wxALIGN_CENTER_VERTICAL 0 -1 wxALL 0 0 wxALIGN_CENTER_VERTICAL 0 -1 0 0 wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/patchinspector.fbp000066400000000000000000003514331245424655700215300ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject3 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY PatchInspectorMainPanel 219,285 wxTAB_TRAVERSAL bSizer23 wxVERTICAL none 12 wxALL|wxEXPAND 1 bSizer13 wxVERTICAL none 0 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 PatchInspectorVertexPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer16 wxVERTICAL none 6 wxBOTTOM 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Patch Control Vertices 0 0 1 PatchInspectorVertexLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT 0 2 wxBOTH 1 12 fgSizer1 wxFLEX_GROWMODE_SPECIFIED none 2 0 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Row: 0 0 1 m_staticText8 1 protected 1 Resizable 1 0 -1 5 wxALL|wxEXPAND 0 1 1 1 1 1 0 "0" 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 PatchInspectorControlRow 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Column: 0 0 1 m_staticText9 1 protected 1 Resizable 1 0 -1 5 wxALL|wxEXPAND 0 1 1 1 1 1 0 "0" 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 PatchInspectorControlColumn 1 protected 1 Resizable 0 1 0 wxFILTER_NONE wxDefaultValidator 12 wxEXPAND|wxLEFT|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 PatchInspectorCoordPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer15 wxVERTICAL none 8 wxBOTTOM|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Coordinates 0 0 1 PatchInspectorCoordLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT|wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 PatchInspectorTessPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer20 wxVERTICAL none 6 wxBOTTOM|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Patch Tesselation 0 0 1 PatchInspectorTessLabel 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer14 wxVERTICAL none 6 wxBOTTOM|wxTOP 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Fixed Subdivisions 0 0 1 PatchInspectorFixedSubdivisions 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND|wxTOP 0 2 wxBOTH 1 12 fgSizer2 wxFLEX_GROWMODE_SPECIFIED none 2 6 0 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Horizontal: 0 0 1 PatchInspectorSubdivisionsXLabel 1 protected 1 Resizable 1 0 -1 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 1 32 0 1 0 1 PatchInspectorSubdivisionsX 1 protected 1 Resizable 1 wxSP_ARROW_KEYS 0 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Vertical: 0 0 1 PatchInspectorSubdivisionsYLabel 1 protected 1 Resizable 1 0 -1 0 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 1 32 0 1 0 1 PatchInspectorSubdivisionsY 1 protected 1 Resizable 1 wxSP_ARROW_KEYS 0 DarkRadiant-2.0.2/install/ui/patchinspector.xrc000066400000000000000000000150351245424655700215500ustar00rootroot00000000000000 219,285 wxVERTICAL wxALL|wxEXPAND 12 wxVERTICAL wxEXPAND 0 wxVERTICAL wxBOTTOM 6 -1 wxEXPAND|wxLEFT|wxRIGHT 12 2 2 0 12 1 wxALIGN_CENTER_VERTICAL 5 -1 wxALL|wxEXPAND 5 0 0 wxALIGN_CENTER_VERTICAL 0 -1 wxALL|wxEXPAND 5 0 0 wxEXPAND|wxLEFT|wxRIGHT 12 wxVERTICAL wxBOTTOM|wxTOP 8 -1 wxEXPAND|wxLEFT|wxRIGHT 12 wxVERTICAL wxBOTTOM|wxTOP 6 -1 wxEXPAND 5 wxVERTICAL wxBOTTOM|wxTOP 6 0 wxBOTTOM|wxEXPAND|wxTOP 6 2 2 6 12 1 wxALIGN_CENTER_VERTICAL|wxALL 0 -1 wxALIGN_CENTER_VERTICAL 0 1 1 32 wxALIGN_CENTER_VERTICAL 0 -1 0 1 1 32 DarkRadiant-2.0.2/install/ui/patchthickendialog.fbp000066400000000000000000001527371245424655700223350ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY ThickenDialogMainPanel 300,185 wxTAB_TRAVERSAL bSizer9 wxVERTICAL none 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Thicken selected Patches 0 0 1 ThickenDialogTopLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 0 bSizer10 wxVERTICAL none 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Extrude along Vertex Normals 0 0 1 ThickenDialogExtrudeAlongNormals 1 protected 1 Resizable 1 wxRB_GROUP 0 wxFILTER_NONE wxDefaultValidator 0 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Extrude along X-Axis 0 0 1 ThickenDialogExtrudeAlongX 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Extrude along Y-Axis 0 0 1 ThickenDialogExtrudeAlongY 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Extrude along Z-Axis 0 0 1 ThickenDialogExtrudeAlongZ 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 12 wxEXPAND|wxLEFT|wxRIGHT 0 bSizer11 wxHORIZONTAL none 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Thickness (units): 0 0 1 m_staticText6 1 protected 1 Resizable 1 0 -1 5 wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ThickenDialogThickness 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 16 6 wxBOTTOM|wxTOP 1 bSizer12 wxVERTICAL none 12 wxLEFT|wxRIGHT 0 1 1 1 1 1 0 1 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Create Seams ("side walls") 0 0 1 ThickenDialogCreateSeams 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/patchthickendialog.xrc000066400000000000000000000061271245424655700223510ustar00rootroot00000000000000 300,185 wxVERTICAL wxALL 5 -1 wxEXPAND|wxLEFT 12 wxVERTICAL wxALL 5 0 wxALL 5 0 wxALL 5 0 wxALL 5 0 wxEXPAND|wxLEFT|wxRIGHT 12 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 -1 wxALL 5 16 wxBOTTOM|wxTOP 6 wxVERTICAL wxLEFT|wxRIGHT 12 1 DarkRadiant-2.0.2/install/ui/readableeditor.fbp000066400000000000000000013115561245424655700214530ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY ReadableEditorMainPanel 850,600 wxTAB_TRAVERSAL bSizer3 wxVERTICAL none 12 wxALL|wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 450 0 1 ReadableEditorSplitter 1 protected 1 Resizable 1 350 -1 1 wxSPLIT_VERTICAL wxSP_3D|wxSP_LIVE_UPDATE 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 m_panel1 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer9 wxVERTICAL none 6 wxEXPAND|wxRIGHT 1 bSizer4 wxVERTICAL none 12 wxBOTTOM 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY General Properties 0 0 1 ReadableEditorGeneralLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 0 2 wxBOTH 1 12 fgSizer1 wxFLEX_GROWMODE_SPECIFIED none 4 6 6 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Inventory Name: 0 0 1 m_staticText2 1 protected 1 Resizable 1 0 -1 0 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ReadableEditorInventoryName 1 protected 1 Resizable 1 wxTE_PROCESS_ENTER|wxTE_PROCESS_TAB 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY XData Name: 0 0 1 m_staticText3 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer5 wxHORIZONTAL none 0 wxALIGN_CENTER_VERTICAL|wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ReadableEditorXDataName 1 protected 1 Resizable 1 wxTE_PROCESS_ENTER|wxTE_PROCESS_TAB 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 0 1 1 1 1 Load From Art Provider; wxART_FILE_OPEN; 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY MyButton 0 0 1 ReadableEditorXDBrowseButton 1 protected 1 Resizable 1 wxBU_AUTODRAW 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Number of Pages: 0 0 1 m_staticText4 1 protected 1 Resizable 1 0 -1 5 wxEXPAND 1 bSizer6 wxHORIZONTAL none 0 wxALIGN_CENTER_VERTICAL|wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 10 0 0 0 1 ReadableEditorNumPages 1 protected 1 Resizable 1 wxSP_ARROW_KEYS 0 6 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Layout: 0 0 1 m_staticText6 1 protected 1 Resizable 1 0 -1 6 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY One-sided 0 0 1 ReadableEditorOneSided 1 protected 1 Resizable 1 wxRB_GROUP 0 wxFILTER_NONE wxDefaultValidator 1 6 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Two-sided 0 0 1 ReadableEditorTwoSided 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 0 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Pageturn Sound: 0 0 1 m_staticText5 1 protected 1 Resizable 1 0 -1 0 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ReadableEditorPageTurnSound 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 12 wxBOTTOM|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Page Editing 0 0 1 ReadableEditorPageLabel 1 protected 1 Resizable 1 0 -1 12 wxEXPAND|wxLEFT 1 bSizer7 wxVERTICAL none 12 wxBOTTOM|wxEXPAND 0 bSizer8 wxHORIZONTAL none 6 1 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_INSERT Insert Page 0 0 1 ReadableEditorInsertPage 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 0 1 1 1 1 Load From Art Provider; wxART_GOTO_FIRST; 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY MyButton 0 0 1 ReadableEditorGotoFirstPage 1 protected 1 Resizable 1 wxBU_AUTODRAW 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 0 1 1 1 1 Load From Art Provider; wxART_GO_BACK; 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY MyButton 0 0 1 ReadableEditorGotoPreviousPage 1 protected 1 Resizable 1 wxBU_AUTODRAW 0 wxFILTER_NONE wxDefaultValidator 6 wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Current Page: 0 0 1 m_staticText15 1 protected 1 Resizable 1 0 -1 0 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 1 0 0 1 ReadableEditorCurPage 1 protected 1 Resizable 1 0 -1 6 wxLEFT 0 1 1 1 1 Load From Art Provider; wxART_GO_FORWARD; 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY MyButton 0 0 1 ReadableEditorGotoNextPage 1 protected 1 Resizable 1 wxBU_AUTODRAW 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 0 1 1 1 1 Load From Art Provider; wxART_GOTO_LAST; 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY MyButton 0 0 1 ReadableEditorGotoLastPage 1 protected 1 Resizable 1 wxBU_AUTODRAW 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 1 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_DELETE Remove Page 0 0 1 ReadableEditorDeletePage 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 bSizer71 wxHORIZONTAL none 0 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY GUI Definition: 0 0 1 m_staticText9 1 protected 1 Resizable 1 0 -1 6 wxALIGN_CENTER_VERTICAL|wxLEFT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ReadableEditorGuiDefinition 1 protected 1 Resizable 1 wxTE_PROCESS_ENTER|wxTE_PROCESS_TAB 0 wxFILTER_NONE wxDefaultValidator 6 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 Load From Art Provider; wxART_FILE_OPEN; 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY MyButton 0 0 1 ReadableEditorGuiBrowseButton 1 protected 1 Resizable 1 wxBU_AUTODRAW 0 wxFILTER_NONE wxDefaultValidator 0 wxEXPAND 1 3 wxBOTH 1,2 2 12 fgSizer2 wxFLEX_GROWMODE_SPECIFIED none 3 6 5 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 m_staticText10 1 protected 1 Resizable 1 0 -1 6 wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Left 0 0 1 ReadableEditorPageLeftLabel 1 protected 1 Resizable 1 0 -1 6 wxALIGN_CENTER_HORIZONTAL|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Right 0 0 1 ReadableEditorPageRightLabel 1 protected 1 Resizable 1 0 -1 0 wxALIGN_CENTER|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Title 0 0 1 m_staticText13 1 protected 1 Resizable 1 0 -1 0 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ReadableEditorTitleLeft 1 protected 1 Resizable 1 -1,70 wxTE_MULTILINE|wxTE_WORDWRAP 0 wxFILTER_NONE wxDefaultValidator 0 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ReadableEditorTitleRight 1 protected 1 Resizable 1 -1,70 wxTE_MULTILINE|wxTE_WORDWRAP 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER|wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Body 0 0 1 m_staticText14 1 protected 1 Resizable 1 0 -1 0 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ReadableEditorBodyLeft 1 protected 1 Resizable 1 -1,-1 wxTE_MULTILINE|wxTE_WORDWRAP 0 wxFILTER_NONE wxDefaultValidator 0 wxALL|wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ReadableEditorBodyRight 1 protected 1 Resizable 1 wxTE_MULTILINE|wxTE_WORDWRAP 0 wxFILTER_NONE wxDefaultValidator 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ReadableEditorPreviewPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer13 wxVERTICAL none 12 wxALIGN_RIGHT|wxALL 0 bSizer12 wxHORIZONTAL none 24 wxRIGHT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Tools 0 0 1 ReadableEditorTools 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Cancel 0 0 1 ReadableEditorCancel 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Save 0 0 1 ReadableEditorSave 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT 0 1 1 1 1 1 0 1 1 0 0 Dock 0 Left 1 1 0 0 wxID_ANY Save and Close 0 0 1 ReadableEditorSaveAndClose 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/readableeditor.xrc000066400000000000000000000414021245424655700214650ustar00rootroot00000000000000 850,600 wxVERTICAL wxALL|wxEXPAND 12 350 1 450 vertical wxVERTICAL wxEXPAND|wxRIGHT 6 wxVERTICAL wxBOTTOM 12 -1 wxEXPAND|wxLEFT 12 4 2 6 12 1 wxALIGN_CENTER_VERTICAL 6 -1 wxALL|wxEXPAND 0 wxALIGN_CENTER_VERTICAL|wxALL 0 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxALL 0 wxLEFT 6 undefined.png 0 wxALIGN_CENTER_VERTICAL|wxALL 0 -1 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxALL 0 0 0 10 wxALIGN_CENTER_VERTICAL|wxLEFT 6 -1 wxALIGN_CENTER_VERTICAL|wxLEFT 6 1 wxALIGN_CENTER_VERTICAL 6 0 wxALIGN_CENTER_VERTICAL|wxALL 0 -1 wxALL|wxEXPAND 0 wxBOTTOM|wxTOP 12 -1 wxEXPAND|wxLEFT 12 wxVERTICAL wxBOTTOM|wxEXPAND 12 wxHORIZONTAL 6 0 wxLEFT 6 undefined.png 0 wxLEFT 6 undefined.png 0 wxALIGN_CENTER_VERTICAL|wxALL|wxLEFT 6 -1 wxALIGN_CENTER_VERTICAL|wxLEFT 0 -1 wxLEFT 6 undefined.png 0 wxLEFT 6 undefined.png 0 wxLEFT 6 0 wxBOTTOM|wxEXPAND 6 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxALL 0 -1 wxALIGN_CENTER_VERTICAL|wxLEFT 6 wxALIGN_CENTER_VERTICAL|wxLEFT 6 undefined.png 0 wxEXPAND 0 3 3 6 12 1,2 2 wxALL 5 -1 wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL|wxTOP 6 -1 wxALIGN_CENTER_HORIZONTAL|wxTOP 6 -1 wxALIGN_CENTER|wxALL 0 -1 wxALL|wxEXPAND 0 -1,70 wxALL|wxEXPAND 0 -1,70 wxALIGN_CENTER|wxALL 0 -1 wxALL|wxEXPAND 0 wxALL|wxEXPAND 0 wxVERTICAL wxALIGN_RIGHT|wxALL 12 wxHORIZONTAL wxRIGHT 24 0 wxLEFT 6 0 wxLEFT 6 0 wxLEFT 6 0 DarkRadiant-2.0.2/install/ui/renderpreview.fbp000066400000000000000000000620311245424655700213540ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject1 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY RenderPreviewPanel 500,300 wxTAB_TRAVERSAL RenderPreviewSizer wxVERTICAL none 0 wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP 0 bSizer2 wxHORIZONTAL none 3 wxBOTTOM|wxEXPAND|wxRIGHT|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 RenderPreviewAnimToolbar 1 1 protected 1 Resizable 5 1 wxTB_HORIZONTAL|wxTB_NODIVIDER 0 Load From Art Provider; darkradiant:media-playback-start-ltr.png; wxART_TOOLBAR 0 wxID_ANY wxITEM_NORMAL startTimeButton startTimeButton protected Start Render Time Load From Art Provider; darkradiant:media-playback-pause.png; wxART_TOOLBAR 0 wxID_ANY wxITEM_NORMAL pauseTimeButton pauseTimeButton protected Pause Render Time Load From Art Provider; darkradiant:media-playback-stop.png; wxART_TOOLBAR 0 wxID_ANY wxITEM_NORMAL stopTimeButton stopTimeButton protected Stop Render Time protected Load From Art Provider; wxART_GO_BACK; wxART_TOOLBAR 0 wxID_ANY wxITEM_NORMAL prevButton prevButton protected Previous Frame Load From Art Provider; wxART_GO_FORWARD; wxART_TOOLBAR 0 wxID_ANY wxITEM_NORMAL nextButton nextButton protected Next Frame 5 wxEXPAND 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 RenderPreviewFilterToolbar 1 1 protected 1 Resizable 5 1 wxTB_HORIZONTAL|wxTB_HORZ_TEXT 0 DarkRadiant-2.0.2/install/ui/renderpreview.xrc000066400000000000000000000053601245424655700214030ustar00rootroot00000000000000 500,300 wxVERTICAL wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP 0 wxHORIZONTAL wxBOTTOM|wxEXPAND|wxRIGHT|wxTOP 3 1 5 Start Render Time undefined.png Pause Render Time undefined.png Stop Render Time undefined.png Previous Frame undefined.png Next Frame undefined.png wxEXPAND 5 1 5 DarkRadiant-2.0.2/install/ui/responseeditor.fbp000066400000000000000000001634771245424655700215600ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY ResponseEditorMainPanel 500,416 wxTAB_TRAVERSAL bSizer18 wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 bSizer19 wxHORIZONTAL none 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Type: 0 0 1 m_staticText15 1 protected 1 Resizable 1 0 -1 12 wxALIGN_CENTER_VERTICAL|wxLEFT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ResponseEditorTypeCombo 1 protected 1 Resizable -1 1 0 wxFILTER_NONE wxDefaultValidator 6 wxTOP|wxBOTTOM 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Active 0 0 1 ResponseEditorActive 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 4 wxEXPAND|wxTOP 0 2 wxBOTH 1 12 fgSizer4 wxFLEX_GROWMODE_SPECIFIED none 10 6 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Chance: 0 0 1 ResponseEditorChance 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ResponseEditorChanceValuePanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer35 wxVERTICAL none 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Random Effects: 0 0 1 ResponseEditorRandomFX 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALL|wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ResponseEditorRandomFXValue 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 10 wxBOTTOM|wxTOP 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Response Effects 0 0 1 ResponseEditorFXLabel 1 protected 1 Resizable 1 0 -1 0 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 ResponseEditorFXPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer4 wxVERTICAL none DarkRadiant-2.0.2/install/ui/responseeditor.xrc000066400000000000000000000064511245424655700215710ustar00rootroot00000000000000 500,416 wxVERTICAL wxBOTTOM|wxEXPAND 6 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 -1 wxALIGN_CENTER_VERTICAL|wxLEFT 12 wxTOP|wxBOTTOM 6 0 wxEXPAND|wxTOP 4 10 2 6 12 1 wxALIGN_CENTER_VERTICAL 5 0 wxEXPAND | wxALL 0 wxVERTICAL wxALIGN_CENTER_VERTICAL 0 0 wxALL|wxEXPAND 0 wxBOTTOM|wxTOP 10 -1 wxEXPAND | wxALL 0 wxVERTICAL DarkRadiant-2.0.2/install/ui/stimeditor.fbp000066400000000000000000011350111245424655700206560ustar00rootroot00000000000000 C++ 1 source_name 0 0 res UTF-8 connect 1000 none 0 MyProject2 . 1 1 1 1 UI 0 0 0 wxAUI_MGR_DEFAULT 1 1 impl_virtual 0 wxID_ANY StimEditorMainPanel 500,416 wxTAB_TRAVERSAL bSizer18 wxVERTICAL none 6 wxBOTTOM|wxEXPAND 0 bSizer19 wxHORIZONTAL none 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Type: 0 0 1 m_staticText15 1 protected 1 Resizable 1 0 -1 12 wxALIGN_CENTER_VERTICAL|wxLEFT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 StimEditorTypeCombo 1 protected 1 Resizable -1 1 0 wxFILTER_NONE wxDefaultValidator 6 wxTOP|wxBOTTOM 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Active 0 0 1 StimEditorActive 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxBOTTOM|wxEXPAND 0 2 wxBOTH 1 12 fgSizer3 wxFLEX_GROWMODE_SPECIFIED none 2 6 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Activation Timer: 0 0 1 StimEditorActivationTimer 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 StimEditorActivationTimerPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer20 wxHORIZONTAL none 6 wxALIGN_CENTER_VERTICAL|wxFIXED_MINSIZE|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 200 0 0 0 -1,-1 1 StimEditorAcivationTimerHour 1 protected 1 Resizable 1 60,-1 wxSP_ARROW_KEYS 0 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY h 0 0 1 m_staticText21 1 protected 1 Resizable 1 0 -1 6 wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 59 0 0 0 -1,-1 1 StimEditorAcivationTimerMinute 1 protected 1 Resizable 1 60,-1 wxSP_ARROW_KEYS 0 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY m 0 0 1 m_staticText211 1 protected 1 Resizable 1 0 -1 6 wxALIGN_RIGHT|wxRIGHT|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 59 0 0 0 -1,-1 1 StimEditorAcivationTimerSecond 1 protected 1 Resizable 1 60,-1 wxSP_ARROW_KEYS 0 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY s 0 0 1 m_staticText212 1 protected 1 Resizable 1 0 -1 6 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 999 0 0 0 -1,-1 1 StimEditorAcivationTimerMS 1 protected 1 Resizable 1 60,-1 wxSP_ARROW_KEYS 0 6 wxALL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY ms 0 0 1 m_staticText213 1 protected 1 Resizable 1 0 -1 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Timer restarts after firing 0 0 1 StimEditorTimerRestarts 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 StimEditorTimerRestartPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer21 wxHORIZONTAL none 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Timer reloads 0 0 1 StimEditorTimerReloads 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxLEFT|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 1000 0 0 0 1 StimEditorTimerReloadsTimes 1 protected 1 Resizable 1 60,-1 wxSP_ARROW_KEYS 0 6 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY times 0 0 1 m_staticText30 1 protected 1 Resizable 1 0 -1 6 wxTOP|wxBOTTOM 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Timer waits for start (when disabled: starts at spawn time) 0 0 1 StimEditorTimerWaitsForStart 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 4 wxEXPAND|wxTOP 0 2 wxBOTH 1 12 fgSizer4 wxFLEX_GROWMODE_SPECIFIED none 10 6 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Time interval: 0 0 1 StimEditorTimeInterval 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxEXPAND 1 bSizer241 wxHORIZONTAL none 5 wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 9999999 0 0 0 1 StimEditorTimeIntervalValue 1 protected 1 Resizable 1 wxSP_ARROW_KEYS 0 6 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY ms 0 0 1 StimEditorTimeIntervalUnitLabel 1 protected 1 Resizable 1 0 -1 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Duration: 0 0 1 StimEditorDuration 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxEXPAND 1 bSizer24 wxHORIZONTAL none 5 wxEXPAND|wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 9999999 0 0 0 1 StimEditorDurationValue 1 protected 1 Resizable 1 wxSP_ARROW_KEYS 0 6 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY ms 0 0 1 StimEditorDurationUnitLabel 1 protected 1 Resizable 1 0 -1 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Radius 0 0 1 StimEditorRadius 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxEXPAND 1 bSizer23 wxHORIZONTAL none 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 99999 0 0 0 1 StimEditorRadiusValue 1 protected 1 Resizable 1 wxSP_ARROW_KEYS 0 12 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Use bounds 0 0 1 StimEditorRadiusUseBounds 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Radius changes over time to: 0 0 1 StimEditorRadiusChangesOverTime 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 99999 0 0 0 1 StimEditorRadiusChangesOverTimeValue 1 protected 1 Resizable 1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Magnitude: 0 0 1 StimEditorMagnitude 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 StimEditorMagnitudePanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer28 wxHORIZONTAL none 5 wxALIGN_CENTER_VERTICAL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 1 10000 0 0 0 1 StimEditorMagnitudeValue 1 protected 1 Resizable 1 wxSP_ARROW_KEYS 0 12 wxALIGN_CENTER_VERTICAL|wxLEFT 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Falloff Exponent: 0 0 1 StimEditorMagnitudeFalloff 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Max Fire Count: 0 0 1 StimEditorMaxFireCount 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 5 wxEXPAND|wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 1000000 0 0 0 1 StimEditorMaxFireCountValue 1 protected 1 Resizable 1 wxSP_ARROW_KEYS 0 5 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Chance: 0 0 1 StimEditorChance 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 StimEditorChanceValuePanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer35 wxVERTICAL none 0 wxALIGN_CENTER_VERTICAL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Velocity: 0 0 1 StimEditorVelocity 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALL|wxEXPAND 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 StimEditorVelocityValue 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxALIGN_CENTER_VERTICAL|wxALL 0 1 1 1 1 1 0 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Bounds: 0 0 1 StimEditorBounds 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 0 wxEXPAND | wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 StimEditorBoundsPanel 1 protected 1 Resizable 1 0 wxTAB_TRAVERSAL bSizer29 wxHORIZONTAL none 6 wxALIGN_CENTER_VERTICAL|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Min: 0 0 1 m_staticText19 1 protected 1 Resizable 1 0 -1 6 wxRIGHT 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 StimEditorBoundsMinValue 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator 6 wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT 0 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY Max: 0 0 1 m_staticText20 1 protected 1 Resizable 1 0 -1 0 wxALL 1 1 1 1 1 1 0 1 1 0 Dock 0 Left 1 1 0 0 wxID_ANY 0 0 1 StimEditorBoundsMaxValue 1 protected 1 Resizable 1 0 wxFILTER_NONE wxDefaultValidator DarkRadiant-2.0.2/install/ui/stimeditor.xrc000066400000000000000000000374571245424655700207210ustar00rootroot00000000000000 500,416 wxVERTICAL wxBOTTOM|wxEXPAND 6 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 -1 wxALIGN_CENTER_VERTICAL|wxLEFT 12 wxTOP|wxBOTTOM 6 0 wxBOTTOM|wxEXPAND 6 2 2 6 12 1 wxALIGN_CENTER_VERTICAL 5 0 wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxFIXED_MINSIZE|wxRIGHT 6 60,-1 0 0 200 wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxRIGHT|wxALIGN_CENTER_VERTICAL 6 60,-1 0 0 59 wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALIGN_RIGHT|wxRIGHT|wxALIGN_CENTER_VERTICAL 6 60,-1 0 0 59 wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxALIGN_CENTER_VERTICAL 6 60,-1 0 0 999 wxALL 6 -1 wxALIGN_CENTER_VERTICAL 5 0 wxEXPAND | wxALL 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 5 0 wxLEFT|wxRIGHT 6 60,-1 0 0 1000 wxALIGN_CENTER_VERTICAL|wxLEFT 6 -1 wxTOP|wxBOTTOM 6 0 wxEXPAND|wxTOP 4 10 2 6 12 1 wxALIGN_CENTER_VERTICAL 5 0 wxEXPAND 5 wxHORIZONTAL wxEXPAND 5 0 0 9999999 wxALIGN_CENTER_VERTICAL|wxLEFT 6 -1 wxALIGN_CENTER_VERTICAL 5 0 wxEXPAND 5 wxHORIZONTAL wxEXPAND|wxALIGN_CENTER_VERTICAL 5 0 0 9999999 wxALIGN_CENTER_VERTICAL|wxLEFT 6 -1 wxALIGN_CENTER_VERTICAL 5 0 wxEXPAND 5 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 5 0 0 99999 wxALIGN_CENTER_VERTICAL|wxLEFT 12 0 wxALIGN_CENTER_VERTICAL|wxALL 0 0 wxEXPAND 5 0 0 99999 wxALIGN_CENTER_VERTICAL 5 0 wxEXPAND | wxALL 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 5 1 0 10000 wxALIGN_CENTER_VERTICAL|wxLEFT 12 0 wxALIGN_CENTER_VERTICAL 5 0 wxEXPAND|wxALIGN_CENTER_VERTICAL 5 0 0 1000000 wxALIGN_CENTER_VERTICAL 5 0 wxEXPAND | wxALL 0 wxVERTICAL wxALIGN_CENTER_VERTICAL 0 0 wxALL|wxEXPAND 0 wxALIGN_CENTER_VERTICAL|wxALL 0 0 wxEXPAND | wxALL 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL|wxRIGHT 6 -1 wxRIGHT 6 wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT 6 -1 wxALL 0 DarkRadiant-2.0.2/install/user.xml000066400000000000000000000317451245424655700170750ustar00rootroot00000000000000 DarkRadiant-2.0.2/libs/000077500000000000000000000000001245424655700146465ustar00rootroot00000000000000DarkRadiant-2.0.2/libs/BasicTexture2D.h000066400000000000000000000026061245424655700176130ustar00rootroot00000000000000#pragma once #include "Texture.h" /** * \brief * Implementation of Texture for a 2D image texture. */ class BasicTexture2D : public Texture { // The GL bind number for use in OpenGL calls GLuint texture_number; // Texture Dimensions std::size_t _width, _height; // Texture name std::string _name; public: // Constructor BasicTexture2D(GLuint texNum = 0, const std::string& name = "") : texture_number(texNum), _name(name) {} ~BasicTexture2D() { if (texture_number != 0) { // Remove this texture from openGL if it's still loaded glDeleteTextures(1, &texture_number); } } /** * \brief * Set the texture number. */ void setGLTexNum(GLuint texnum) { texture_number = texnum; } /** * \brief * Set the image width. */ void setWidth(std::size_t width) { _width = width; } /** * \brief * Set the image height. */ void setHeight(std::size_t height) { _height = height; } /* Texture interface */ std::string getName() const { return _name; } GLuint getGLTexNum() const { return texture_number; } std::size_t getWidth() const { return _width; } std::size_t getHeight() const { return _height; } }; // class Texture typedef std::shared_ptr BasicTexture2DPtr; DarkRadiant-2.0.2/libs/BasicUndoMemento.h000066400000000000000000000006221245424655700202130ustar00rootroot00000000000000#pragma once #include "iundo.h" namespace undo { /** * An UndoMemento implementation capable of holding a single * copyable object, which is stored by value. */ template class BasicUndoMemento : public IUndoMemento { Copyable _data; public: BasicUndoMemento(const Copyable& data) : _data(data) {} const Copyable& data() const { return _data; } }; } // namespace DarkRadiant-2.0.2/libs/EventRateLimiter.h000066400000000000000000000034761245424655700202540ustar00rootroot00000000000000#pragma once #include /** * \brief * Helper class to restrict the frequency of an event, such as updating a GTK * dialog in response to rapidly-changing data. * * An EventRateLimiter provides a simple means for the frequency of an arbitrary * event to be limited. It provides a single method, readyForEvent(), which * returns a boolean indicating whether the event should be triggered or not. * The EventRateLimiter is initalised with a value indicating how often the * events may be triggered. * * Note that the EventRateLimiter has no knowledge of the underlying event, it * simply returns a value from the readyForEvent() function, assuming that the * calling code will fire the event if the return value is true. */ class EventRateLimiter { // Separation time provided at construction unsigned long _separationTime; // Last clock invocation clock_t _lastClock; public: /** * \brief * Construct an EventRateLimiter with the given event separation time. * * \param separationTime * Number of milliseconds that should elapse between subsequent events. */ EventRateLimiter(unsigned long separationTimeMillis) : _separationTime(separationTimeMillis), _lastClock(clock()) { } /** * \brief * Test whether the event is ready to be triggered. * * If the return value is false, the calling code should not trigger the * event. If the return value is true, the timer is reset and the event may * be triggered by the calling code. */ bool readyForEvent() { clock_t currentClk = clock(); float diffMillis = (currentClk - _lastClock) / (0.001f * CLOCKS_PER_SEC); if (diffMillis >= _separationTime) { _lastClock = currentClk; return true; } else { return false; } } }; DarkRadiant-2.0.2/libs/Makefile.am000066400000000000000000000000651245424655700167030ustar00rootroot00000000000000SUBDIRS = math xmlutil scene wxutil ddslib picomodel DarkRadiant-2.0.2/libs/Makefile.in000066400000000000000000000511271245424655700167210ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libs DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = math xmlutil scene wxutil ddslib picomodel all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/libs/ObservedSelectable.h000066400000000000000000000030721245424655700205560ustar00rootroot00000000000000#pragma once #include "iselectable.h" #include "iselection.h" namespace selection { /** * \brief * Implementation of the Selectable interface which invokes a user-specified * callback function when the selection state is changed. */ class ObservedSelectable : public Selectable { // Callback to invoke on selection changed SelectionChangedSlot _onchanged; // Current selection state bool _selected; public: /** * \brief * Construct an ObservedSelectable with the given callback function. */ ObservedSelectable(const SelectionChangedSlot& onchanged) : _onchanged(onchanged), _selected(false) { } /** * \brief * Copy constructor. */ ObservedSelectable(const ObservedSelectable& other) : Selectable(other), _onchanged(other._onchanged), _selected(false) { setSelected(other.isSelected()); } ObservedSelectable& operator=(const ObservedSelectable& other) { setSelected(other.isSelected()); return *this; } virtual ~ObservedSelectable() { setSelected(false); } /** * \brief * Set the selection state. */ virtual void setSelected(bool select) { // Change state and invoke callback only if the new state is different // from the current state if (select ^ _selected) { _selected = select; if (_onchanged) { _onchanged(*this); } } } virtual bool isSelected() const { return _selected; } virtual void invertSelected() { setSelected(!isSelected()); } }; } // namespace DarkRadiant-2.0.2/libs/ObservedUndoable.h000066400000000000000000000025131245424655700202430ustar00rootroot00000000000000#pragma once #include "iundo.h" #include "mapfile.h" #include "warnings.h" #include #include "BasicUndoMemento.h" namespace undo { template class ObservedUndoable : public IUndoable { typedef std::function ImportCallback; Copyable& _object; ImportCallback _importCallback; IUndoStateSaver* _undoStateSaver; IMapFileChangeTracker* _map; public: ObservedUndoable(Copyable& object, const ImportCallback& importCallback) : _object(object), _importCallback(importCallback), _undoStateSaver(NULL), _map(NULL) {} IMapFileChangeTracker* map() { return _map; } void onInsertIntoScene(IMapFileChangeTracker* map) { _map = map; _undoStateSaver = GlobalUndoSystem().getStateSaver(*this); } void onRemoveFromScene(IMapFileChangeTracker* map) { _map = NULL; _undoStateSaver = NULL; GlobalUndoSystem().releaseStateSaver(*this); } void save() { if (_map != NULL) { _map->changed(); } if (_undoStateSaver != NULL) { _undoStateSaver->save(*this); } } IUndoMementoPtr exportState() const { return IUndoMementoPtr(new BasicUndoMemento(_object)); } void importState(const IUndoMementoPtr& state) { save(); _importCallback(std::static_pointer_cast >(state)->data()); } }; } // namespace DarkRadiant-2.0.2/libs/RGBAImage.h000066400000000000000000000044511245424655700165010ustar00rootroot00000000000000#pragma once #include "igl.h" #include "iimage.h" #include "BasicTexture2D.h" #include #include struct RGBAPixel { unsigned char red, green, blue, alpha; }; /** * An RGBA image represents a single-mipmap image with certain * dimensions. The memory for the actual pixelmap is allocated * and de-allocated automatically. */ class RGBAImage : public Image, public boost::noncopyable { public: RGBAPixel* pixels; std::size_t width; std::size_t height; RGBAImage(std::size_t _width, std::size_t _height) : pixels(new RGBAPixel[_width * _height]), width(_width), height(_height) {} ~RGBAImage() { delete[] pixels; } virtual byte* getMipMapPixels(std::size_t mipMapIndex) const { assert(mipMapIndex == 0); // only one mipmap is allowed here return reinterpret_cast(pixels); } virtual std::size_t getWidth(std::size_t mipMapIndex) const { assert(mipMapIndex == 0); // only one mipmap is allowed here return width; } virtual std::size_t getHeight(std::size_t mipMapIndex) const { assert(mipMapIndex == 0); // only one mipmap is allowed here return height; } /* BindableTexture implementation */ TexturePtr bindTexture(const std::string& name) const { GLuint textureNum; GlobalOpenGL().assertNoErrors(); // Allocate a new texture number and store it into the Texture structure glGenTextures(1, &textureNum); glBindTexture(GL_TEXTURE_2D, textureNum); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // Download the image to OpenGL gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, static_cast(getWidth(0)), static_cast(getHeight(0)), GL_RGBA, GL_UNSIGNED_BYTE, getMipMapPixels(0) ); // Un-bind the texture glBindTexture(GL_TEXTURE_2D, 0); // Construct texture object BasicTexture2DPtr tex2DObject(new BasicTexture2D(textureNum, name)); tex2DObject->setWidth(getWidth(0)); tex2DObject->setHeight(getHeight(0)); GlobalOpenGL().assertNoErrors(); return tex2DObject; } bool isPrecompressed() const { return false; // not compressed } }; typedef std::shared_ptr RGBAImagePtr; DarkRadiant-2.0.2/libs/RandomOrigin.h000066400000000000000000000014721245424655700174130ustar00rootroot00000000000000#pragma once #include "math/Vector3.h" #include #include /** * Utility class containing a method to generate a random vector within a * certain distance of the world origin. */ class RandomOrigin { public: /** * Generate a random vector within of the world origin, returning * a string formatted correctly as an "origin" key. */ static std::string generate(int maxDist) { // Generate three random numbers between 0 and maxDist float x = maxDist * (float(std::rand()) / float(RAND_MAX)); float y = maxDist * (float(std::rand()) / float(RAND_MAX)); float z = maxDist * (float(std::rand()) / float(RAND_MAX)); // Construct a vector and return the formatted string return string::to_string(Vector3(x, y, z)); } }; DarkRadiant-2.0.2/libs/SelectableNode.h000066400000000000000000000022651245424655700176750ustar00rootroot00000000000000#pragma once #include "scene/Node.h" #include "ObservedSelectable.h" #include namespace scene { /** * \brief * Subclass of scene::Node which implements the Selectable interface. * * The GlobalSelectionSystem will be notified of selection changes. */ class SelectableNode : public scene::Node, public selection::ObservedSelectable { public: SelectableNode() : ObservedSelectable(std::bind(&SelectableNode::selectedChanged, this, std::placeholders::_1)) {} // The copy-constructor doesn't copy the signal, re-connect to this instance instead SelectableNode(const SelectableNode& other) : scene::Node(other), ObservedSelectable(std::bind(&SelectableNode::selectedChanged, this, std::placeholders::_1)) {} virtual ~SelectableNode() {} // override scene::Inode::onRemoveFromScene to de-select self virtual void onRemoveFromScene() { setSelected(false); Node::onRemoveFromScene(); } private: /** * \brief * Callback invoked by the ObservedSelectable when the selection changes. */ void selectedChanged(const Selectable& selectable) { GlobalSelectionSystem().onSelectedChanged(Node::getSelf(), selectable); } }; } // namespace DarkRadiant-2.0.2/libs/Transformable.h000066400000000000000000000057011245424655700176210ustar00rootroot00000000000000#pragma once #include "itransformable.h" #include "math/Matrix4.h" #include "math/Quaternion.h" const Vector3 c_translation_identity(0, 0, 0); const Quaternion c_rotation_identity(Quaternion::Identity()); const Vector3 c_scale_identity(1, 1, 1); /** * Base implementation of the ITransformable interface. */ class Transformable : public ITransformable { private: Vector3 _translation; Quaternion _rotation; Vector3 _scale; TransformModifierType _type; public: Transformable() : _translation(c_translation_identity), _rotation(Quaternion::Identity()), _scale(c_scale_identity), _type(TRANSFORM_PRIMITIVE) {} void setType(TransformModifierType type) { _type = type; } TransformModifierType getType() const { return _type; } void setTranslation(const Vector3& value) { _translation = value; _onTransformationChanged(); } void setRotation(const Quaternion& value) { _rotation = value; _onTransformationChanged(); } void setScale(const Vector3& value) { _scale = value; _onTransformationChanged(); } void freezeTransform() { if (_translation != c_translation_identity || _rotation != c_rotation_identity || _scale != c_scale_identity) { _applyTransformation(); _translation = c_translation_identity; _rotation = c_rotation_identity; _scale = c_scale_identity; _onTransformationChanged(); } } /* greebo: This reverts the currently active transformation * by setting the scale/rotation/translation to identity. * It's enough to call _onTransformationChanged() as this * usually marks the node's geometry as "needs re-evaluation", * and during next rendering turn everything will be updated. */ void revertTransform() { _translation = c_translation_identity; _rotation = c_rotation_identity; _scale = c_scale_identity; _onTransformationChanged(); } const Vector3& getTranslation() const { return _translation; } const Quaternion& getRotation() const { return _rotation; } const Vector3& getScale() const { return _scale; } Matrix4 calculateTransform() const { return getMatrixForComponents(getTranslation(), getRotation(), getScale()); } protected: /** * greebo: Signal method for subclasses. This gets called * as soon as anything (translation, scale, rotation) is changed. * * To be implemented by subclasses */ virtual void _onTransformationChanged() {} /** * greebo: Signal method to be implemented by subclasses. * Is invoked whenever the transformation is reverted or frozen. */ virtual void _applyTransformation() {} private: static Matrix4 getMatrixForComponents(const Vector3& translation, const Quaternion& rotation, const Vector3& scale) { Matrix4 result(Matrix4::getRotationQuantised(rotation)); result.x().getVector3() *= scale.x(); result.y().getVector3() *= scale.y(); result.z().getVector3() *= scale.z(); result.tx() = translation.x(); result.ty() = translation.y(); result.tz() = translation.z(); return result; } }; DarkRadiant-2.0.2/libs/archivelib.h000066400000000000000000000150711245424655700171330ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined (INCLUDED_ARCHIVELIB_H) #define INCLUDED_ARCHIVELIB_H #include "debugging/debugging.h" #include "iarchive.h" #include "stream/filestream.h" #include "stream/textfilestream.h" #include "string/string.h" #include "os/path.h" #include "iregistry.h" /// \brief A single-byte-reader wrapper around an InputStream. /// Optimised for reading one byte at a time. /// Uses a buffer to reduce the number of times the wrapped stream must be read. template class SingleByteInputStream { typedef typename InputStreamType::byte_type byte_type; InputStreamType& m_inputStream; byte_type m_buffer[SIZE]; byte_type* m_cur; byte_type* m_end; public: SingleByteInputStream(InputStreamType& inputStream) : m_inputStream(inputStream), m_cur(m_buffer + SIZE), m_end(m_cur) { } bool readByte(byte_type& b) { if(m_cur == m_end) { if(m_end != m_buffer + SIZE) { return false; } m_end = m_buffer + m_inputStream.read(m_buffer, SIZE); m_cur = m_buffer; if(m_end == m_buffer) { return false; } } b = *m_cur++; return true; } }; /// \brief A binary-to-text wrapper around an InputStream. /// Converts CRLF or LFCR line-endings to LF line-endings. template class BinaryToTextInputStream : public TextInputStream { SingleByteInputStream m_inputStream; public: BinaryToTextInputStream(BinaryInputStreamType& inputStream) : m_inputStream(inputStream) { } std::size_t read(char* buffer, std::size_t length) { char* p = buffer; for(;;) { if(length != 0 && m_inputStream.readByte(*reinterpret_cast(p))) { if(*p != '\r') { ++p; --length; } } else { return p - buffer; } } } }; /// \brief An ArchiveFile which is stored uncompressed as part of a larger archive file. class StoredArchiveFile : public ArchiveFile { std::string m_name; FileInputStream m_filestream; SubFileInputStream m_substream; FileInputStream::size_type m_size; public: typedef FileInputStream::size_type size_type; typedef FileInputStream::position_type position_type; StoredArchiveFile(const std::string& name, const std::string& archiveName, position_type position, size_type stream_size, size_type file_size) : m_name(name), m_filestream(archiveName), m_substream(m_filestream, position, stream_size), m_size(file_size) {} size_type size() const { return m_size; } const std::string& getName() const { return m_name; } InputStream& getInputStream() { return m_substream; } }; /// \brief An ArchiveTextFile which is stored uncompressed as part of a larger archive file. class StoredArchiveTextFile : public ArchiveTextFile { std::string m_name; FileInputStream m_filestream; SubFileInputStream m_substream; BinaryToTextInputStream m_textStream; // Mod directory std::string _modDir; public: typedef FileInputStream::size_type size_type; typedef FileInputStream::position_type position_type; /** * Constructor. * * @param modDir * Name of the mod directory containing this file. */ StoredArchiveTextFile(const std::string& name, const std::string& archiveName, const std::string& modDir, position_type position, size_type stream_size) : m_name(name), m_filestream(archiveName), m_substream(m_filestream, position, stream_size), m_textStream(m_substream), _modDir(os::getRelativePathMinusFilename(modDir, GlobalRegistry().get(RKEY_ENGINE_PATH))) {} const std::string& getName() const { return m_name; } TextInputStream& getInputStream() { return m_textStream; } /** * Return mod directory. */ std::string getModName() const { return _modDir; } }; typedef std::shared_ptr StoredArchiveTextFilePtr; /// \brief An ArchiveFile which is stored as a single file on disk. class DirectoryArchiveFile : public ArchiveFile { std::string m_name; FileInputStream m_istream; FileInputStream::size_type m_size; public: typedef FileInputStream::size_type size_type; DirectoryArchiveFile(const std::string& name, const std::string& filename) : m_name(name), m_istream(filename) { if (!failed()) { m_istream.seek(0, FileInputStream::end); m_size = m_istream.tell(); m_istream.seek(0); } else { m_size = 0; } } bool failed() const { return m_istream.failed(); } size_type size() const { return m_size; } const std::string& getName() const { return m_name; } InputStream& getInputStream() { return m_istream; } }; typedef std::shared_ptr DirectoryArchiveFilePtr; /// \brief An ArchiveTextFile which is stored as a single file on disk. class DirectoryArchiveTextFile : public ArchiveTextFile { std::string m_name; TextFileInputStream m_inputStream; // Mod directory std::string _modDir; public: DirectoryArchiveTextFile(const std::string& name, const std::string& modDir, const std::string& filename) : m_name(name), m_inputStream(filename.c_str()), _modDir(os::getRelativePathMinusFilename(modDir, GlobalRegistry().get(RKEY_ENGINE_PATH))) {} bool failed() const { return m_inputStream.failed(); } const std::string& getName() const { return m_name; } TextInputStream& getInputStream() { return m_inputStream; } /** * Get mod directory. */ std::string getModName() const { return _modDir; } }; typedef std::shared_ptr DirectoryArchiveTextFilePtr; #endif DarkRadiant-2.0.2/libs/bytestreamutils.h000066400000000000000000000066751245424655700202750ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_BYTESTREAMUTILS_H) #define INCLUDED_BYTESTREAMUTILS_H #if defined(__GNUC__) #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #include #endif #include // if C99 is unavailable, fall back to the types most likely to be the right sizes #if !defined(int16_t) typedef signed short int16_t; #endif #if !defined(uint16_t) typedef unsigned short uint16_t; #endif #if !defined(int32_t) typedef signed int int32_t; #endif #if !defined(uint32_t) typedef unsigned int uint32_t; #endif template inline void istream_read_little_endian(InputStreamType& istream, Type& value) { istream.read(reinterpret_cast(&value), sizeof(Type)); #if defined(__BIG_ENDIAN__) std::reverse(reinterpret_cast(&value), reinterpret_cast(&value) + sizeof(Type)); #endif } template inline void istream_read_big_endian(InputStreamType& istream, Type& value) { istream.read(reinterpret_cast(&value), sizeof(Type)); #if !defined(__BIG_ENDIAN__) std::reverse(reinterpret_cast(&value), reinterpret_cast(&value) + sizeof(Type)); #endif } template inline void istream_read_byte(InputStreamType& istream, typename InputStreamType::byte_type& b) { istream.read(&b, 1); } template inline int16_t istream_read_int16_le(InputStreamType& istream) { int16_t value; istream_read_little_endian(istream, value); return value; } template inline uint16_t istream_read_uint16_le(InputStreamType& istream) { uint16_t value; istream_read_little_endian(istream, value); return value; } template inline int32_t istream_read_int32_le(InputStreamType& istream) { int32_t value; istream_read_little_endian(istream, value); return value; } template inline uint32_t istream_read_uint32_le(InputStreamType& istream) { uint32_t value; istream_read_little_endian(istream, value); return value; } template inline float istream_read_float32_le(InputStreamType& istream) { float value; istream_read_little_endian(istream, value); return value; } template inline typename InputStreamType::byte_type istream_read_byte(InputStreamType& istream) { typename InputStreamType::byte_type b; istream.read(&b, sizeof(typename InputStreamType::byte_type)); return b; } #endif DarkRadiant-2.0.2/libs/character.h000066400000000000000000000024101245424655700167500ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_CHARACTER_H) #define INCLUDED_CHARACTER_H /// \file /// \brief Character encoding. /// \brief Returns true if \p c is an ASCII character that can be represented with 7 bits. inline bool char_is_ascii(char c) { return (c & 0x80) == 0; } /// \brief Returns true if \p string consists entirely of ASCII characters. inline bool string_is_ascii(const char* string) { while(*string != '\0') { if(!char_is_ascii(*string++)) { return false; } } return true; } #endif DarkRadiant-2.0.2/libs/ddslib.h000066400000000000000000000137551245424655700162730ustar00rootroot00000000000000/* ----------------------------------------------------------------------------- DDS Library Based on code from Nvidia's DDS example: http://www.nvidia.com/object/dxtc_decompression_code.html Copyright (c) 2003 Randy Reddig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #ifndef DDSLIB_H #define DDSLIB_H /* dependencies */ #include #include /* c++ marker */ #ifdef __cplusplus extern "C" { #endif /* dds definition */ typedef enum { DDS_PF_ARGB8888, DDS_PF_DXT1, DDS_PF_DXT2, DDS_PF_DXT3, DDS_PF_DXT4, DDS_PF_DXT5, DDS_PF_DXT5_RXGB, /* Doom 3's swizzled format */ DDS_PF_UNKNOWN } ddsPF_t; // greebo: General parameters which depend on the DDS format /*struct DDSLoadInfo { unsigned int divSize = 4; unsigned int blockBytes; GLenum internalFormat; }; DDSLoadInfo loadInfoDXT1 = { 8, GL_COMPRESSED_RGBA_S3TC_DXT1 }; DdsLoadInfo loadInfoDXT3 = { 16, GL_COMPRESSED_RGBA_S3TC_DXT3 }; DdsLoadInfo loadInfoDXT5 = { 16, GL_COMPRESSED_RGBA_S3TC_DXT5 };*/ /* 16bpp stuff */ #define DDS_LOW_5 0x001F; #define DDS_MID_6 0x07E0; #define DDS_HIGH_5 0xF800; #define DDS_MID_555 0x03E0; #define DDS_HI_555 0x7C00; /* structures */ typedef struct ddsColorKey_s { unsigned int colorSpaceLowValue; unsigned int colorSpaceHighValue; } ddsColorKey_t; typedef struct ddsCaps_s { unsigned int caps1; unsigned int caps2; unsigned int caps3; unsigned int caps4; } ddsCaps_t; typedef struct ddsMultiSampleCaps_s { unsigned short flipMSTypes; unsigned short bltMSTypes; } ddsMultiSampleCaps_t; typedef struct ddsPixelFormat_s { unsigned int size; unsigned int flags; unsigned char fourCC[4]; union { unsigned int rgbBitCount; unsigned int yuvBitCount; unsigned int zBufferBitDepth; unsigned int alphaBitDepth; unsigned int luminanceBitCount; unsigned int bumpBitCount; unsigned int privateFormatBitCount; }; union { unsigned int rBitMask; unsigned int yBitMask; unsigned int stencilBitDepth; unsigned int luminanceBitMask; unsigned int bumpDuBitMask; unsigned int operations; }; union { unsigned int gBitMask; unsigned int uBitMask; unsigned int zBitMask; unsigned int bumpDvBitMask; ddsMultiSampleCaps_t multiSampleCaps; }; union { unsigned int bBitMask; unsigned int vBitMask; unsigned int stencilBitMask; unsigned int bumpLuminanceBitMask; }; union { unsigned int rgbAlphaBitMask; unsigned int yuvAlphaBitMask; unsigned int luminanceAlphaBitMask; unsigned int rgbZBitMask; unsigned int yuvZBitMask; }; } ddsPixelFormat_t; // DDS header flags #define DDSD_CAPS 0x00000001 #define DDSD_HEIGHT 0x00000002 #define DDSD_WIDTH 0x00000004 #define DDSD_PITCH 0x00000008 #define DDSD_PIXELFORMAT 0x00001000 #define DDSD_MIPMAPCOUNT 0x00020000 #define DDSD_LINEARSIZE 0x00080000 #define DDSD_DEPTH 0x00800000 struct DDSHeader { /* magic: 'dds ' */ char magic[ 4 ]; /* directdraw surface */ unsigned int size; unsigned int flags; unsigned int height; unsigned int width; union { int pitch; unsigned int linearSize; }; unsigned int backBufferCount; union { unsigned int mipMapCount; unsigned int refreshRate; unsigned int srcVBHandle; }; unsigned int alphaBitDepth; unsigned int reserved; unsigned int surface; // greebo: Changed this to unsigned int for 64-bit compatibility (should be 32 bits wide) union { ddsColorKey_t ckDestOverlay; unsigned int emptyFaceColor; }; ddsColorKey_t ckDestBlt; ddsColorKey_t ckSrcOverlay; ddsColorKey_t ckSrcBlt; ddsPixelFormat_t pixelFormat; ddsCaps_t ddsCaps; unsigned int textureStage; }; typedef struct ddsBuffer_s { DDSHeader header; /* data (Varying size) */ unsigned char data[ 4 ]; } ddsBuffer_t; /** greebo: This represents a 64 bit DDS block containing * either the alpha or the colour data. */ typedef struct ddsColorBlock_s { unsigned short colors[ 2 ];// 32 bit (2 x 16 bit) unsigned char row[ 4 ]; // 32 bit (4 x 8 bit) } ddsColorBlock_t; typedef struct ddsAlphaBlockExplicit_s { unsigned short row[ 4 ]; } ddsAlphaBlockExplicit_t; typedef struct ddsAlphaBlock3BitLinear_s { unsigned char alpha0; unsigned char alpha1; unsigned char stuff[ 6 ]; } ddsAlphaBlock3BitLinear_t; typedef struct ddsColor_s { unsigned char r, g, b, a; } ddsColor_t; /* public functions */ int DDSGetInfo( const DDSHeader* header, int *width, int *height, ddsPF_t *pf ); int DDSDecompress( const DDSHeader* header, const unsigned char* buffer, unsigned char *pixels ); /* end marker */ #ifdef __cplusplus } #endif #endif DarkRadiant-2.0.2/libs/ddslib/000077500000000000000000000000001245424655700161075ustar00rootroot00000000000000DarkRadiant-2.0.2/libs/ddslib/Makefile.am000066400000000000000000000002761245424655700201500ustar00rootroot00000000000000AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs AM_CXXFLAGS = -fPIC pkglib_LTLIBRARIES = libdds.la libdds_la_LDFLAGS = -release @PACKAGE_VERSION@ libdds_la_SOURCES = ddslib.cpp DarkRadiant-2.0.2/libs/ddslib/Makefile.in000066400000000000000000000553071245424655700201660ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libs/ddslib DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkglibdir)" LTLIBRARIES = $(pkglib_LTLIBRARIES) libdds_la_LIBADD = am_libdds_la_OBJECTS = ddslib.lo libdds_la_OBJECTS = $(am_libdds_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libdds_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libdds_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libdds_la_SOURCES) DIST_SOURCES = $(libdds_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs AM_CXXFLAGS = -fPIC pkglib_LTLIBRARIES = libdds.la libdds_la_LDFLAGS = -release @PACKAGE_VERSION@ libdds_la_SOURCES = ddslib.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/ddslib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/ddslib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ } uninstall-pkglibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ done clean-pkglibLTLIBRARIES: -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) @list='$(pkglib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libdds.la: $(libdds_la_OBJECTS) $(libdds_la_DEPENDENCIES) $(EXTRA_libdds_la_DEPENDENCIES) $(AM_V_CXXLD)$(libdds_la_LINK) -rpath $(pkglibdir) $(libdds_la_OBJECTS) $(libdds_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ddslib.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pkglibdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-pkglibLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkglibLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkglibLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkglibLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/libs/ddslib/ddslib.cpp000066400000000000000000000566331245424655700200710ustar00rootroot00000000000000/* ----------------------------------------------------------------------------- DDS Library Based on code from Nvidia's DDS example: http://www.nvidia.com/object/dxtc_decompression_code.html Copyright (c) 2003 Randy Reddig All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #define DDSLIB_C /* dependencies */ #include "ddslib.h" #if !defined(_MSC_VER) #include // greebo: This isn't needed in VC++ 2005 #endif /* endian tomfoolery */ typedef union { float f; char c[ 4 ]; } floatSwapUnion; #ifndef __BIG_ENDIAN__ #ifdef _SGI_SOURCE #define __BIG_ENDIAN__ #endif #endif #ifdef __BIG_ENDIAN__ int DDSBigLong( int src ) { return src; } short DDSBigShort( short src ) { return src; } float DDSBigFloat( float src ) { return src; } int DDSLittleLong( int src ) { return ((src & 0xFF000000) >> 24) | ((src & 0x00FF0000) >> 8) | ((src & 0x0000FF00) << 8) | ((src & 0x000000FF) << 24); } short DDSLittleShort( short src ) { return ((src & 0xFF00) >> 8) | ((src & 0x00FF) << 8); } float DDSLittleFloat( float src ) { floatSwapUnion in,out; in.f = src; out.c[ 0 ] = in.c[ 3 ]; out.c[ 1 ] = in.c[ 2 ]; out.c[ 2 ] = in.c[ 1 ]; out.c[ 3 ] = in.c[ 0 ]; return out.f; } #else /*__BIG_ENDIAN__*/ int DDSLittleLong( int src ) { return src; } short DDSLittleShort( short src ) { return src; } float DDSLittleFloat( float src ) { return src; } int DDSBigLong( int src ) { return ((src & 0xFF000000) >> 24) | ((src & 0x00FF0000) >> 8) | ((src & 0x0000FF00) << 8) | ((src & 0x000000FF) << 24); } short DDSBigShort( short src ) { return ((src & 0xFF00) >> 8) | ((src & 0x00FF) << 8); } float DDSBigFloat( float src ) { floatSwapUnion in,out; in.f = src; out.c[ 0 ] = in.c[ 3 ]; out.c[ 1 ] = in.c[ 2 ]; out.c[ 2 ] = in.c[ 1 ]; out.c[ 3 ] = in.c[ 0 ]; return out.f; } #endif /*__BIG_ENDIAN__*/ /* DDSDecodePixelFormat() determines which pixel format the dds texture is in */ static void DDSDecodePixelFormat( const DDSHeader* header, ddsPF_t *pf ) { unsigned char fourCC[4]; /* dummy check */ if( header == NULL || pf == NULL ) return; /* extract fourCC */ fourCC[0] = header->pixelFormat.fourCC[0]; fourCC[1] = header->pixelFormat.fourCC[1]; fourCC[2] = header->pixelFormat.fourCC[2]; fourCC[3] = header->pixelFormat.fourCC[3]; /* test it */ if (fourCC[0] == 0 && fourCC[1] == 0 && fourCC[2] == 0 && fourCC[3] == 0) *pf = DDS_PF_ARGB8888; else if (fourCC[0] == 'D' && fourCC[1] == 'X' && fourCC[2] == 'T' && fourCC[3] == '1') *pf = DDS_PF_DXT1; else if (fourCC[0] == 'D' && fourCC[1] == 'X' && fourCC[2] == 'T' && fourCC[3] == '2') *pf = DDS_PF_DXT2; else if (fourCC[0] == 'D' && fourCC[1] == 'X' && fourCC[2] == 'T' && fourCC[3] == '3') *pf = DDS_PF_DXT3; else if (fourCC[0] == 'D' && fourCC[1] == 'X' && fourCC[2] == 'T' && fourCC[3] == '4') *pf = DDS_PF_DXT4; else if (fourCC[0] == 'D' && fourCC[1] == 'X' && fourCC[2] == 'T' && fourCC[3] == '5') *pf = DDS_PF_DXT5; else if (fourCC[0] == 'R' && fourCC[1] == 'X' && fourCC[2] == 'G' && fourCC[3] == 'B') *pf = DDS_PF_DXT5_RXGB; else *pf = DDS_PF_UNKNOWN; } /* DDSGetInfo() extracts relevant info from a dds texture, returns 0 on success */ int DDSGetInfo(const DDSHeader* header, int *width, int *height, ddsPF_t *pf ) { /* dummy test */ if( header == NULL ) return -1; /* test dds header */ if( *((int*) header->magic) != *((int*) "DDS ") ) return -1; if( DDSLittleLong( header->size ) != 124 ) return -1; /* extract width and height */ if( width != NULL ) *width = DDSLittleLong( header->width ); if( height != NULL ) *height = DDSLittleLong( header->height ); /* get pixel format */ DDSDecodePixelFormat( header, pf ); /* return ok */ return 0; } /* DDSGetColorBlockColors() extracts colors from a dds color block */ static void DDSGetColorBlockColors( ddsColorBlock_t *block, ddsColor_t colors[ 4 ] ) { unsigned short word; /* color 0 */ word = DDSLittleShort( block->colors[ 0 ] ); colors[ 0 ].a = 0xff; /* extract rgb bits */ colors[ 0 ].b = (unsigned char) word; colors[ 0 ].b <<= 3; colors[ 0 ].b |= (colors[ 0 ].b >> 5); word >>= 5; colors[ 0 ].g = (unsigned char) word; colors[ 0 ].g <<= 2; colors[ 0 ].g |= (colors[ 0 ].g >> 6); word >>= 6; colors[ 0 ].r = (unsigned char) word; colors[ 0 ].r <<= 3; colors[ 0 ].r |= (colors[ 0 ].r >> 5); /* same for color 1 */ word = DDSLittleShort( block->colors[ 1 ] ); colors[ 1 ].a = 0xff; /* extract rgb bits */ colors[ 1 ].b = (unsigned char) word; colors[ 1 ].b <<= 3; colors[ 1 ].b |= (colors[ 1 ].b >> 5); word >>= 5; colors[ 1 ].g = (unsigned char) word; colors[ 1 ].g <<= 2; colors[ 1 ].g |= (colors[ 1 ].g >> 6); word >>= 6; colors[ 1 ].r = (unsigned char) word; colors[ 1 ].r <<= 3; colors[ 1 ].r |= (colors[ 1 ].r >> 5); /* use this for all but the super-freak math method */ if( block->colors[ 0 ] > block->colors[ 1 ] ) { /* four-color block: derive the other two colors. 00 = color 0, 01 = color 1, 10 = color 2, 11 = color 3 these two bit codes correspond to the 2-bit fields stored in the 64-bit block. */ word = ((unsigned short) colors[ 0 ].r * 2 + (unsigned short) colors[ 1 ].r ) / 3; /* no +1 for rounding */ /* as bits have been shifted to 888 */ colors[ 2 ].r = (unsigned char) word; word = ((unsigned short) colors[ 0 ].g * 2 + (unsigned short) colors[ 1 ].g) / 3; colors[ 2 ].g = (unsigned char) word; word = ((unsigned short) colors[ 0 ].b * 2 + (unsigned short) colors[ 1 ].b) / 3; colors[ 2 ].b = (unsigned char) word; colors[ 2 ].a = 0xff; word = ((unsigned short) colors[ 0 ].r + (unsigned short) colors[ 1 ].r * 2) / 3; colors[ 3 ].r = (unsigned char) word; word = ((unsigned short) colors[ 0 ].g + (unsigned short) colors[ 1 ].g * 2) / 3; colors[ 3 ].g = (unsigned char) word; word = ((unsigned short) colors[ 0 ].b + (unsigned short) colors[ 1 ].b * 2) / 3; colors[ 3 ].b = (unsigned char) word; colors[ 3 ].a = 0xff; } else { /* three-color block: derive the other color. 00 = color 0, 01 = color 1, 10 = color 2, 11 = transparent. These two bit codes correspond to the 2-bit fields stored in the 64-bit block */ word = ((unsigned short) colors[ 0 ].r + (unsigned short) colors[ 1 ].r) / 2; colors[ 2 ].r = (unsigned char) word; word = ((unsigned short) colors[ 0 ].g + (unsigned short) colors[ 1 ].g) / 2; colors[ 2 ].g = (unsigned char) word; word = ((unsigned short) colors[ 0 ].b + (unsigned short) colors[ 1 ].b) / 2; colors[ 2 ].b = (unsigned char) word; colors[ 2 ].a = 0xff; /* random color to indicate alpha */ colors[ 3 ].r = 0x00; colors[ 3 ].g = 0xff; colors[ 3 ].b = 0xff; colors[ 3 ].a = 0x00; } } /* DDSDecodeColorBlock() decodes a dds color block fixme: make endian-safe */ static void DDSDecodeColorBlock( unsigned int *pixel, ddsColorBlock_t *block, int width, unsigned int colors[ 4 ] ) { int r, n; unsigned int bits; unsigned int masks[] = { 3, 12, 3 << 4, 3 << 6 }; /* bit masks = 00000011, 00001100, 00110000, 11000000 */ int shift[] = { 0, 2, 4, 6 }; /* r steps through lines in y */ for( r = 0; r < 4; r++, pixel += (width - 4) ) /* no width * 4 as unsigned int ptr inc will * 4 */ { /* width * 4 bytes per pixel per line, each j dxtc row is 4 lines of pixels */ /* n steps through pixels */ for( n = 0; n < 4; n++ ) { bits = block->row[ r ] & masks[ n ]; bits >>= shift[ n ]; *pixel = colors[bits]; pixel++; } } } /* DDSDecodeAlphaExplicit() decodes a dds explicit alpha block */ static void DDSDecodeAlphaExplicit( unsigned int *pixel, ddsAlphaBlockExplicit_t *alphaBlock, int width, unsigned int alphaZero ) { int row, pix; unsigned short word; ddsColor_t color; /* clear color */ color.r = 0; color.g = 0; color.b = 0; /* walk rows */ for( row = 0; row < 4; row++, pixel += (width - 4) ) { word = DDSLittleShort( alphaBlock->row[ row ] ); /* walk pixels */ for( pix = 0; pix < 4; pix++ ) { /* zero the alpha bits of image pixel */ *pixel &= alphaZero; color.a = word & 0x000F; color.a = color.a | (color.a << 4); *pixel |= *((unsigned int*) &color); word >>= 4; /* move next bits to lowest 4 */ pixel++; /* move to next pixel in the row */ } } } /* DDSDecodeAlpha3BitLinear() decodes interpolated alpha block */ static void DDSDecodeAlpha3BitLinear( unsigned int *pixel, ddsAlphaBlock3BitLinear_t *alphaBlock, int width, unsigned int alphaZero ) { int row, pix; unsigned int stuff; unsigned char bits[ 4 ][ 4 ]; unsigned short alphas[ 8 ]; ddsColor_t aColors[ 4 ][ 4 ]; /* get initial alphas */ alphas[ 0 ] = alphaBlock->alpha0; alphas[ 1 ] = alphaBlock->alpha1; /* 8-alpha block */ if( alphas[ 0 ] > alphas[ 1 ] ) { /* 000 = alpha_0, 001 = alpha_1, others are interpolated */ alphas[ 2 ] = ( 6 * alphas[ 0 ] + alphas[ 1 ]) / 7; /* bit code 010 */ alphas[ 3 ] = ( 5 * alphas[ 0 ] + 2 * alphas[ 1 ]) / 7; /* bit code 011 */ alphas[ 4 ] = ( 4 * alphas[ 0 ] + 3 * alphas[ 1 ]) / 7; /* bit code 100 */ alphas[ 5 ] = ( 3 * alphas[ 0 ] + 4 * alphas[ 1 ]) / 7; /* bit code 101 */ alphas[ 6 ] = ( 2 * alphas[ 0 ] + 5 * alphas[ 1 ]) / 7; /* bit code 110 */ alphas[ 7 ] = ( alphas[ 0 ] + 6 * alphas[ 1 ]) / 7; /* bit code 111 */ } /* 6-alpha block */ else { /* 000 = alpha_0, 001 = alpha_1, others are interpolated */ alphas[ 2 ] = (4 * alphas[ 0 ] + alphas[ 1 ]) / 5; /* bit code 010 */ alphas[ 3 ] = (3 * alphas[ 0 ] + 2 * alphas[ 1 ]) / 5; /* bit code 011 */ alphas[ 4 ] = (2 * alphas[ 0 ] + 3 * alphas[ 1 ]) / 5; /* bit code 100 */ alphas[ 5 ] = ( alphas[ 0 ] + 4 * alphas[ 1 ]) / 5; /* bit code 101 */ alphas[ 6 ] = 0; /* bit code 110 */ alphas[ 7 ] = 255; /* bit code 111 */ } /* decode 3-bit fields into array of 16 bytes with same value */ /* first two rows of 4 pixels each */ stuff = *((unsigned int*) &(alphaBlock->stuff[ 0 ])); bits[ 0 ][ 0 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 0 ][ 1 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 0 ][ 2 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 0 ][ 3 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 1 ][ 0 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 1 ][ 1 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 1 ][ 2 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 1 ][ 3 ] = (unsigned char) (stuff & 0x00000007); /* last two rows */ stuff = *((unsigned int*) &(alphaBlock->stuff[ 3 ])); /* last 3 bytes */ bits[ 2 ][ 0 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 2 ][ 1 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 2 ][ 2 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 2 ][ 3 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 3 ][ 0 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 3 ][ 1 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 3 ][ 2 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 3 ][ 3 ] = (unsigned char) (stuff & 0x00000007); /* decode the codes into alpha values */ for( row = 0; row < 4; row++ ) { for( pix=0; pix < 4; pix++ ) { aColors[ row ][ pix ].r = 0; aColors[ row ][ pix ].g = 0; aColors[ row ][ pix ].b = 0; aColors[ row ][ pix ].a = (unsigned char) alphas[ bits[ row ][ pix ] ]; } } /* write out alpha values to the image bits */ for( row = 0; row < 4; row++, pixel += width-4 ) { for( pix = 0; pix < 4; pix++ ) { /* zero the alpha bits of image pixel */ *pixel &= alphaZero; /* or the bits into the prev. nulled alpha */ *pixel |= *((unsigned int*) &(aColors[ row ][ pix ])); pixel++; } } } /** greebo: Decodes the alpha channel into the red channel for RXGB-encoded images */ static void DDSDecodeRXGBAlpha3BitLinear( unsigned int *pixel, ddsAlphaBlock3BitLinear_t *alphaBlock, int width, unsigned int redZero ) { int row, pix; unsigned int stuff; unsigned char bits[ 4 ][ 4 ]; unsigned short alphas[ 8 ]; ddsColor_t aColors[ 4 ][ 4 ]; /* get initial alphas */ alphas[ 0 ] = alphaBlock->alpha0; alphas[ 1 ] = alphaBlock->alpha1; /* 8-alpha block */ if( alphas[ 0 ] > alphas[ 1 ] ) { /* 000 = alpha_0, 001 = alpha_1, others are interpolated */ alphas[ 2 ] = ( 6 * alphas[ 0 ] + alphas[ 1 ]) / 7; /* bit code 010 */ alphas[ 3 ] = ( 5 * alphas[ 0 ] + 2 * alphas[ 1 ]) / 7; /* bit code 011 */ alphas[ 4 ] = ( 4 * alphas[ 0 ] + 3 * alphas[ 1 ]) / 7; /* bit code 100 */ alphas[ 5 ] = ( 3 * alphas[ 0 ] + 4 * alphas[ 1 ]) / 7; /* bit code 101 */ alphas[ 6 ] = ( 2 * alphas[ 0 ] + 5 * alphas[ 1 ]) / 7; /* bit code 110 */ alphas[ 7 ] = ( alphas[ 0 ] + 6 * alphas[ 1 ]) / 7; /* bit code 111 */ } /* 6-alpha block */ else { /* 000 = alpha_0, 001 = alpha_1, others are interpolated */ alphas[ 2 ] = (4 * alphas[ 0 ] + alphas[ 1 ]) / 5; /* bit code 010 */ alphas[ 3 ] = (3 * alphas[ 0 ] + 2 * alphas[ 1 ]) / 5; /* bit code 011 */ alphas[ 4 ] = (2 * alphas[ 0 ] + 3 * alphas[ 1 ]) / 5; /* bit code 100 */ alphas[ 5 ] = ( alphas[ 0 ] + 4 * alphas[ 1 ]) / 5; /* bit code 101 */ alphas[ 6 ] = 0; /* bit code 110 */ alphas[ 7 ] = 255; /* bit code 111 */ } /* decode 3-bit fields into array of 16 bytes with same value */ /* first two rows of 4 pixels each */ stuff = *((unsigned int*) &(alphaBlock->stuff[ 0 ])); bits[ 0 ][ 0 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 0 ][ 1 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 0 ][ 2 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 0 ][ 3 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 1 ][ 0 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 1 ][ 1 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 1 ][ 2 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 1 ][ 3 ] = (unsigned char) (stuff & 0x00000007); /* last two rows */ stuff = *((unsigned int*) &(alphaBlock->stuff[ 3 ])); /* last 3 bytes */ bits[ 2 ][ 0 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 2 ][ 1 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 2 ][ 2 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 2 ][ 3 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 3 ][ 0 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 3 ][ 1 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 3 ][ 2 ] = (unsigned char) (stuff & 0x00000007); stuff >>= 3; bits[ 3 ][ 3 ] = (unsigned char) (stuff & 0x00000007); /* decode the codes into red values */ for( row = 0; row < 4; row++ ) { for( pix=0; pix < 4; pix++ ) { aColors[ row ][ pix ].a = 0; aColors[ row ][ pix ].g = 0; aColors[ row ][ pix ].b = 0; aColors[ row ][ pix ].r = (unsigned char) alphas[ bits[ row ][ pix ] ]; } } /* write out alpha values to the image bits */ for( row = 0; row < 4; row++, pixel += width-4 ) { for( pix = 0; pix < 4; pix++ ) { /* zero the red bits of image pixel */ *pixel &= redZero; /* or the bits into the prev. nulled red */ *pixel |= *((unsigned int*) &(aColors[ row ][ pix ])); pixel++; } } } /* DDSDecompressDXT1() decompresses a dxt1 format texture */ static int DDSDecompressDXT1( const unsigned char* buffer, int width, int height, unsigned char *pixels ) { int x, y, xBlocks, yBlocks; unsigned int *pixel; ddsColorBlock_t *block; ddsColor_t colors[ 4 ]; /* setup */ xBlocks = width / 4; yBlocks = height / 4; /* walk y */ for( y = 0; y < yBlocks; y++ ) { /* 8 bytes per block */ block = (ddsColorBlock_t*) ((uintptr_t) buffer + y * xBlocks * 8); /* walk x */ for( x = 0; x < xBlocks; x++, block++ ) { DDSGetColorBlockColors( block, colors ); pixel = (unsigned int*) (pixels + x * 16 + (y * 4) * width * 4); DDSDecodeColorBlock( pixel, block, width, (unsigned int*) colors ); } } /* return ok */ return 0; } /* DDSDecompressDXT3() decompresses a dxt3 format texture */ static int DDSDecompressDXT3( const unsigned char* buffer, int width, int height, unsigned char *pixels ) { int x, y, xBlocks, yBlocks; unsigned int *pixel, alphaZero; ddsColorBlock_t *block; ddsAlphaBlockExplicit_t *alphaBlock; ddsColor_t colors[ 4 ]; /* setup */ xBlocks = width / 4; yBlocks = height / 4; /* create zero alpha */ colors[ 0 ].a = 0; colors[ 0 ].r = 0xFF; colors[ 0 ].g = 0xFF; colors[ 0 ].b = 0xFF; alphaZero = *((unsigned int*) &colors[ 0 ]); /* walk y */ for( y = 0; y < yBlocks; y++ ) { /* 8 bytes per block, 1 block for alpha, 1 block for color */ block = (ddsColorBlock_t*) ((uintptr_t) buffer + y * xBlocks * 16); /* walk x */ for( x = 0; x < xBlocks; x++, block++ ) { /* get alpha block */ alphaBlock = (ddsAlphaBlockExplicit_t*) block; /* get color block */ block++; DDSGetColorBlockColors( block, colors ); /* decode color block */ pixel = (unsigned int*) (pixels + x * 16 + (y * 4) * width * 4); DDSDecodeColorBlock( pixel, block, width, (unsigned int*) colors ); /* overwrite alpha bits with alpha block */ DDSDecodeAlphaExplicit( pixel, alphaBlock, width, alphaZero ); } } /* return ok */ return 0; } /* DDSDecompressDXT5() decompresses a dxt5 format texture */ static int DDSDecompressDXT5( const unsigned char* buffer, int width, int height, unsigned char *pixels ) { int x, y, xBlocks, yBlocks; unsigned int *pixel, alphaZero; ddsColorBlock_t *block; ddsAlphaBlock3BitLinear_t *alphaBlock; ddsColor_t colors[ 4 ]; /* setup */ xBlocks = width / 4; yBlocks = height / 4; /* create zero alpha */ colors[ 0 ].a = 0; colors[ 0 ].r = 0xFF; colors[ 0 ].g = 0xFF; colors[ 0 ].b = 0xFF; alphaZero = *((unsigned int*) &colors[ 0 ]); /* walk y */ for( y = 0; y < yBlocks; y++ ) { /* 8 bytes per block, 1 block for alpha, 1 block for color */ block = (ddsColorBlock_t*) ((uintptr_t) buffer + y * xBlocks * 16); /* walk x */ for( x = 0; x < xBlocks; x++, block++ ) { /* get alpha block */ alphaBlock = (ddsAlphaBlock3BitLinear_t*) block; /* get color block */ block++; DDSGetColorBlockColors( block, colors ); /* decode color block */ pixel = (unsigned int*) (pixels + x * 16 + (y * 4) * width * 4); DDSDecodeColorBlock( pixel, block, width, (unsigned int*) colors ); /* overwrite alpha bits with alpha block */ DDSDecodeAlpha3BitLinear( pixel, alphaBlock, width, alphaZero ); } } /* return ok */ return 0; } /* DDSDecompressDXT2() decompresses a dxt2 format texture (fixme: un-premultiply alpha) */ static int DDSDecompressDXT2( const unsigned char* buffer, int width, int height, unsigned char *pixels ) { int r; /* decompress dxt3 first */ r = DDSDecompressDXT3( buffer, width, height, pixels ); /* return to sender */ return r; } /* DDSDecompressDXT4() decompresses a dxt4 format texture (fixme: un-premultiply alpha) */ static int DDSDecompressDXT4( const unsigned char* buffer, int width, int height, unsigned char *pixels ) { int r; /* decompress dxt5 first */ r = DDSDecompressDXT5( buffer, width, height, pixels ); /* return to sender */ return r; } /* DDSDecompressARGB8888() decompresses an argb 8888 format texture */ static int DDSDecompressARGB8888( const unsigned char* buffer, int width, int height, unsigned char *pixels ) { int x, y; const unsigned char *in; unsigned char *out; /* setup */ in = buffer; out = pixels; /* walk y */ for( y = 0; y < height; y++ ) { /* walk x */ for( x = 0; x < width; x++ ) { *out++ = *in++; *out++ = *in++; *out++ = *in++; *out++ = *in++; } } /* return ok */ return 0; } /** greebo: This decompresses a DXT5 RXGB texture as used by the Doom3 engine. */ static int DDSDecompressRXGB( const unsigned char* buffer, int width, int height, unsigned char *pixels ) { int x, y, xBlocks, yBlocks; unsigned int *pixel, redZero; ddsColorBlock_t *block; ddsAlphaBlock3BitLinear_t *alphaBlock; ddsColor_t colors[ 4 ]; /* setup */ xBlocks = width / 4; yBlocks = height / 4; /* create zero red */ colors[ 0 ].r = 0; colors[ 0 ].a = 0xFF; colors[ 0 ].g = 0xFF; colors[ 0 ].b = 0xFF; redZero = *((unsigned int*) &colors[ 0 ]); /* walk y */ for( y = 0; y < yBlocks; y++ ) { /* 8 bytes (64 bit) per block, 1 block for alpha, 1 block for color */ block = (ddsColorBlock_t*) ((uintptr_t) buffer + y * xBlocks * 16); /* walk x */ for( x = 0; x < xBlocks; x++, block++ ) { /* get alpha block */ alphaBlock = (ddsAlphaBlock3BitLinear_t*) block; /* get color block */ block++; // Decode the colour values from the 5:6:5 word and derive the c2 and c3 colours // The result is stored in the variable DDSGetColorBlockColors( block, colors ); /* decode color block */ pixel = (unsigned int*) (pixels + x * 16 + (y * 4) * width * 4); DDSDecodeColorBlock( pixel, block, width, (unsigned int*) colors ); /* overwrite alpha bits with alpha block */ DDSDecodeRXGBAlpha3BitLinear( pixel, alphaBlock, width, redZero ); } } /* return ok */ return 0; } /* DDSDecompress() decompresses a dds texture into an rgba image buffer, returns 0 on success */ int DDSDecompress( const DDSHeader* header, const unsigned char* buffer, unsigned char *pixels ) { int width, height, r; ddsPF_t pf; /* get dds info */ r = DDSGetInfo( header, &width, &height, &pf ); if( r ) return r; /* decompress */ switch( pf ) { case DDS_PF_ARGB8888: /* fixme: support other [a]rgb formats */ r = DDSDecompressARGB8888( buffer, width, height, pixels ); break; case DDS_PF_DXT1: r = DDSDecompressDXT1( buffer, width, height, pixels ); break; case DDS_PF_DXT2: r = DDSDecompressDXT2( buffer, width, height, pixels ); break; case DDS_PF_DXT3: r = DDSDecompressDXT3( buffer, width, height, pixels ); break; case DDS_PF_DXT4: r = DDSDecompressDXT4( buffer, width, height, pixels ); break; case DDS_PF_DXT5: r = DDSDecompressDXT5( buffer, width, height, pixels ); break; case DDS_PF_DXT5_RXGB: r = DDSDecompressRXGB( buffer, width, height, pixels ); break; default: case DDS_PF_UNKNOWN: memset( pixels, 0xFF, width * height * 4 ); r = -1; break; } /* return to sender */ return r; } DarkRadiant-2.0.2/libs/debugging/000077500000000000000000000000001245424655700166015ustar00rootroot00000000000000DarkRadiant-2.0.2/libs/debugging/ScenegraphUtils.h000066400000000000000000000041751245424655700220610ustar00rootroot00000000000000#pragma once #include "ipath.h" #include "inode.h" #include "math/AABB.h" #include "iscenegraph.h" #include "string/convert.h" #include "itextstream.h" inline std::string getNameForNodeType(scene::INode::Type type) { switch (type) { case scene::INode::Type::MapRoot: return "map"; case scene::INode::Type::Entity: return "entity"; case scene::INode::Type::Primitive: return "primitive"; case scene::INode::Type::Model: return "model"; case scene::INode::Type::Particle: return "particle"; default: return "unknown"; }; } // greebo: Return information about the given node inline std::string getNodeInfo(const scene::INodePtr& node) { std::string returnValue; if (node == NULL) { return "NULL"; } returnValue += getNameForNodeType(node->getNodeType()); returnValue += " (" + node->name() + ")"; return returnValue; } // greebo: Stream insertion operator for scene::INode inline std::ostream& operator<<(std::ostream& st, const scene::INodePtr& node) { st << getNodeInfo(node); return st; } inline std::string getPathInfo(const scene::Path& path) { std::string name; for (scene::Path::const_iterator i = path.begin(); i != path.end(); i++) { // Cast the INode onto a scene::Node scene::INodePtr node = *i; name += (name.empty()) ? "" : ", "; name += getNodeInfo(node); } name = std::string("[") + string::to_string(path.size()) + "] {" + name + "} extents: "; name += "<" + string::to_string(path.top()->worldAABB().extents.x()) + ","; name += string::to_string(path.top()->worldAABB().extents.y()) + ","; name += string::to_string(path.top()->worldAABB().extents.z()) + ">"; return name; } // greebo: Stream-insertion operator for scene::Paths, printing out information on the referenced scene::Nodes inline std::ostream& operator<<(std::ostream& st, const scene::Path& path) { st << getPathInfo(path); return st; } class SceneGraphDumper : public scene::NodeVisitor { public: bool pre(const scene::INodePtr& node) { rMessage() << getNodeInfo(node) << "\n"; return true; } }; inline void dumpSceneGraph() { SceneGraphDumper dumper; GlobalSceneGraph().root()->traverseChildren(dumper); } DarkRadiant-2.0.2/libs/debugging/ScopedDebugTimer.h000066400000000000000000000047131245424655700221440ustar00rootroot00000000000000#ifndef SCOPEDDEBUGTIMER_H_ #define SCOPEDDEBUGTIMER_H_ #if defined(_MSC_VER) || defined(_WINDOWS_) #include #include #undef min #undef max #if !defined(_WINSOCK2API_) && !defined(_WINSOCKAPI_) struct timeval { long tv_sec; long tv_usec; }; #endif #else #include #endif #if defined(_MSC_VER) || defined(_WINDOWS_) inline int gettimeofday(struct timeval* tv, void*) { union { long long ns100; FILETIME ft; } now; GetSystemTimeAsFileTime (&now.ft); tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL); tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL); return (0); } #endif #include #include "stream/textfilestream.h" namespace { const double MILLION = 1000000.0; /** * Operator- for timeval structures. * * @returns * Double-precision float representing the difference in seconds between * the two times. */ double operator-(const timeval& l, const timeval& r) { // Convert timevals to double double dl = (double) l.tv_sec + ((double) l.tv_usec / MILLION); double dr = (double) r.tv_sec + ((double) r.tv_usec / MILLION); return dl - dr; } } /** * Debugging class to time a particular event. The clock is saved during * construction, and the time difference calculated at destruction. */ class ScopedDebugTimer { private: // Start time timeval _s; // Name of operation std::string _op; // Show FPS? bool _fps; public: /** * Constructor. Set the name of the operation to be printed out on * destruction. * * @param name * The name of the operation. * * @param showFps * If true, a nominal FPS value will be calculated for the given operation * time. */ ScopedDebugTimer(const std::string& name, bool showFps = false) : _op(name), _fps(showFps) { #ifndef NDEBUG // Save start time gettimeofday(&_s, NULL); #endif } /** * Destructor. Prints out the time of the operation. */ ~ScopedDebugTimer() { #ifndef NDEBUG // Get the current time timeval end; gettimeofday(&end, NULL); // Calculate duration double duration = end - _s; rMessage() << "[ScopedDebugTimer] \"" << _op << "\" in " << duration << " seconds"; if (_fps) { rMessage() << " (" << (1.0 / duration) << " FPS)"; } rMessage() << std::endl; #endif } }; #endif /*SCOPEDDEBUGTIMER_H_*/ DarkRadiant-2.0.2/libs/debugging/debugging.cpp000066400000000000000000000015441245424655700212440ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "debugging.h" void TEST_ASSERT() { ERROR_MESSAGE("test"); ASSERT_NOTNULL(0); } DarkRadiant-2.0.2/libs/debugging/debugging.h000066400000000000000000000034221245424655700207060ustar00rootroot00000000000000#ifndef _DEBUGGING_FUNCTIONS_H_ #define _DEBUGGING_FUNCTIONS_H_ /// \brief Debugging macros for fatal error/assert messages. #if defined(_DEBUG) #define DEBUG_ASSERTS #endif #include "imodule.h" // for the ErrorHandlingFunction typedef // This method holds a function pointer which can do some error display (like popups) inline ErrorHandlingFunction& GlobalErrorHandler() { static ErrorHandlingFunction _func; return _func; } #if defined(DEBUG_ASSERTS) // Define the breakpoint function, to fire up the debugger #if defined(_MSC_VER) && defined(_M_IX86) #define DEBUGGER_BREAKPOINT() __asm { int 3 } #elif defined(_MSC_VER) && defined(_WIN64) #define DEBUGGER_BREAKPOINT() __debugbreak() #elif defined(__linux__) #include #define DEBUGGER_BREAKPOINT() raise(SIGTRAP); #else #define DEBUGGER_BREAKPOINT() #endif #define STR(x) #x #define STR2(x) STR(x) #define FILE_LINE __FILE__ ":" STR2(__LINE__) /// \brief Sends a \p message to the current debug-message-handler text-output-stream if \p condition evaluates to false. #define ASSERT_MESSAGE(condition, message)\ if(!(condition)) { GlobalErrorHandler()("DarkRadiant - Assertion Failure", std::string(FILE_LINE) + "\nAssertion failure: " + message + "\nBreak into the debugger?"); } /// \brief Sends a \p message to the current debug-message-handler text-output-stream. #define ERROR_MESSAGE(message)\ { GlobalErrorHandler()("DarkRadiant - Runtime Error", std::string(FILE_LINE) + "\nRuntime Error: " + message + "\nBreak into the debugger?"); } #define ASSERT_NOTNULL(ptr) ASSERT_MESSAGE(ptr != 0, "pointer \"" #ptr "\" is null") #else // Release Builds #define ASSERT_MESSAGE(condition, message) #define ERROR_MESSAGE(message) #define ASSERT_NOTNULL(ptr) #define DEBUGGER_BREAKPOINT() #endif #endif /* _DEBUGGING_FUNCTIONS_H_ */ DarkRadiant-2.0.2/libs/debugging/render.h000066400000000000000000000056011245424655700202330ustar00rootroot00000000000000#pragma once #include #include "render/Colour4.h" namespace debug { namespace detail { inline bool boolFromGLBool(GLboolean b) { return b == GL_TRUE; } } /// Streamable object to insert render state flags struct StateFlagsInserter { int flags; StateFlagsInserter(int f): flags(f) { } }; inline std::ostream& operator<<(std::ostream& os, const StateFlagsInserter& s) { #define OUTPUT_RENDERFLAG(x) if (s.flags & (x)) { os << "|" << #x; } OUTPUT_RENDERFLAG(RENDER_LINESTIPPLE); OUTPUT_RENDERFLAG(RENDER_POLYGONSTIPPLE); OUTPUT_RENDERFLAG(RENDER_ALPHATEST); OUTPUT_RENDERFLAG(RENDER_DEPTHTEST); OUTPUT_RENDERFLAG(RENDER_DEPTHWRITE); OUTPUT_RENDERFLAG(RENDER_MASKCOLOUR); OUTPUT_RENDERFLAG(RENDER_CULLFACE); OUTPUT_RENDERFLAG(RENDER_SCALED); OUTPUT_RENDERFLAG(RENDER_SMOOTH); OUTPUT_RENDERFLAG(RENDER_LIGHTING); OUTPUT_RENDERFLAG(RENDER_BLEND); OUTPUT_RENDERFLAG(RENDER_OFFSETLINE); OUTPUT_RENDERFLAG(RENDER_FILL); OUTPUT_RENDERFLAG(RENDER_VERTEX_COLOUR); OUTPUT_RENDERFLAG(RENDER_TEXTURE_2D); OUTPUT_RENDERFLAG(RENDER_TEXTURE_CUBEMAP); OUTPUT_RENDERFLAG(RENDER_BUMP); OUTPUT_RENDERFLAG(RENDER_PROGRAM); OUTPUT_RENDERFLAG(RENDER_OVERRIDE); return os; } /// Streamable object to insert glColorMask value class ColorMaskInserter { }; inline std::ostream& operator<<(std::ostream& os, const ColorMaskInserter& i) { using namespace detail; GLboolean vals[4]; glGetBooleanv(GL_COLOR_WRITEMASK, &vals[0]); os << "{ R = " << boolFromGLBool(vals[0]) << ", G = " << boolFromGLBool(vals[1]) << ", B = " << boolFromGLBool(vals[2]) << ", A = " << boolFromGLBool(vals[3]) << " }"; return os; } /// Streamable object to insert glDepthMask value class DepthMaskInserter { }; inline std::ostream& operator<<(std::ostream& os, const DepthMaskInserter& i) { GLboolean mask; glGetBooleanv(GL_DEPTH_WRITEMASK, &mask); os << detail::boolFromGLBool(mask); return os; } /// Get the current GL_COLOR as a Colour4 for debugging inline Colour4 getGLColor() { Colour4 result; glGetDoublev(GL_CURRENT_COLOR, &result[0]); return result; } /// Get a GL integer for debugging inline int getGLInt(GLenum name) { int result; glGetIntegerv(name, &result); return result; } /// Get a GL boolean for debugging inline bool getGLBool(GLenum name) { GLboolean result; glGetBooleanv(name, &result); return result == GL_TRUE; } } DarkRadiant-2.0.2/libs/dragplanes.h000066400000000000000000000242721245424655700171460ustar00rootroot00000000000000#pragma once #include "iselectiontest.h" #include "ObservedSelectable.h" #include "math/AABB.h" #include "math/Line.h" namespace selection { /** * Selection-test and transformation helper for drag-resizable objects. * This is used by PatchNodes, LightNodes and SpeakerNodes. */ class DragPlanes { private: ObservedSelectable _selectableRight; // +x ObservedSelectable _selectableLeft; // -x ObservedSelectable _selectableFront; // +y ObservedSelectable _selectableBack; // -y ObservedSelectable _selectableTop; // +z ObservedSelectable _selectableBottom; // -z public: AABB m_bounds; DragPlanes(const SelectionChangedSlot& onchanged) : _selectableRight(onchanged), _selectableLeft(onchanged), _selectableFront(onchanged), _selectableBack(onchanged), _selectableTop(onchanged), _selectableBottom(onchanged) {} // Returns true if any of the 6 planes is selected bool isSelected() const { return _selectableRight.isSelected() || _selectableLeft.isSelected() || _selectableFront.isSelected() || _selectableBack.isSelected() || _selectableTop.isSelected() || _selectableBottom.isSelected(); } void setSelected(bool selected) { _selectableRight.setSelected(selected); _selectableLeft.setSelected(selected); _selectableFront.setSelected(selected); _selectableBack.setSelected(selected); _selectableTop.setSelected(selected); _selectableBottom.setSelected(selected); } // greebo: Test-select each of the 6 planes and add suitable ones to the Selector // for further consideration. The basic idea of this method is to do a simple // "is this test position in front of any of these 6 planes"-test by calculating // dot products with all corresponding 4 corner vertices of each plane. For a plane // to pass the test it's required that all its 4 corner vertices need to pass. // Everything passed in here should be specified in local coordinates, any // local2world transformation needs to be set up in the SelectionTest beforehand. void selectPlanes(const AABB& aabb, Selector& selector, SelectionTest& test, const PlaneCallback& selectedPlaneCallback) { // Provided that the object's local2World matrix has been fed into the SelectionTest // the getNear() and getFar() methods will return local coordinates. Line line(test.getNear(), test.getFar()); // Calculate the corners (local coords) Vector3 corners[8]; aabb.getCorners(corners); Plane3 planes[6]; aabb.getPlanes(planes); // Next calculate the vectors for the upcoming dot-product // Take the closest point of the selection ray and calc the distance vector for (Vector3* i = corners; i != corners + 8; ++i) { *i = line.getClosestPoint(*i) - (*i); } if (planes[0].normal().dot(corners[1]) > 0 && planes[0].normal().dot(corners[2]) > 0 && planes[0].normal().dot(corners[5]) > 0 && planes[0].normal().dot(corners[6]) > 0) { Selector_add(selector, _selectableRight); selectedPlaneCallback(planes[0]); //rMessage() << "right\n"; } if (planes[1].normal().dot(corners[0]) > 0 && planes[1].normal().dot(corners[3]) > 0 && planes[1].normal().dot(corners[4]) > 0 && planes[1].normal().dot(corners[7]) > 0) { Selector_add(selector, _selectableLeft); selectedPlaneCallback(planes[1]); //rMessage() << "left\n"; } if (planes[2].normal().dot(corners[0]) > 0 && planes[2].normal().dot(corners[1]) > 0 && planes[2].normal().dot(corners[4]) > 0 && planes[2].normal().dot(corners[5]) > 0) { Selector_add(selector, _selectableFront); selectedPlaneCallback(planes[2]); //rMessage() << "front\n"; } if (planes[3].normal().dot(corners[2]) > 0 && planes[3].normal().dot(corners[3]) > 0 && planes[3].normal().dot(corners[6]) > 0 && planes[3].normal().dot(corners[7]) > 0) { Selector_add(selector, _selectableBack); selectedPlaneCallback(planes[3]); //rMessage() << "back\n"; } if (planes[4].normal().dot(corners[0]) > 0 && planes[4].normal().dot(corners[1]) > 0 && planes[4].normal().dot(corners[2]) > 0 && planes[4].normal().dot(corners[3]) > 0) { Selector_add(selector, _selectableTop); selectedPlaneCallback(planes[4]); //rMessage() << "top\n"; } if (planes[5].normal().dot(corners[4]) > 0 && planes[5].normal().dot(corners[5]) > 0 && planes[5].normal().dot(corners[6]) > 0 && planes[5].normal().dot(corners[7]) > 0) { Selector_add(selector, _selectableBottom); selectedPlaneCallback(planes[5]); //rMessage() << "bottom\n"; } m_bounds = aabb; } void selectReversedPlanes(const AABB& aabb, Selector& selector, const SelectedPlanes& selectedPlanes) { Plane3 planes[6]; aabb.getPlanes(planes); if (selectedPlanes.contains(-planes[0])) { Selector_add(selector, _selectableRight); } if (selectedPlanes.contains(-planes[1])) { Selector_add(selector, _selectableLeft); } if (selectedPlanes.contains(-planes[2])) { Selector_add(selector, _selectableFront); } if (selectedPlanes.contains(-planes[3])) { Selector_add(selector, _selectableBack); } if (selectedPlanes.contains(-planes[4])) { Selector_add(selector, _selectableTop); } if (selectedPlanes.contains(-planes[5])) { Selector_add(selector, _selectableBottom); } } // greebo: This calculates a new AABB for the given translation. Everything used in here is in local coordinates: // The m_bounds member (which has to be set beforehand) as well as the translation vector. // Based on the selection status of the 6 planes a new min/max vector pair is calculated // and the resulting AABB is returned. AABB evaluateResize(const Vector3& translation) const { Vector3 min = m_bounds.getOrigin() - m_bounds.getExtents(); Vector3 max = m_bounds.getOrigin() + m_bounds.getExtents(); // Handle x translation if (m_bounds.extents.x() != 0) { if (_selectableRight.isSelected()) { max.x() += translation.x(); //rMessage() << "moving right\n"; } if (_selectableLeft.isSelected()) { min.x() += translation.x(); //rMessage() << "moving left\n"; } } // Handle y translation if (m_bounds.extents.y() != 0) { if (_selectableFront.isSelected()) { max.y() += translation.y(); //rMessage() << "moving front\n"; } if (_selectableBack.isSelected()) { min.y() += translation.y(); //rMessage() << "moving back\n"; } } // Handle z translation if (m_bounds.extents.z() != 0) { if (_selectableTop.isSelected()) { max.z() += translation.z(); //rMessage() << "moving top\n"; } if(_selectableBottom.isSelected()) { min.z() += translation.z(); //rMessage() << "moving bottom\n"; } } return AABB::createFromMinMax(min, max); } // greebo: Evaluates the given translation for the rotated m_bounds and return a new one. // Translation is in world coordinates, whereas the (previously set) m_bounds AABB is in local coords. // The given rotation matrix is used to transform the incoming translation. Only those planes which // have been selected beforehand will be translated. The m_bounds member needs to be set beforehand. // As PatchNodes and SpeakerNodes are quasi non-rotated objects, this code applies to LightNodes only. AABB evaluateResize(const Vector3& translation, const Matrix4& rotation) const { //rMessage() << "Translation: " << translation << ", to local: " << translationToLocal(translation, rotation) << std::endl; // Convert the translation to local coords and calculate a resized AABB (in local coords). AABB aabb(evaluateResize(translationToLocal(translation, rotation))); // The origin is moved by this operation as well: // Rotate the diff vector between oldLocalOrigin and newLocalOrigin and apply it to the AABB aabb.origin = m_bounds.origin + translationFromLocal(aabb.origin - m_bounds.origin, rotation); return aabb; } // greebo: This is used by PatchNodes to calculate a generic transformation matrix from the given // drag-manipulation, which is then applied to the whole object. Matrix4 evaluateTransform(const Vector3& translation) const { AABB aabb(evaluateResize(translation)); Vector3 scale( m_bounds.extents[0] != 0 ? aabb.extents[0] / m_bounds.extents[0] : 1, m_bounds.extents[1] != 0 ? aabb.extents[1] / m_bounds.extents[1] : 1, m_bounds.extents[2] != 0 ? aabb.extents[2] / m_bounds.extents[2] : 1 ); Matrix4 matrix = Matrix4::getTranslation(aabb.origin - m_bounds.origin); matrix.scaleBy(scale, m_bounds.origin); return matrix; } private: // local must be a pure rotation Vector3 translationToLocal(const Vector3& translation, const Matrix4& local) const { return local.getTransposed().getTranslatedBy(translation).getMultipliedBy(local).translation(); } // local must be a pure rotation Vector3 translationFromLocal(const Vector3& translation, const Matrix4& local) const { return local.getTranslatedBy(translation).getMultipliedBy(local.getTransposed()).translation(); } }; } // namespace DarkRadiant-2.0.2/libs/eclass.h000066400000000000000000000076241245424655700163020ustar00rootroot00000000000000/** * \file * Helper functions for dealing with IEntityClass and related objects. */ #pragma once #include "ieclass.h" #include #include #include #include namespace eclass { typedef std::vector AttributeList; namespace detail { class AttributeSuffixComparator { // Starting position to convert to a number std::size_t _startPos; public: /// Constructor. Initialise the start position. AttributeSuffixComparator(std::size_t startPos) : _startPos(startPos) { } bool operator() (const EntityClassAttribute& x, const EntityClassAttribute& y) const { // Get both substrings. An empty suffix comes first. std::string sx = x.getName().substr(_startPos); std::string sy = y.getName().substr(_startPos); if (sx.empty()) return true; else if (sy.empty()) return false; // Try numeric sort first, then fall back to lexicographic if the // prefixes are not integers. try { int ix = boost::lexical_cast(sx); int iy = boost::lexical_cast(sy); // Perform the comparison and return return ix < iy; } catch (boost::bad_lexical_cast&) { // greebo: Non-numeric operands, use ordinary string comparison return sx < sy; } } }; inline void addIfMatches(AttributeList& list, const EntityClassAttribute& attr, const std::string& prefix, bool includeInherited) { if (boost::algorithm::istarts_with(attr.getName(), prefix) && (includeInherited || !attr.inherited)) { list.push_back(attr); } } } /** * \brief * Return a list of all class spawnargs matching the given prefix. * * The list is sorted by the numeric or lexicographic ordering of the suffixes. * This ensures that "editor_usage1", "editor_usage2" etc are returned in the * correct order. * * \param eclass * Entity class object to search * * \param prefix * String prefix for the spawnargs of interest * * \param includeInherited * Whether to include class spawnargs inherited from the parent class. Defaults * to true. */ inline AttributeList getSpawnargsWithPrefix(const IEntityClass& eclass, const std::string& prefix, bool includeInherited = true) { // Populate the list with with matching attributes AttributeList matches; eclass.forEachClassAttribute( std::bind(&detail::addIfMatches, std::ref(matches), std::placeholders::_1, prefix, includeInherited), true // include editor_keys ); // Sort the list in suffix order before returning detail::AttributeSuffixComparator comp(prefix.length()); std::sort(matches.begin(), matches.end(), comp); return matches; } /** * \brief * Get the usage text for an entity class. * * The usage text consists of the values of all "editor_usage" spawnargs * concatenated in order. */ inline std::string getUsage(const IEntityClass& entityClass) { // Find all relevant spawnargs in order AttributeList usageAttrs = getSpawnargsWithPrefix( entityClass, "editor_usage", false ); // Build the string std::ostringstream usage; bool firstLine = true; for (const EntityClassAttribute& a : usageAttrs) { if (firstLine) { usage << a.getValue(); firstLine = false; } else { usage << '\n' << a.getValue(); } } return usage.str(); } } DarkRadiant-2.0.2/libs/entitylib.h000066400000000000000000000256341245424655700170340ustar00rootroot00000000000000#pragma once #include "debugging/debugging.h" #include "ientity.h" #include "ieclass.h" #include "irender.h" #include "igl.h" #include "iselectiontest.h" #include "generic/callback.h" #include "math/AABB.h" #include "scenelib.h" #include #include /* greebo: draws a pyramid defined by 5 vertices * points[0] is the top of the pyramid * points[1] to points[4] is the base rectangle */ inline void drawPyramid(const Vector3 points[5]) { typedef unsigned int index_t; index_t indices[16] = { 0, 1, // top to first 0, 2, // top to second 0, 3, // top to third 0, 4, // top to fourth 1, 2, // first to second 2, 3, // second to third 3, 4, // third to second 4, 1, // fourth to first }; glVertexPointer(3, GL_DOUBLE, 0, points); glDrawElements(GL_LINES, sizeof(indices)/sizeof(index_t), GL_UNSIGNED_INT, indices); } /* greebo: draws a frustum defined by 8 vertices * points[0] to points[3] define the top area vertices (clockwise starting from the "upper right" corner) * points[4] to points[7] define the base rectangle (clockwise starting from the "upper right" corner) */ inline void drawFrustum(const Vector3 points[8]) { typedef unsigned int index_t; index_t indices[24] = { 0, 4, // top up right to bottom up right 1, 5, // top down right to bottom down right 2, 6, // top down left to bottom down left 3, 7, // top up left to bottom up left 0, 1, // top up right to top down right 1, 2, // top down right to top down left 2, 3, // top down left to top up left 3, 0, // top up left to top up right 4, 5, // bottom up right to bottom down right 5, 6, // bottom down right to bottom down left 6, 7, // bottom down left to bottom up left 7, 4, // bottom up left to bottom up right }; glVertexPointer(3, GL_DOUBLE, 0, points); glDrawElements(GL_LINES, sizeof(indices)/sizeof(index_t), GL_UNSIGNED_INT, indices); } inline void arrow_draw(const Vector3& origin, const Vector3& direction) { Vector3 up(0, 0, 1); Vector3 left(-direction[1], direction[0], 0); Vector3 endpoint(origin + direction*32.0); Vector3 tip1(endpoint + direction *(-8.0) + up*(-4.0)); Vector3 tip2(tip1 + up*8.0); Vector3 tip3(endpoint + direction*(-8.0) + left*(-4.0)); Vector3 tip4(tip3 + left*8.0); glBegin (GL_LINES); glVertex3dv(origin); glVertex3dv(endpoint); glVertex3dv(endpoint); glVertex3dv(tip1); glVertex3dv(endpoint); glVertex3dv(tip2); glVertex3dv(endpoint); glVertex3dv(tip3); glVertex3dv(endpoint); glVertex3dv(tip4); glVertex3dv(tip1); glVertex3dv(tip3); glVertex3dv(tip3); glVertex3dv(tip2); glVertex3dv(tip2); glVertex3dv(tip4); glVertex3dv(tip4); glVertex3dv(tip1); glEnd(); } class SelectionIntersection; inline void aabb_testselect(const AABB& aabb, SelectionTest& test, SelectionIntersection& best) { const IndexPointer::index_type indices[24] = { 2, 1, 5, 6, 1, 0, 4, 5, 0, 1, 2, 3, 3, 7, 4, 0, 3, 2, 6, 7, 7, 6, 5, 4, }; Vector3 points[8]; aabb.getCorners(points); VertexPointer pointer(points, sizeof(Vector3)); test.TestQuads(pointer, IndexPointer(indices, 24), best); } inline void aabb_draw_wire(const Vector3 points[8]) { typedef unsigned int index_t; index_t indices[24] = { 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7, }; #if 1 glVertexPointer(3, GL_DOUBLE, 0, points); glDrawElements(GL_LINES, sizeof(indices)/sizeof(index_t), GL_UNSIGNED_INT, indices); #else glBegin(GL_LINES); for(std::size_t i = 0; i < sizeof(indices)/sizeof(index_t); ++i) { glVertex3dv(points[indices[i]]); } glEnd(); #endif } inline void aabb_draw_flatshade(const Vector3 points[8]) { glBegin(GL_QUADS); glNormal3dv(aabb_normals[0]); glVertex3dv(points[2]); glVertex3dv(points[1]); glVertex3dv(points[5]); glVertex3dv(points[6]); glNormal3dv(aabb_normals[1]); glVertex3dv(points[1]); glVertex3dv(points[0]); glVertex3dv(points[4]); glVertex3dv(points[5]); glNormal3dv(aabb_normals[2]); glVertex3dv(points[0]); glVertex3dv(points[1]); glVertex3dv(points[2]); glVertex3dv(points[3]); glNormal3dv(aabb_normals[3]); glVertex3dv(points[0]); glVertex3dv(points[3]); glVertex3dv(points[7]); glVertex3dv(points[4]); glNormal3dv(aabb_normals[4]); glVertex3dv(points[3]); glVertex3dv(points[2]); glVertex3dv(points[6]); glVertex3dv(points[7]); glNormal3dv(aabb_normals[5]); glVertex3dv(points[7]); glVertex3dv(points[6]); glVertex3dv(points[5]); glVertex3dv(points[4]); glEnd(); } inline void aabb_draw_wire(const AABB& aabb) { Vector3 points[8]; aabb.getCorners(points); aabb_draw_wire(points); } inline void aabb_draw_flatshade(const AABB& aabb) { Vector3 points[8]; aabb.getCorners(points); aabb_draw_flatshade(points); } inline void aabb_draw_textured(const AABB& aabb) { Vector3 points[8]; aabb.getCorners(points); glBegin(GL_QUADS); glNormal3dv(aabb_normals[0]); glTexCoord2dv(aabb_texcoord_topleft); glVertex3dv(points[2]); glTexCoord2dv(aabb_texcoord_topright); glVertex3dv(points[1]); glTexCoord2dv(aabb_texcoord_botright); glVertex3dv(points[5]); glTexCoord2dv(aabb_texcoord_botleft); glVertex3dv(points[6]); glNormal3dv(aabb_normals[1]); glTexCoord2dv(aabb_texcoord_topleft); glVertex3dv(points[1]); glTexCoord2dv(aabb_texcoord_topright); glVertex3dv(points[0]); glTexCoord2dv(aabb_texcoord_botright); glVertex3dv(points[4]); glTexCoord2dv(aabb_texcoord_botleft); glVertex3dv(points[5]); glNormal3dv(aabb_normals[2]); glTexCoord2dv(aabb_texcoord_topleft); glVertex3dv(points[0]); glTexCoord2dv(aabb_texcoord_topright); glVertex3dv(points[1]); glTexCoord2dv(aabb_texcoord_botright); glVertex3dv(points[2]); glTexCoord2dv(aabb_texcoord_botleft); glVertex3dv(points[3]); glNormal3dv(aabb_normals[3]); glTexCoord2dv(aabb_texcoord_topleft); glVertex3dv(points[0]); glTexCoord2dv(aabb_texcoord_topright); glVertex3dv(points[3]); glTexCoord2dv(aabb_texcoord_botright); glVertex3dv(points[7]); glTexCoord2dv(aabb_texcoord_botleft); glVertex3dv(points[4]); glNormal3dv(aabb_normals[4]); glTexCoord2dv(aabb_texcoord_topleft); glVertex3dv(points[3]); glTexCoord2dv(aabb_texcoord_topright); glVertex3dv(points[2]); glTexCoord2dv(aabb_texcoord_botright); glVertex3dv(points[6]); glTexCoord2dv(aabb_texcoord_botleft); glVertex3dv(points[7]); glNormal3dv(aabb_normals[5]); glTexCoord2dv(aabb_texcoord_topleft); glVertex3dv(points[7]); glTexCoord2dv(aabb_texcoord_topright); glVertex3dv(points[6]); glTexCoord2dv(aabb_texcoord_botright); glVertex3dv(points[5]); glTexCoord2dv(aabb_texcoord_botleft); glVertex3dv(points[4]); glEnd(); } inline void aabb_draw_solid(const AABB& aabb, RenderStateFlags state) { if(state & RENDER_TEXTURE_2D) { aabb_draw_textured(aabb); } else { aabb_draw_flatshade(aabb); } } inline void aabb_draw(const AABB& aabb, RenderStateFlags state) { if(state & RENDER_FILL) { aabb_draw_solid(aabb, state); } else { aabb_draw_wire(aabb); } } class RenderableSolidAABB : public OpenGLRenderable { const AABB& m_aabb; public: RenderableSolidAABB(const AABB& aabb) : m_aabb(aabb) { } void render(const RenderInfo& info) const { aabb_draw_solid(m_aabb, info.getFlags()); } }; class RenderableWireframeAABB : public OpenGLRenderable { const AABB& m_aabb; public: RenderableWireframeAABB(const AABB& aabb) : m_aabb(aabb) { } void render(const RenderInfo& info) const { aabb_draw_wire(m_aabb); } }; /** * Stream insertion for Entity objects. */ inline std::ostream& operator<< (std::ostream& os, const Entity& entity) { os << "Entity { name=\"" << entity.getKeyValue("name") << "\", " << "classname=\"" << entity.getKeyValue("classname") << "\", " << "origin=\"" << entity.getKeyValue("origin") << "\" }"; return os; } class EntityNodeFindByClassnameWalker : public scene::NodeVisitor { protected: // Name to search for std::string _name; // The search result scene::INodePtr _entityNode; public: // Constructor EntityNodeFindByClassnameWalker(const std::string& name) : _name(name) {} scene::INodePtr getEntityNode() { return _entityNode; } Entity* getEntity() { return _entityNode != NULL ? Node_getEntity(_entityNode) : NULL; } // Pre-descent callback bool pre(const scene::INodePtr& node) { if (_entityNode == NULL) { // Entity not found yet Entity* entity = Node_getEntity(node); if (entity != NULL) { // Got an entity, let's see if the name matches if (entity->getKeyValue("classname") == _name) { _entityNode = node; } return false; // don't traverse entities } else { // Not an entity, traverse return true; } } else { // Entity already found, don't traverse any further return false; } } }; /* greebo: Finds an entity with the given classname */ inline Entity* Scene_FindEntityByClass(const std::string& className) { // Instantiate a walker to find the entity EntityNodeFindByClassnameWalker walker(className); // Walk the scenegraph GlobalSceneGraph().root()->traverse(walker); return walker.getEntity(); } /* Check if a node is the worldspawn. */ inline bool node_is_worldspawn(const scene::INodePtr& node) { Entity* entity = Node_getEntity(node); return entity != 0 && entity->getKeyValue("classname") == "worldspawn"; } /** * greebo: Changing the entity classname is a non-trivial operation in DarkRadiant, as * the actual c++ class of an entity is depending on it. Changing the classname * therefore means 1) to recreate a new entity 2) to copy all spawnargs over from the old one * and 3) re-parent any child nodes to the new entity. * * @node: The entity node to change the classname of. * @classname: The new classname. * * @returns: The new entity node. */ inline scene::INodePtr changeEntityClassname(const scene::INodePtr& node, const std::string& classname) { // Make a copy of this node first scene::INodePtr oldNode(node); // greebo: First, get the eclass IEntityClassPtr eclass = GlobalEntityClassManager().findOrInsert( classname, scene::isGroupNode(oldNode) // whether this entity has child primitives ); // must not fail, findOrInsert always returns non-NULL assert(eclass != NULL); // Create a new entity with the given class IEntityNodePtr newNode(GlobalEntityCreator().createEntity(eclass)); Entity* oldEntity = Node_getEntity(oldNode); // Traverse the old entity with a walker EntityCopyingVisitor visitor(newNode->getEntity()); oldEntity->forEachKeyValue(visitor); // The old node must not be the root node (size of path >= 2) scene::INodePtr parent = oldNode->getParent(); assert(parent != NULL); // Remove the old entity node from the parent scene::removeNodeFromParent(oldNode); // Traverse the child and reparent all primitives to the new entity node scene::parentPrimitives(oldNode, newNode); // Insert the new entity to the parent parent->addChildNode(newNode); return newNode; } DarkRadiant-2.0.2/libs/fs_filesystem.h000066400000000000000000000107061245424655700176770ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_FS_FILESYSTEM_H) #define INCLUDED_FS_FILESYSTEM_H #include "string/string.h" #include "os/path.h" #include #include inline unsigned int path_get_depth(const char* path) { unsigned int depth = 0; while(path != 0 && path[0] != '\0') { path = strchr(path, '/'); if(path != 0) { ++path; } ++depth; } return depth; } /// \brief A generic unix-style file-system which maps paths to files and directories. /// Provides average O(log n) find and insert methods. /// \param file_type The data type which represents a file. template class GenericFileSystem { class Path { std::string m_path; unsigned int m_depth; public: Path(const std::string& path) : m_path(path), m_depth(path_get_depth(m_path.c_str())) {} Path(const char* start, std::size_t length) : m_path(start, length), m_depth(path_get_depth(m_path.c_str())) {} bool operator<(const Path& other) const { return string_less_nocase(c_str(), other.c_str()); } unsigned int depth() const { return m_depth; } const char* c_str() const { return m_path.c_str(); } const std::string& string() const { return m_path; } }; class Entry { file_type* m_file; public: Entry() : m_file(NULL) { } Entry(file_type* file) : m_file(file) { } file_type* file() const { return m_file; } bool is_directory() const { return file() == NULL; } }; typedef std::map Entries; Entries m_entries; public: typedef typename Entries::iterator iterator; typedef typename Entries::value_type value_type; typedef Entry entry_type; iterator begin() { return m_entries.begin(); } iterator end() { return m_entries.end(); } /// \brief Returns the file at \p path. /// Creates all directories below \p path if they do not exist. /// O(log n) on average. entry_type& operator[](const Path& path) { const char* start = path.c_str(); const char* end = path_remove_directory(path.c_str()); while (end[0] != '\0') { // greebo: Take the substring from start to end Path dir(start, end - start); // And insert it as directory (NULL) m_entries.insert(value_type(dir, Entry(NULL))); end = path_remove_directory(end); } return m_entries[path]; } /// \brief Returns the file at \p path or end() if not found. iterator find(const Path& path) { return m_entries.find(path); } iterator begin(const std::string& root) { if(root[0] == '\0') { return m_entries.begin(); } iterator i = m_entries.find(root); if(i == m_entries.end()) { return i; } return ++i; } /// \brief Performs a depth-first traversal of the file-system subtree rooted at \p root. /// Traverses the entire tree if \p root is "". /// Calls \p visitor.file() with the path to each file relative to the filesystem root. /// Calls \p visitor.directory() with the path to each directory relative to the filesystem root. template void traverse(visitor_type visitor, const std::string& root) { unsigned int start_depth = path_get_depth(root.c_str()); unsigned int skip_depth = 0; for(iterator i = begin(root); i != end() && i->first.depth() > start_depth; ++i) { if(i->first.depth() == skip_depth) { skip_depth = 0; } if(skip_depth == 0) { if(!i->second.is_directory()) { visitor.file(i->first.string()); } else if(visitor.directory(i->first.string(), i->first.depth() - start_depth)) { skip_depth = i->first.depth(); } } } } }; #endif DarkRadiant-2.0.2/libs/gamelib.h000066400000000000000000000013621245424655700164210ustar00rootroot00000000000000#pragma once #include "igame.h" #include "string/convert.h" namespace game { namespace current { /** * \brief * Get the value of the current game's tree in the registry and convert it * to type T. If the key cannot be found or is not convertible to the * required type, a default-constructed T will be returned. * * T must be default-constructible, copy-constructible and convertible from * an std::string using boost::lexical_cast. */ template inline T getValue(const std::string& localXPath, T defaultVal = T()) { xml::NodeList list = GlobalGameManager().currentGame()->getLocalXPath(localXPath); return list.empty() ? defaultVal : string::convert(list[0].getAttributeValue("value")); } } // namespace } // namespace DarkRadiant-2.0.2/libs/generic/000077500000000000000000000000001245424655700162625ustar00rootroot00000000000000DarkRadiant-2.0.2/libs/generic/callback.h000066400000000000000000000003271245424655700201710ustar00rootroot00000000000000#ifndef _CALLBACK_H_ #define _CALLBACK_H_ #include // Typedef to satisfy old code - in many places the "Callback" type is still used typedef std::function Callback; #endif /* _CALLBACK_H_ */ DarkRadiant-2.0.2/libs/math/000077500000000000000000000000001245424655700155775ustar00rootroot00000000000000DarkRadiant-2.0.2/libs/math/AABB.cpp000066400000000000000000000124751245424655700170010ustar00rootroot00000000000000#include "AABB.h" #include "Plane3.h" #include "Matrix4.h" // Expand this AABB to include the given point. void AABB::includePoint(const Vector3& point) { // If not yet initialised, simply set the AABB to equal the point if (!isValid()) { origin = point; extents = Vector3(0, 0, 0); } else { // Extend each axis separately for (int i = 0; i < 3; ++i) { // Axis displacement from origin to point double axisDisp = point[i] - origin[i]; // Half of extent increase needed (maybe negative if point inside) double halfDif = 0.5f * (std::abs(axisDisp) - extents[i]); if (halfDif > 0) { origin[i] += (axisDisp > 0) ? halfDif : -halfDif; extents[i] += halfDif; } } } } // Expand this AABB to include another AABB void AABB::includeAABB(const AABB& other) { // Validity check. If both this and other are valid, use the extension // algorithm. If only the other AABB is valid, set this AABB equal to it. // If neither are valid we do nothing. if (isValid() && other.isValid()) { // Extend each axis separately for (int i = 0; i < 3; ++i) { double displacement = other.origin[i] - origin[i]; double difference = other.extents[i] - extents[i]; if (fabs(displacement) > fabs(difference)) { double half_difference = 0.5f * (fabs(displacement) + difference); if (half_difference > 0.0f) { origin[i] += (displacement >= 0.0f) ? half_difference : -half_difference; extents[i] += half_difference; } } else if (difference > 0.0f) { origin[i] = other.origin[i]; extents[i] = other.extents[i]; } } } else if (other.isValid()) { origin = other.origin; extents = other.extents; } } VolumeIntersectionValue AABB::classifyPlane(const Plane3& plane) const { double originDot = plane.normal().dot(origin); double extentsDot = fabs(plane.normal().x()) * extents.x() + fabs(plane.normal().y()) * extents.y() + fabs(plane.normal().z()) * extents.z(); if (originDot + extentsDot - plane.dist() < 0) { // largest dot product is still behind the plane return VOLUME_OUTSIDE; } if (originDot - extentsDot - plane.dist() >= 0) { // smallest dot product still in front of the plane return VOLUME_INSIDE; } return VOLUME_PARTIAL; #if 0 // greebo: I've adjusted this code (as the old one was very likely wrong) // following the explanations on AABB vs. Frustum intersection tests // found here: http://fgiesen.wordpress.com/2010/10/17/view-frustum-culling/ double originDot = plane.normal().dot(origin); double extendsDot = fabs(plane.normal().x()) * extents[0] + fabs(plane.normal().y()) * extents[1] + fabs(plane.normal().z()) * extents[2]; if (originDot + extendsDot > plane.dist()) { // At least one point is on the positive side of the plane return VOLUME_PARTIAL; // partially inside } else if (originDot - extendsDot >= plane.dist()) { // Even the minimum point is on the positive side return VOLUME_INSIDE; // totally inside } return VOLUME_OUTSIDE; // totally outside #endif } unsigned int AABB::classifyOrientedPlane(const Matrix4& transform, const Plane3& plane) const { double distance_origin = plane.normal().dot(origin) + plane.dist(); if (fabs(distance_origin) < (fabs(extents[0] * plane.normal().dot(transform.x().getVector3())) + fabs(extents[1] * plane.normal().dot(transform.y().getVector3())) + fabs(extents[2] * plane.normal().dot(transform.z().getVector3())))) { return 1; // partially inside } else if (distance_origin < 0) { return 2; // totally inside } return 0; // totally outside } void AABB::getCorners(Vector3 corners[8], const Matrix4& rotation) const { Vector3 x = rotation.x().getVector3() * extents.x(); Vector3 y = rotation.y().getVector3() * extents.y(); Vector3 z = rotation.z().getVector3() * extents.z(); corners[0] = origin - x + y + z; corners[1] = origin + x + y + z; corners[2] = origin + x - y + z; corners[3] = origin - x - y + z; corners[4] = origin - x + y - z; corners[5] = origin + x + y - z; corners[6] = origin + x - y - z; corners[7] = origin - x - y - z; } void AABB::getPlanes(Plane3 planes[6], const Matrix4& rotation) const { double x = rotation.x().getVector3().dot(origin); double y = rotation.y().getVector3().dot(origin); double z = rotation.z().getVector3().dot(origin); planes[0] = Plane3( rotation.x().getVector3(), x + extents[0]); planes[1] = Plane3(-rotation.x().getVector3(), -(x - extents[0])); planes[2] = Plane3( rotation.y().getVector3(), y + extents[1]); planes[3] = Plane3(-rotation.y().getVector3(), -(y - extents[1])); planes[4] = Plane3( rotation.z().getVector3(), z + extents[2]); planes[5] = Plane3(-rotation.z().getVector3(), -(z - extents[2])); } AABB AABB::createFromOrientedAABB(const AABB& aabb, const Matrix4& transform) { return AABB( transform.transformPoint(aabb.origin), Vector3( fabs(transform[0] * aabb.extents[0]) + fabs(transform[4] * aabb.extents[1]) + fabs(transform[8] * aabb.extents[2]), fabs(transform[1] * aabb.extents[0]) + fabs(transform[5] * aabb.extents[1]) + fabs(transform[9] * aabb.extents[2]), fabs(transform[2] * aabb.extents[0]) + fabs(transform[6] * aabb.extents[1]) + fabs(transform[10] * aabb.extents[2]) ) ); } DarkRadiant-2.0.2/libs/math/AABB.h000066400000000000000000000220321245424655700164340ustar00rootroot00000000000000#pragma once #include "math/Vector3.h" #include "math/Plane3.h" #include "VolumeIntersectionValue.h" // Forward declaration, include Matrix4.h for definition class Matrix4; /** * An Axis Aligned Bounding Box is a simple cuboid which encloses a given set * of points, such as the vertices of a model. It is defined by an origin, * located at the centre of the AABB, and symmetrical extents in 3 dimension * which determine its size. * * A valid extents vector has all components >= 0, an assumption allowing for * a few optimisations. */ class AABB { public: /// The origin of the AABB, which is always located at the centre. Vector3 origin; /// The symmetrical extents in 3 dimensions. Vector3 extents; /** Construct an AABB with default origin and invalid extents. */ AABB() : origin(0, 0, 0), extents(-1,-1,-1) {} /** Construct an AABB with the provided origin and extents * vectors. */ AABB(const Vector3& origin_, const Vector3& extents_) : origin(origin_), extents(extents_) {} /** * Static named constructor to create an AABB that encloses the provided * minimum and maximum points. */ static AABB createFromMinMax(const Vector3& min, const Vector3& max); /** * Static named constructor to create an AABB that encloses the given AABB rotated * by the given transformation matrix. */ static AABB createFromOrientedAABB(const AABB& aabb, const Matrix4& transform); /** * Static named constructor to create an AABB that encloses the given AABB rotated * by the given transformation matrix. If the given AABB is not valid, it is returned as it is. */ static AABB createFromOrientedAABBSafe(const AABB& aabb, const Matrix4& transform); /** * Create an AABB that is as large as possible (extents are filled with FLT_MAX) */ static AABB createInfinite(); /** * Equality operator, returns true if both origina nd extents are exactly the same */ bool operator==(const AABB& other) const; /** * Inequality operator, using this is equivalent to calling !(operator==) */ bool operator!=(const AABB& other) const; /** * Check whether the AABB is valid, or if the extents are still uninitialised */ bool isValid() const; /** Get the origin of this AABB. * * @returns * A const reference to a Vector3 containing the AABB's origin. */ const Vector3& getOrigin() const; /** Get the extents of this AABB. * * @returns * A const reference to a Vector3 containing the AABB's extents. */ const Vector3& getExtents() const; /** Get the radius of the smallest sphere which encloses this * bounding box. */ float getRadius() const; /** Expand this AABB in-place to include the given point in * world space. * * @param point * Vector3 representing the point to include. */ void includePoint(const Vector3& point); /** Expand this AABB in-place to include the given AABB in * world space. * * @param other * The other AABB to include. */ void includeAABB(const AABB& other); /** * Extends this AABB by the given vector's length. * Equivalent to aabb.extents += extension */ void extendBy(const Vector3& extension); /** * Returns true if this AABB contains the other AABB (all dimensions) */ bool contains(const AABB& other) const; /** * Returns true if this AABB intersects the given one. */ bool intersects(const AABB& other) const; /** * Returns true if this AABB intersects the given point. */ bool intersects(const Vector3& point) const; /** * Classifies the position of this AABB with respect to the given plane. * * @returns: intersection classification, where VOLUME_INSIDE refers to * the AABB being completely on the positive side of the plane (where the * normal vector is pointing to). */ VolumeIntersectionValue classifyPlane(const Plane3& plane) const; /** * Like classifyPlane, but uses the given matrix to transform the plane. * * TODO: Better documentation. TODO: Use enum as return value * * @returns: 0 = totally outside, 1 = partially inside, 2 = totally inside */ unsigned int classifyOrientedPlane(const Matrix4& transform, const Plane3& plane) const; /** * Stores the 3D coordinates of the AABB corner points into the given array. */ void getCorners(Vector3 corners[8]) const; /** * Stores the 3D coordinates of the rotated AABB corner points into the given array. * The rotation is performed using the given transformation matrix. */ void getCorners(Vector3 corners[8], const Matrix4& rotation) const; /** * Writes the 6 Plane3 objects into the given array, corresponding to the * six sides of this AABB. */ void getPlanes(Plane3 planes[6]) const; /** * Writes the 6 Plane3 objects into the given array, corresponding to the * six rotated sides of this AABB. The given matrix is used to rotate this AABB. */ void getPlanes(Plane3 planes[6], const Matrix4& rotation) const; }; inline AABB AABB::createFromMinMax(const Vector3& min, const Vector3& max) { // Origin is the midpoint of the two vectors Vector3 origin = (min + max) * 0.5f; // Extents is the vector from the origin to the max point Vector3 extents = max - origin; // Construct and return the resulting AABB; return AABB(origin, extents); } inline AABB AABB::createFromOrientedAABBSafe(const AABB& aabb, const Matrix4& transform) { return aabb.isValid() ? createFromOrientedAABB(aabb, transform) : aabb; } inline AABB AABB::createInfinite() { return AABB(Vector3(0, 0, 0), Vector3(FLT_MAX, FLT_MAX, FLT_MAX)); } inline bool AABB::operator==(const AABB& other) const { return (origin == other.origin && extents == other.extents); } inline bool AABB::operator!=(const AABB& other) const { return !operator==(other); } inline bool AABB::isValid() const { // Check each origin and extents value. The origins must be between // +/- FLT_MAX, and the extents between 0 and FLT_MAX. for (int i = 0; i < 3; ++i) { if (origin[i] < -FLT_MAX || origin[i] > FLT_MAX || extents[i] < 0 || extents[i] > FLT_MAX) { return false; } } return true; // all checks passed } inline const Vector3& AABB::getOrigin() const { return origin; } inline const Vector3& AABB::getExtents() const { return extents; } inline float AABB::getRadius() const { return extents.getLength(); // Pythagorean length of extents vector } inline bool AABB::contains(const AABB& other) const { // Return true if all coordinates of are contained within these bounds return (origin[0] + extents[0] >= other.origin[0] + other.extents[0]) && (origin[0] - extents[0] <= other.origin[0] - other.extents[0]) && (origin[1] + extents[1] >= other.origin[1] + other.extents[1]) && (origin[1] - extents[1] <= other.origin[1] - other.extents[1]) && (origin[2] + extents[2] >= other.origin[2] + other.extents[2]) && (origin[2] - extents[2] <= other.origin[2] - other.extents[2]); } inline bool AABB::intersects(const AABB& other) const { return fabs(other.origin[0] - origin[0]) < (extents[0] + other.extents[0]) && fabs(other.origin[1] - origin[1]) < (extents[1] + other.extents[1]) && fabs(other.origin[2] - origin[2]) < (extents[2] + other.extents[2]); } inline bool AABB::intersects(const Vector3& point) const { return fabs(point[0] - origin[0]) < extents[0] && fabs(point[1] - origin[1]) < extents[1] && fabs(point[2] - origin[2]) < extents[2]; } inline void AABB::extendBy(const Vector3& extension) { extents += extension; } inline void AABB::getCorners(Vector3 corners[8]) const { Vector3 min(origin - extents); Vector3 max(origin + extents); corners[0] = Vector3(min[0], max[1], max[2]); corners[1] = Vector3(max[0], max[1], max[2]); corners[2] = Vector3(max[0], min[1], max[2]); corners[3] = Vector3(min[0], min[1], max[2]); corners[4] = Vector3(min[0], max[1], min[2]); corners[5] = Vector3(max[0], max[1], min[2]); corners[6] = Vector3(max[0], min[1], min[2]); corners[7] = Vector3(min[0], min[1], min[2]); } inline void AABB::getPlanes(Plane3 planes[6]) const { planes[0] = Plane3( g_vector3_axes[0], origin[0] + extents[0]); planes[1] = Plane3(-g_vector3_axes[0], -(origin[0] - extents[0])); planes[2] = Plane3( g_vector3_axes[1], origin[1] + extents[1]); planes[3] = Plane3(-g_vector3_axes[1], -(origin[1] - extents[1])); planes[4] = Plane3( g_vector3_axes[2], origin[2] + extents[2]); planes[5] = Plane3(-g_vector3_axes[2], -(origin[2] - extents[2])); } /** * Stream insertion for AABB class. */ inline std::ostream& operator<< (std::ostream& os, const AABB& aabb) { os << "AABB { origin=" << aabb.getOrigin() << ", extents=" << aabb.getExtents() << " }"; return os; } class AABBExtendByPoint { AABB& m_aabb; public: AABBExtendByPoint(AABB& aabb) : m_aabb(aabb) { } void operator()(const Vector3& point) const { m_aabb.includePoint(point); } }; const Vector3 aabb_normals[6] = { Vector3( 1, 0, 0 ), Vector3( 0, 1, 0 ), Vector3( 0, 0, 1 ), Vector3(-1, 0, 0 ), Vector3( 0,-1, 0 ), Vector3( 0, 0,-1 ), }; const double aabb_texcoord_topleft[2] = { 0, 0 }; const double aabb_texcoord_topright[2] = { 1, 0 }; const double aabb_texcoord_botleft[2] = { 0, 1 }; const double aabb_texcoord_botright[2] = { 1, 1 }; DarkRadiant-2.0.2/libs/math/FloatTools.h000066400000000000000000000056151245424655700200450ustar00rootroot00000000000000#ifndef FLOATTOOLS_H_ #define FLOATTOOLS_H_ /* greebo: this contains some handy (?) functions for manipulating float variables */ #include #include "lrint.h" #if defined (_MSC_VER) /*inline int lrint (double flt) { int i; _asm { fld flt fistp i }; return i; } */ #elif defined(__FreeBSD__) inline int lrint(double f) { return static_cast(f + 0.5); } #elif defined(__GNUC__) // lrint is part of ISO C99 #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #else #error "unsupported platform" #endif #include #include #include #include // ========================================================================================= /// \brief Returns true if \p self is equal to other \p other within \p epsilon. template inline bool float_equal_epsilon(const Element& self, const OtherElement& other, const Element& epsilon) { return fabs(other - self) < epsilon; } /// \brief Returns the value midway between \p self and \p other. template inline Element float_mid(const Element& self, const Element& other) { return Element((self + other) * 0.5); } /// \brief Returns \p f rounded to the nearest integer. Note that this is not the same behaviour as casting from float to int. template inline int float_to_integer(const Element& f) { return lrint(f); } /// \brief Returns \p f rounded to the nearest multiple of \p snap. template inline Element float_snapped(const Element& f, const OtherElement& snap) { return Element(float_to_integer(f / snap) * snap); } /// \brief Returns true if \p f has no decimal fraction part. template inline bool float_is_integer(const Element& f) { return f == Element(float_to_integer(f)); } /// \brief Returns \p self modulated by the range [0, \p modulus) /// \p self must be in the range [\p -modulus, \p modulus) template inline Element float_mod_range(const Element& self, const ModulusElement& modulus) { return Element((self < 0.0) ? self + modulus : self); } /// \brief Returns \p self modulated by the range [0, \p modulus) template inline Element float_mod(const Element& self, const ModulusElement& modulus) { return float_mod_range(Element(fmod(static_cast(self), static_cast(modulus))), modulus); } template inline bool isNaN(Element x) { return x != x; } // greebo: This checks the given element for NaN and infinity // returns TRUE if the number is safe template inline bool isValid(Element x) { // Check for infinity and NaN return !isNaN(x) && !(std::numeric_limits::has_infinity && fabs(x) == std::numeric_limits::infinity()); } #endif /*FLOATTOOLS_H_*/ DarkRadiant-2.0.2/libs/math/Frustum.cpp000066400000000000000000000103751245424655700177560ustar00rootroot00000000000000#include "Frustum.h" #include "AABB.h" // Normalise all planes in frustum void Frustum::normalisePlanes() { left = left.getNormalised(); right = right.getNormalised(); top = top.getNormalised(); bottom = bottom.getNormalised(); back = back.getNormalised(); front = front.getNormalised(); } // Get a projection matrix from the frustum Matrix4 Frustum::getProjectionMatrix() const { return Matrix4::byColumns( // col 1 (right.normal().x() - left.normal().x()) / 2, (top.normal().x() - bottom.normal().x()) / 2, (back.normal().x() - front.normal().x()) / 2, right.normal().x() - (right.normal().x() - left.normal().x()) / 2, // col 2 (right.normal().y() - left.normal().y()) / 2, (top.normal().y() - bottom.normal().y()) / 2, (back.normal().y() - front.normal().y()) / 2, right.normal().y() - (right.normal().y() - left.normal().y()) / 2, // col 3 (right.normal().z() - left.normal().z()) / 2, (top.normal().z() - bottom.normal().z()) / 2, (back.normal().z() - front.normal().z()) / 2, right.normal().z() - (right.normal().z() - left.normal().z()) / 2, // col 4 (right.dist() - left.dist()) / 2, (top.dist() - bottom.dist()) / 2, (back.dist() - front.dist()) / 2, right.dist() - (right.dist() - left.dist()) / 2 ); } // Get a transformed copy of this frustum Frustum Frustum::getTransformedBy(const Matrix4& matrix) const { // greebo: DR's Plane3 is seriuosly hampered by its internal representation // which is nx,ny,nz,dist instead of a,b,c,d. This causes a lot of confusion // and makes it necessary to invert the dist() member each time before // applying a transformation matrix. Plane3 rightTemp = Plane3(right.normal(), -right.dist()).transform(matrix); Plane3 leftTemp = Plane3(left.normal(), -left.dist()).transform(matrix); Plane3 topTemp = Plane3(top.normal(), -top.dist()).transform(matrix); Plane3 bottomTemp = Plane3(bottom.normal(), -bottom.dist()).transform(matrix); Plane3 backTemp = Plane3(back.normal(), -back.dist()).transform(matrix); Plane3 frontTemp = Plane3(front.normal(), -front.dist()).transform(matrix); rightTemp.dist() = -rightTemp.dist(); leftTemp.dist() = -leftTemp.dist(); topTemp.dist() = -topTemp.dist(); bottomTemp.dist() = -bottomTemp.dist(); backTemp.dist() = -backTemp.dist(); frontTemp.dist() = -frontTemp.dist(); return Frustum( rightTemp, leftTemp, bottomTemp, topTemp, backTemp, frontTemp ); } // Test intersection with an AABB VolumeIntersectionValue Frustum::testIntersection(const AABB& aabb) const { VolumeIntersectionValue result = VOLUME_INSIDE; switch (aabb.classifyPlane(right)) { case VOLUME_OUTSIDE: return VOLUME_OUTSIDE; case VOLUME_PARTIAL: result = VOLUME_PARTIAL; } switch (aabb.classifyPlane(left)) { case VOLUME_OUTSIDE: return VOLUME_OUTSIDE; case VOLUME_PARTIAL: result = VOLUME_PARTIAL; } switch (aabb.classifyPlane(bottom)) { case VOLUME_OUTSIDE: return VOLUME_OUTSIDE; case VOLUME_PARTIAL: result = VOLUME_PARTIAL; } switch (aabb.classifyPlane(top)) { case VOLUME_OUTSIDE: return VOLUME_OUTSIDE; case VOLUME_PARTIAL: result = VOLUME_PARTIAL; } switch (aabb.classifyPlane(back)) { case VOLUME_OUTSIDE: return VOLUME_OUTSIDE; case VOLUME_PARTIAL: result = VOLUME_PARTIAL; } switch (aabb.classifyPlane(front)) { case VOLUME_OUTSIDE: return VOLUME_OUTSIDE; case VOLUME_PARTIAL: result = VOLUME_PARTIAL; } return result; } VolumeIntersectionValue Frustum::testIntersection(const AABB& aabb, const Matrix4& localToWorld) const { AABB aabb_world(aabb); aabb_world.origin = localToWorld.transformPoint(aabb_world.origin); if (right.containsAABB(aabb_world, localToWorld) || left.containsAABB(aabb_world, localToWorld) || bottom.containsAABB(aabb_world, localToWorld) || top.containsAABB(aabb_world, localToWorld) || back.containsAABB(aabb_world, localToWorld) || front.containsAABB(aabb_world, localToWorld)) { return VOLUME_OUTSIDE; } return VOLUME_INSIDE; } DarkRadiant-2.0.2/libs/math/Frustum.h000066400000000000000000000076461245424655700174320ustar00rootroot00000000000000#pragma once /// \file /// \brief View-frustum data types and related operations. #include "math/Matrix4.h" #include "math/Segment.h" #include "VolumeIntersectionValue.h" class AABB; class Plane3; /** * \brief * Object representing a frustum, defined by six planes. */ class Frustum { public: Plane3 right, left, bottom, top, back, front; Frustum() {} Frustum(const Plane3& _right, const Plane3& _left, const Plane3& _bottom, const Plane3& _top, const Plane3& _back, const Plane3& _front) : right(_right), left(_left), bottom(_bottom), top(_top), back(_back), front(_front) {} /** * Construct the frustum planes from the given projection matrix. */ static Frustum createFromViewproj(const Matrix4& viewproj); /** * \brief * Normalise all planes in the frustum. */ void normalisePlanes(); /** * \brief * Get the projection matrix corresponding to the planes of this frustum. */ Matrix4 getProjectionMatrix() const; /** * \brief * Return a copy of this frustum transformed by the given matrix. */ Frustum getTransformedBy(const Matrix4& transform) const; /** * \brief * Test the intersection of this frustum with an AABB. */ VolumeIntersectionValue testIntersection(const AABB& aabb) const; /** * Test the intersection of this frustum with a transformed AABB. */ VolumeIntersectionValue testIntersection(const AABB& aabb, const Matrix4& localToWorld) const; /** * Returns true if the given point is contained in this frustum. */ bool testPoint(const Vector3& point) const; bool testLine(const Segment& segment) const; }; inline Frustum Frustum::createFromViewproj(const Matrix4& viewproj) { // greebo: Note that the usual plane-from-frustum equations which can be found // throughout the internet are referring to a plane format a,b,c,d whereas // DarkRadiant uses a,b,c and dist, that's why the fourth terms in each line are negated. return Frustum ( Plane3(viewproj[3] - viewproj[0], viewproj[7] - viewproj[4], viewproj[11] - viewproj[ 8], -viewproj[15] + viewproj[12]).getNormalised(), Plane3(viewproj[3] + viewproj[0], viewproj[7] + viewproj[4], viewproj[11] + viewproj[ 8], -viewproj[15] - viewproj[12]).getNormalised(), Plane3(viewproj[3] + viewproj[1], viewproj[7] + viewproj[5], viewproj[11] + viewproj[ 9], -viewproj[15] - viewproj[13]).getNormalised(), Plane3(viewproj[3] - viewproj[1], viewproj[7] - viewproj[5], viewproj[11] - viewproj[ 9], -viewproj[15] + viewproj[13]).getNormalised(), Plane3(viewproj[3] - viewproj[2], viewproj[7] - viewproj[6], viewproj[11] - viewproj[10], -viewproj[15] + viewproj[14]).getNormalised(), Plane3(viewproj[3] + viewproj[2], viewproj[7] + viewproj[6], viewproj[11] + viewproj[10], -viewproj[15] - viewproj[14]).getNormalised() ); } inline bool Frustum::testPoint(const Vector3& point) const { return !right.testPoint(point) && !left.testPoint(point) && !bottom.testPoint(point) && !top.testPoint(point) && !back.testPoint(point) && !front.testPoint(point); } inline bool plane3_test_line(const Plane3& plane, const Segment& segment) { return segment.classifyPlane(plane) == 2; // totally inside } inline bool Frustum::testLine(const Segment& segment) const { return !plane3_test_line(right, segment) && !plane3_test_line(left, segment) && !plane3_test_line(bottom, segment) && !plane3_test_line(top, segment) && !plane3_test_line(back, segment) && !plane3_test_line(front, segment); } /** * \brief * Operator insertion for Frustum. */ inline std::ostream& operator<< (std::ostream& os, const Frustum& frustum) { os << "Frustum { " << "left = " << frustum.left << ", " << "right = " << frustum.right << ", " << "top = " << frustum.top << ", " << "bottom = " << frustum.bottom << ", " << "front = " << frustum.front << ", " << "back = " << frustum.back << " }"; return os; } DarkRadiant-2.0.2/libs/math/Line.h000066400000000000000000000011331245424655700166350ustar00rootroot00000000000000#pragma once /// \file /// \brief Line data types and related operations. #include "Vector3.h" /// \brief A line segment defined by a start point and and end point. class Line { public: Vector3 start, end; Line() {} Line(const Vector3& start_, const Vector3& end_) : start(start_), end(end_) {} Vector3 getClosestPoint(const Vector3& point) const { Vector3 v = end - start; Vector3 w = point - start; double c1 = w.dot(v); if (c1 <= 0) { return start; } double c2 = v.dot(v); if (c2 <= c1) { return end; } return Vector3(start + v * (c1 / c2)); } }; DarkRadiant-2.0.2/libs/math/Makefile.am000066400000000000000000000015211245424655700176320ustar00rootroot00000000000000AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs AM_CXXFLAGS = -fPIC pkglib_LTLIBRARIES = libmath.la libmath_la_LDFLAGS = -release @PACKAGE_VERSION@ libmath_la_SOURCES = Matrix4.cpp \ Frustum.cpp \ Plane3.cpp \ AABB.cpp \ Quaternion.cpp TESTS = vectorTest matrixTest quaternionTest planeTest check_PROGRAMS = vectorTest matrixTest quaternionTest planeTest vectorTest_SOURCES = test/vectorTest.cpp vectorTest_LDADD = $(BOOST_UNIT_TEST_FRAMEWORK_LIBS) matrixTest_SOURCES = test/matrixTest.cpp matrixTest_LDADD = $(BOOST_UNIT_TEST_FRAMEWORK_LIBS) libmath.la quaternionTest_SOURCES = test/quaternionTest.cpp quaternionTest_LDADD = $(BOOST_UNIT_TEST_FRAMEWORK_LIBS) planeTest_SOURCES = test/planeTest.cpp planeTest_LDADD = $(BOOST_UNIT_TEST_FRAMEWORK_LIBS) libmath.la DarkRadiant-2.0.2/libs/math/Makefile.in000066400000000000000000001175511245424655700176560ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ TESTS = vectorTest$(EXEEXT) matrixTest$(EXEEXT) \ quaternionTest$(EXEEXT) planeTest$(EXEEXT) check_PROGRAMS = vectorTest$(EXEEXT) matrixTest$(EXEEXT) \ quaternionTest$(EXEEXT) planeTest$(EXEEXT) subdir = libs/math DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkglibdir)" LTLIBRARIES = $(pkglib_LTLIBRARIES) libmath_la_LIBADD = am_libmath_la_OBJECTS = Matrix4.lo Frustum.lo Plane3.lo AABB.lo \ Quaternion.lo libmath_la_OBJECTS = $(am_libmath_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libmath_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libmath_la_LDFLAGS) $(LDFLAGS) -o $@ am__dirstamp = $(am__leading_dot)dirstamp am_matrixTest_OBJECTS = test/matrixTest.$(OBJEXT) matrixTest_OBJECTS = $(am_matrixTest_OBJECTS) am__DEPENDENCIES_1 = matrixTest_DEPENDENCIES = $(am__DEPENDENCIES_1) libmath.la am_planeTest_OBJECTS = test/planeTest.$(OBJEXT) planeTest_OBJECTS = $(am_planeTest_OBJECTS) planeTest_DEPENDENCIES = $(am__DEPENDENCIES_1) libmath.la am_quaternionTest_OBJECTS = test/quaternionTest.$(OBJEXT) quaternionTest_OBJECTS = $(am_quaternionTest_OBJECTS) quaternionTest_DEPENDENCIES = $(am__DEPENDENCIES_1) am_vectorTest_OBJECTS = test/vectorTest.$(OBJEXT) vectorTest_OBJECTS = $(am_vectorTest_OBJECTS) vectorTest_DEPENDENCIES = $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libmath_la_SOURCES) $(matrixTest_SOURCES) \ $(planeTest_SOURCES) $(quaternionTest_SOURCES) \ $(vectorTest_SOURCES) DIST_SOURCES = $(libmath_la_SOURCES) $(matrixTest_SOURCES) \ $(planeTest_SOURCES) $(quaternionTest_SOURCES) \ $(vectorTest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs AM_CXXFLAGS = -fPIC pkglib_LTLIBRARIES = libmath.la libmath_la_LDFLAGS = -release @PACKAGE_VERSION@ libmath_la_SOURCES = Matrix4.cpp \ Frustum.cpp \ Plane3.cpp \ AABB.cpp \ Quaternion.cpp vectorTest_SOURCES = test/vectorTest.cpp vectorTest_LDADD = $(BOOST_UNIT_TEST_FRAMEWORK_LIBS) matrixTest_SOURCES = test/matrixTest.cpp matrixTest_LDADD = $(BOOST_UNIT_TEST_FRAMEWORK_LIBS) libmath.la quaternionTest_SOURCES = test/quaternionTest.cpp quaternionTest_LDADD = $(BOOST_UNIT_TEST_FRAMEWORK_LIBS) planeTest_SOURCES = test/planeTest.cpp planeTest_LDADD = $(BOOST_UNIT_TEST_FRAMEWORK_LIBS) libmath.la all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/math/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/math/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ } uninstall-pkglibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ done clean-pkglibLTLIBRARIES: -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) @list='$(pkglib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libmath.la: $(libmath_la_OBJECTS) $(libmath_la_DEPENDENCIES) $(EXTRA_libmath_la_DEPENDENCIES) $(AM_V_CXXLD)$(libmath_la_LINK) -rpath $(pkglibdir) $(libmath_la_OBJECTS) $(libmath_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test/$(am__dirstamp): @$(MKDIR_P) test @: > test/$(am__dirstamp) test/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) test/$(DEPDIR) @: > test/$(DEPDIR)/$(am__dirstamp) test/matrixTest.$(OBJEXT): test/$(am__dirstamp) \ test/$(DEPDIR)/$(am__dirstamp) matrixTest$(EXEEXT): $(matrixTest_OBJECTS) $(matrixTest_DEPENDENCIES) $(EXTRA_matrixTest_DEPENDENCIES) @rm -f matrixTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(matrixTest_OBJECTS) $(matrixTest_LDADD) $(LIBS) test/planeTest.$(OBJEXT): test/$(am__dirstamp) \ test/$(DEPDIR)/$(am__dirstamp) planeTest$(EXEEXT): $(planeTest_OBJECTS) $(planeTest_DEPENDENCIES) $(EXTRA_planeTest_DEPENDENCIES) @rm -f planeTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(planeTest_OBJECTS) $(planeTest_LDADD) $(LIBS) test/quaternionTest.$(OBJEXT): test/$(am__dirstamp) \ test/$(DEPDIR)/$(am__dirstamp) quaternionTest$(EXEEXT): $(quaternionTest_OBJECTS) $(quaternionTest_DEPENDENCIES) $(EXTRA_quaternionTest_DEPENDENCIES) @rm -f quaternionTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(quaternionTest_OBJECTS) $(quaternionTest_LDADD) $(LIBS) test/vectorTest.$(OBJEXT): test/$(am__dirstamp) \ test/$(DEPDIR)/$(am__dirstamp) vectorTest$(EXEEXT): $(vectorTest_OBJECTS) $(vectorTest_DEPENDENCIES) $(EXTRA_vectorTest_DEPENDENCIES) @rm -f vectorTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(vectorTest_OBJECTS) $(vectorTest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f test/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AABB.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Frustum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Matrix4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Plane3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Quaternion.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/matrixTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/planeTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/quaternionTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/vectorTest.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? vectorTest.log: vectorTest$(EXEEXT) @p='vectorTest$(EXEEXT)'; \ b='vectorTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) matrixTest.log: matrixTest$(EXEEXT) @p='matrixTest$(EXEEXT)'; \ b='matrixTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) quaternionTest.log: quaternionTest$(EXEEXT) @p='quaternionTest$(EXEEXT)'; \ b='quaternionTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) planeTest.log: planeTest$(EXEEXT) @p='planeTest$(EXEEXT)'; \ b='planeTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pkglibdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f test/$(DEPDIR)/$(am__dirstamp) -rm -f test/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-pkglibLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) test/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-pkglibLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) test/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkglibLTLIBRARIES .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-pkglibLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkglibLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkglibLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/libs/math/Matrix4.cpp000066400000000000000000000515501245424655700176410ustar00rootroot00000000000000#include "Matrix4.h" #include "Quaternion.h" #include namespace { /// \brief Returns \p euler angles converted from degrees to radians. inline Vector3 euler_degrees_to_radians(const Vector3& euler) { return Vector3( degrees_to_radians(euler.x()), degrees_to_radians(euler.y()), degrees_to_radians(euler.z()) ); } inline bool quaternion_component_is_90(double component) { return (fabs(component) - c_half_sqrt2f) < 0.001f; } } // Main explicit constructor (private) Matrix4::Matrix4(double xx_, double xy_, double xz_, double xw_, double yx_, double yy_, double yz_, double yw_, double zx_, double zy_, double zz_, double zw_, double tx_, double ty_, double tz_, double tw_) { xx() = xx_; xy() = xy_; xz() = xz_; xw() = xw_; yx() = yx_; yy() = yy_; yz() = yz_; yw() = yw_; zx() = zx_; zy() = zy_; zz() = zz_; zw() = zw_; tx() = tx_; ty() = ty_; tz() = tz_; tw() = tw_; } // Named constructors // Identity matrix const Matrix4& Matrix4::getIdentity() { static const Matrix4 _identity( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); return _identity; } Matrix4 Matrix4::getRotation(const std::string& rotationString) { double rotation[9]; std::stringstream strm(rotationString); strm << std::skipws; for (int i = 0; i < 9; ++i) { strm >> rotation[i]; } if (!strm) { // Parsing failed, fall back to the identity matrix return Matrix4::getIdentity(); } return Matrix4::byColumns( rotation[0], rotation[1], rotation[2], 0, rotation[3], rotation[4], rotation[5], 0, rotation[6], rotation[7], rotation[8], 0, 0, 0, 0, 1 ); } // Get a translation matrix for the given vector Matrix4 Matrix4::getTranslation(const Vector3& translation) { return Matrix4::byColumns( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, translation.x(), translation.y(), translation.z(), 1 ); } // Get a rotation from 2 vectors (named constructor) Matrix4 Matrix4::getRotation(const Vector3& a, const Vector3& b) { double angle = a.angle(b); Vector3 axis = b.crossProduct(a).getNormalised(); return getRotation(axis, angle); } Matrix4 Matrix4::getRotation(const Vector3& axis, const double angle) { // Pre-calculate the terms double cosPhi = cos(angle); double sinPhi = sin(angle); double oneMinusCosPhi = static_cast(1) - cos(angle); double x = axis.x(); double y = axis.y(); double z = axis.z(); return Matrix4::byColumns( cosPhi + oneMinusCosPhi*x*x, oneMinusCosPhi*x*y - sinPhi*z, oneMinusCosPhi*x*z + sinPhi*y, 0, oneMinusCosPhi*y*x + sinPhi*z, cosPhi + oneMinusCosPhi*y*y, oneMinusCosPhi*y*z - sinPhi*x, 0, oneMinusCosPhi*z*x - sinPhi*y, oneMinusCosPhi*z*y + sinPhi*x, cosPhi + oneMinusCosPhi*z*z, 0, 0, 0, 0, 1 ); } Matrix4 Matrix4::getRotation(const Quaternion& quaternion) { const double x2 = quaternion[0] + quaternion[0]; const double y2 = quaternion[1] + quaternion[1]; const double z2 = quaternion[2] + quaternion[2]; const double xx = quaternion[0] * x2; const double xy = quaternion[0] * y2; const double xz = quaternion[0] * z2; const double yy = quaternion[1] * y2; const double yz = quaternion[1] * z2; const double zz = quaternion[2] * z2; const double wx = quaternion[3] * x2; const double wy = quaternion[3] * y2; const double wz = quaternion[3] * z2; return Matrix4::byColumns( 1.0f - (yy + zz), xy + wz, xz - wy, 0, xy - wz, 1.0f - (xx + zz), yz + wx, 0, xz + wy, yz - wx, 1.0f - (xx + yy), 0, 0, 0, 0, 1 ); } Matrix4 Matrix4::getRotationQuantised(const Quaternion& quaternion) { if (quaternion.y() == 0 && quaternion.z() == 0 && quaternion_component_is_90(quaternion.x()) && quaternion_component_is_90(quaternion.w())) { return Matrix4::getRotationAboutXForSinCos((quaternion.x() > 0) ? 1.0f : -1.0f, 0); } if (quaternion.x() == 0 && quaternion.z() == 0 && quaternion_component_is_90(quaternion.y()) && quaternion_component_is_90(quaternion.w())) { return Matrix4::getRotationAboutYForSinCos((quaternion.y() > 0) ? 1.0f : -1.0f, 0); } if (quaternion.x() == 0 && quaternion.y() == 0 && quaternion_component_is_90(quaternion.z()) && quaternion_component_is_90(quaternion.w())) { return Matrix4::getRotationAboutZForSinCos((quaternion.z() > 0) ? 1.0f : -1.0f, 0); } return getRotation(quaternion); } Matrix4 Matrix4::getRotationAboutXForSinCos(double s, double c) { return Matrix4::byColumns( 1, 0, 0, 0, 0, c, s, 0, 0,-s, c, 0, 0, 0, 0, 1 ); } Matrix4 Matrix4::getRotationAboutYForSinCos(double s, double c) { return Matrix4::byColumns( c, 0,-s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1 ); } Matrix4 Matrix4::getRotationAboutZForSinCos(double s, double c) { return Matrix4::byColumns( c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); } /*! \verbatim clockwise rotation around X, Y, Z, facing along axis 1 0 0 cy 0 -sy cz sz 0 0 cx sx 0 1 0 -sz cz 0 0 -sx cx sy 0 cy 0 0 1 rows of Z by cols of Y cy*cz -sy*cz+sz -sy*sz+cz -sz*cy -sz*sy+cz .. or something like that.. final rotation is Z * Y * X cy*cz -sx*-sy*cz+cx*sz cx*-sy*sz+sx*cz -cy*sz sx*sy*sz+cx*cz -cx*-sy*sz+sx*cz sy -sx*cy cx*cy transposed cy.cz + 0.sz + sy.0 cy.-sz + 0 .cz + sy.0 cy.0 + 0 .0 + sy.1 | sx.sy.cz + cx.sz + -sx.cy.0 sx.sy.-sz + cx.cz + -sx.cy.0 sx.sy.0 + cx.0 + -sx.cy.1 | -cx.sy.cz + sx.sz + cx.cy.0 -cx.sy.-sz + sx.cz + cx.cy.0 -cx.sy.0 + 0 .0 + cx.cy.1 | \endverbatim */ Matrix4 Matrix4::getRotationForEulerXYZ(const Vector3& euler) { double cx = cos(euler[0]); double sx = sin(euler[0]); double cy = cos(euler[1]); double sy = sin(euler[1]); double cz = cos(euler[2]); double sz = sin(euler[2]); return Matrix4::byColumns( cy*cz, cy*sz, -sy, 0, sx*sy*cz + cx*-sz, sx*sy*sz + cx*cz, sx*cy, 0, cx*sy*cz + sx*sz, cx*sy*sz + -sx*cz, cx*cy, 0, 0, 0, 0, 1 ); } Matrix4 Matrix4::getRotationForEulerXYZDegrees(const Vector3& euler) { return getRotationForEulerXYZ(euler_degrees_to_radians(euler)); } Matrix4 Matrix4::getRotationForEulerYZX(const Vector3& euler) { double cx = cos(euler[0]); double sx = sin(euler[0]); double cy = cos(euler[1]); double sy = sin(euler[1]); double cz = cos(euler[2]); double sz = sin(euler[2]); return Matrix4::byColumns( cy*cz, cx*cy*sz + sx*sy, sx*cy*sz - cx*sy, 0, -sz, cx*cz, sx*cz, 0, sy*cz, cx*sy*sz - sx*cy, sx*sy*sz + cx*cy, 0, 0, 0, 0, 1 ); } Matrix4 Matrix4::getRotationForEulerYZXDegrees(const Vector3& euler) { return getRotationForEulerYZX(euler_degrees_to_radians(euler)); } Matrix4 Matrix4::getRotationForEulerXZY(const Vector3& euler) { double cx = cos(euler[0]); double sx = sin(euler[0]); double cy = cos(euler[1]); double sy = sin(euler[1]); double cz = cos(euler[2]); double sz = sin(euler[2]); return Matrix4::byColumns( cy*cz, sz, -sy*cz, 0, sx*sy - cx*cy*sz, cx*cz, cx*sy*sz + sx*cy, 0, sx*cy*sz + cx*sy, -sx*cz, cx*cy - sx*sy*sz, 0, 0, 0, 0, 1 ); } Matrix4 Matrix4::getRotationForEulerXZYDegrees(const Vector3& euler) { return getRotationForEulerXZY(euler_degrees_to_radians(euler)); } Matrix4 Matrix4::getRotationForEulerYXZ(const Vector3& euler) { double cx = cos(euler[0]); double sx = sin(euler[0]); double cy = cos(euler[1]); double sy = sin(euler[1]); double cz = cos(euler[2]); double sz = sin(euler[2]); return Matrix4::byColumns( cy*cz - sx*sy*sz, cy*sz + sx*sy*cz, -cx*sy, 0, -cx*sz, cx*cz, sx, 0, sy*cz + sx*cy*sz, sy*sz - sx*cy*cz, cx*cy, 0, 0, 0, 0, 1 ); } Matrix4 Matrix4::getRotationForEulerYXZDegrees(const Vector3& euler) { return getRotationForEulerYXZ(euler_degrees_to_radians(euler)); } Matrix4 Matrix4::getRotationForEulerZXY(const Vector3& euler) { double cx = cos(euler[0]); double sx = sin(euler[0]); double cy = cos(euler[1]); double sy = sin(euler[1]); double cz = cos(euler[2]); double sz = sin(euler[2]); return Matrix4::byColumns( cy*cz + sx*sy*sz, cx*sz, sx*cy*sz - sy*cz, 0, sx*sy*cz - cy*sz, cx*cz, sy*sz + sx*cy*cz, 0, cx*sy, -sx, cx*cy, 0, 0, 0, 0, 1 ); } Matrix4 Matrix4::getRotationForEulerZXYDegrees(const Vector3& euler) { return getRotationForEulerZXY(euler_degrees_to_radians(euler)); } Matrix4 Matrix4::getRotationForEulerZYX(const Vector3& euler) { double cx = cos(euler[0]); double sx = sin(euler[0]); double cy = cos(euler[1]); double sy = sin(euler[1]); double cz = cos(euler[2]); double sz = sin(euler[2]); return Matrix4::byColumns( cy*cz, cx*sz + sx*sy*cz, sx*sz - cx*sy*cz, 0, -cy*sz, cx*cz - sx*sy*sz, sx*cz + cx*sy*sz, 0, sy, -sx*cy, cx*cy, 0, 0, 0, 0, 1 ); } Matrix4 Matrix4::getRotationForEulerZYXDegrees(const Vector3& euler) { return getRotationForEulerZYX(euler_degrees_to_radians(euler)); } // Get a scale matrix Matrix4 Matrix4::getScale(const Vector3& scale) { return Matrix4::byColumns( scale[0], 0, 0, 0, 0, scale[1], 0, 0, 0, 0, scale[2], 0, 0, 0, 0, 1 ); } // Transpose the matrix in-place void Matrix4::transpose() { std::swap(_m[1], _m[4]); // xy <=> yx std::swap(_m[2], _m[8]); // xz <=> zx std::swap(_m[3], _m[12]); // xw <=> tx std::swap(_m[6], _m[9]); // yz <=> zy std::swap(_m[7], _m[13]); // yw <=> ty std::swap(_m[11], _m[14]); // zw <=> tz } // Return transposed copy Matrix4 Matrix4::getTransposed() const { return Matrix4( xx(), yx(), zx(), tx(), xy(), yy(), zy(), ty(), xz(), yz(), zz(), tz(), xw(), yw(), zw(), tw() ); } // Return affine inverse Matrix4 Matrix4::getInverse() const { Matrix4 result; // determinant of rotation submatrix double det = _m[0] * ( _m[5]*_m[10] - _m[9]*_m[6] ) - _m[1] * ( _m[4]*_m[10] - _m[8]*_m[6] ) + _m[2] * ( _m[4]*_m[9] - _m[8]*_m[5] ); // throw exception here if (det*det < 1e-25) // invert rotation submatrix det = 1.0f / det; result[0] = ( (_m[5]*_m[10]- _m[6]*_m[9] )*det); result[1] = (- (_m[1]*_m[10]- _m[2]*_m[9] )*det); result[2] = ( (_m[1]*_m[6] - _m[2]*_m[5] )*det); result[3] = 0; result[4] = (- (_m[4]*_m[10]- _m[6]*_m[8] )*det); result[5] = ( (_m[0]*_m[10]- _m[2]*_m[8] )*det); result[6] = (- (_m[0]*_m[6] - _m[2]*_m[4] )*det); result[7] = 0; result[8] = ( (_m[4]*_m[9] - _m[5]*_m[8] )*det); result[9] = (- (_m[0]*_m[9] - _m[1]*_m[8] )*det); result[10]= ( (_m[0]*_m[5] - _m[1]*_m[4] )*det); result[11] = 0; // multiply translation part by rotation result[12] = - (_m[12] * result[0] + _m[13] * result[4] + _m[14] * result[8]); result[13] = - (_m[12] * result[1] + _m[13] * result[5] + _m[14] * result[9]); result[14] = - (_m[12] * result[2] + _m[13] * result[6] + _m[14] * result[10]); result[15] = 1; return result; } Matrix4 Matrix4::getFullInverse() const { // The inverse is generated through the adjugate matrix // 2x2 minors (re-usable for the determinant) double minor01 = zz() * tw() - zw() * tz(); double minor02 = zy() * tw() - zw() * ty(); double minor03 = zx() * tw() - zw() * tx(); double minor04 = zy() * tz() - zz() * ty(); double minor05 = zx() * tz() - zz() * tx(); double minor06 = zx() * ty() - zy() * tx(); // 2x2 minors (not usable for the determinant) double minor07 = yz() * tw() - yw() * tz(); double minor08 = yy() * tw() - yw() * ty(); double minor09 = yy() * tz() - yz() * ty(); double minor10 = yx() * tw() - yw() * tx(); double minor11 = yx() * tz() - yz() * tx(); double minor12 = yx() * ty() - yy() * tx(); double minor13 = yz() * zw() - yw() * zz(); double minor14 = yy() * zw() - yw() * zy(); double minor15 = yy() * zz() - yz() * zy(); double minor16 = yx() * zw() - yw() * zx(); double minor17 = yx() * zz() - yz() * zx(); double minor18 = yx() * zy() - yy() * zx(); // 3x3 minors (re-usable for the determinant) double minor3x3_11 = yy() * minor01 - yz() * minor02 + yw() * minor04; double minor3x3_21 = yx() * minor01 - yz() * minor03 + yw() * minor05; double minor3x3_31 = yx() * minor02 - yy() * minor03 + yw() * minor06; double minor3x3_41 = yx() * minor04 - yy() * minor05 + yz() * minor06; // 3x3 minors (not usable for the determinant) double minor3x3_12 = xy() * minor01 - xz() * minor02 + xw() * minor04; double minor3x3_22 = xx() * minor01 - xz() * minor03 + xw() * minor05; double minor3x3_32 = xx() * minor02 - xy() * minor03 + xw() * minor06; double minor3x3_42 = xx() * minor04 - xy() * minor05 + xz() * minor06; double minor3x3_13 = xy() * minor07 - xz() * minor08 + xw() * minor09; double minor3x3_23 = xx() * minor07 - xz() * minor10 + xw() * minor11; double minor3x3_33 = xx() * minor08 - xy() * minor10 + xw() * minor12; double minor3x3_43 = xx() * minor09 - xy() * minor11 + xz() * minor12; double minor3x3_14 = xy() * minor13 - xz() * minor14 + xw() * minor15; double minor3x3_24 = xx() * minor13 - xz() * minor16 + xw() * minor17; double minor3x3_34 = xx() * minor14 - xy() * minor16 + xw() * minor18; double minor3x3_44 = xx() * minor15 - xy() * minor17 + xz() * minor18; double determinant = xx() * minor3x3_11 - xy() * minor3x3_21 + xz() * minor3x3_31 - xw() * minor3x3_41; double invDet = 1.0f / determinant; return Matrix4::byColumns( +minor3x3_11 * invDet, -minor3x3_12 * invDet, +minor3x3_13 * invDet, -minor3x3_14 * invDet, -minor3x3_21 * invDet, +minor3x3_22 * invDet, -minor3x3_23 * invDet, +minor3x3_24 * invDet, +minor3x3_31 * invDet, -minor3x3_32 * invDet, +minor3x3_33 * invDet, -minor3x3_34 * invDet, -minor3x3_41 * invDet, +minor3x3_42 * invDet, -minor3x3_43 * invDet, +minor3x3_44 * invDet ); } // Multiply by another matrix, in-place void Matrix4::multiplyBy(const Matrix4& other) { *this = getMultipliedBy(other); } // Add a translation component void Matrix4::translateBy(const Vector3& translation) { multiplyBy(getTranslation(translation)); } // Add a scale component void Matrix4::scaleBy(const Vector3& scale) { multiplyBy(getScale(scale)); } namespace { class Vector4ClipLT { public: static bool compare(const Vector4& self, std::size_t index) { return self[index] < self[3]; } static double scale(const Vector4& self, const Vector4& other, std::size_t index) { return (self[index] - self[3]) / (other[3] - other[index]); } }; class Vector4ClipGT { public: static bool compare(const Vector4& self, std::size_t index) { return self[index] > -self[3]; } static double scale(const Vector4& self, const Vector4& other, std::size_t index) { return (self[index] + self[3]) / (-other[3] - other[index]); } }; template class Vector4ClipPolygon { public: typedef Vector4* iterator; typedef const Vector4* const_iterator; static std::size_t apply(const_iterator first, const_iterator last, iterator out, std::size_t index) { const_iterator next = first, i = last - 1; iterator tmp(out); bool b0 = ClipPlane::compare(*i, index); while(next != last) { bool b1 = ClipPlane::compare(*next, index); if(b0 ^ b1) { *out = *next - *i; double scale = ClipPlane::scale(*i, *out, index); (*out)[0] = (*i)[0] + scale*((*out)[0]); (*out)[1] = (*i)[1] + scale*((*out)[1]); (*out)[2] = (*i)[2] + scale*((*out)[2]); (*out)[3] = (*i)[3] + scale*((*out)[3]); ++out; } if(b1) { *out = *next; ++out; } i = next; ++next; b0 = b1; } return out - tmp; } }; #define CLIP_X_LT_W(p) (Vector4ClipLT::compare(p, 0)) #define CLIP_X_GT_W(p) (Vector4ClipGT::compare(p, 0)) #define CLIP_Y_LT_W(p) (Vector4ClipLT::compare(p, 1)) #define CLIP_Y_GT_W(p) (Vector4ClipGT::compare(p, 1)) #define CLIP_Z_LT_W(p) (Vector4ClipLT::compare(p, 2)) #define CLIP_Z_GT_W(p) (Vector4ClipGT::compare(p, 2)) inline ClipResult homogenous_clip_point(const Vector4& clipped) { ClipResult result = c_CLIP_FAIL; if (CLIP_X_LT_W(clipped)) result &= ~c_CLIP_LT_X; // X < W if (CLIP_X_GT_W(clipped)) result &= ~c_CLIP_GT_X; // X > -W if (CLIP_Y_LT_W(clipped)) result &= ~c_CLIP_LT_Y; // Y < W if (CLIP_Y_GT_W(clipped)) result &= ~c_CLIP_GT_Y; // Y > -W if (CLIP_Z_LT_W(clipped)) result &= ~c_CLIP_LT_Z; // Z < W if (CLIP_Z_GT_W(clipped)) result &= ~c_CLIP_GT_Z; // Z > -W return result; } inline std::size_t homogenous_clip_line(Vector4 clipped[2]) { const Vector4& p0 = clipped[0]; const Vector4& p1 = clipped[1]; // early out { ClipResult mask0 = homogenous_clip_point(clipped[0]); ClipResult mask1 = homogenous_clip_point(clipped[1]); if ((mask0 | mask1) == c_CLIP_PASS) // both points passed all planes { return 2; } if (mask0 & mask1) // both points failed any one plane { return 0; } } { const bool index = CLIP_X_LT_W(p0); if (index ^ CLIP_X_LT_W(p1)) { Vector4 clip(p1 - p0); double scale = (p0[0] - p0[3]) / (clip[3] - clip[0]); clip[0] = p0[0] + scale * clip[0]; clip[1] = p0[1] + scale * clip[1]; clip[2] = p0[2] + scale * clip[2]; clip[3] = p0[3] + scale * clip[3]; clipped[index] = clip; } else if(index == 0) { return 0; } } { const bool index = CLIP_X_GT_W(p0); if (index ^ CLIP_X_GT_W(p1)) { Vector4 clip(p1 - p0); double scale = (p0[0] + p0[3]) / (-clip[3] - clip[0]); clip[0] = p0[0] + scale * clip[0]; clip[1] = p0[1] + scale * clip[1]; clip[2] = p0[2] + scale * clip[2]; clip[3] = p0[3] + scale * clip[3]; clipped[index] = clip; } else if(index == 0) { return 0; } } { const bool index = CLIP_Y_LT_W(p0); if (index ^ CLIP_Y_LT_W(p1)) { Vector4 clip(p1 - p0); double scale = (p0[1] - p0[3]) / (clip[3] - clip[1]); clip[0] = p0[0] + scale * clip[0]; clip[1] = p0[1] + scale * clip[1]; clip[2] = p0[2] + scale * clip[2]; clip[3] = p0[3] + scale * clip[3]; clipped[index] = clip; } else if (index == 0) { return 0; } } { const bool index = CLIP_Y_GT_W(p0); if (index ^ CLIP_Y_GT_W(p1)) { Vector4 clip(p1 - p0); double scale = (p0[1] + p0[3]) / (-clip[3] - clip[1]); clip[0] = p0[0] + scale * clip[0]; clip[1] = p0[1] + scale * clip[1]; clip[2] = p0[2] + scale * clip[2]; clip[3] = p0[3] + scale * clip[3]; clipped[index] = clip; } else if (index == 0) { return 0; } } { const bool index = CLIP_Z_LT_W(p0); if (index ^ CLIP_Z_LT_W(p1)) { Vector4 clip(p1 - p0); double scale = (p0[2] - p0[3]) / (clip[3] - clip[2]); clip[0] = p0[0] + scale * clip[0]; clip[1] = p0[1] + scale * clip[1]; clip[2] = p0[2] + scale * clip[2]; clip[3] = p0[3] + scale * clip[3]; clipped[index] = clip; } else if (index == 0) { return 0; } } { const bool index = CLIP_Z_GT_W(p0); if (index ^ CLIP_Z_GT_W(p1)) { Vector4 clip(p1 - p0); double scale = (p0[2] + p0[3]) / (-clip[3] - clip[2]); clip[0] = p0[0] + scale * clip[0]; clip[1] = p0[1] + scale * clip[1]; clip[2] = p0[2] + scale * clip[2]; clip[3] = p0[3] + scale * clip[3]; clipped[index] = clip; } else if (index == 0) { return 0; } } return 2; } inline std::size_t homogenous_clip_triangle(Vector4 clipped[9]) { Vector4 buffer[9]; std::size_t count = 3; count = Vector4ClipPolygon< Vector4ClipLT >::apply(clipped, clipped + count, buffer, 0); count = Vector4ClipPolygon< Vector4ClipGT >::apply(buffer, buffer + count, clipped, 0); count = Vector4ClipPolygon< Vector4ClipLT >::apply(clipped, clipped + count, buffer, 1); count = Vector4ClipPolygon< Vector4ClipGT >::apply(buffer, buffer + count, clipped, 1); count = Vector4ClipPolygon< Vector4ClipLT >::apply(clipped, clipped + count, buffer, 2); return Vector4ClipPolygon< Vector4ClipGT >::apply(buffer, buffer + count, clipped, 2); } } // namespace ClipResult Matrix4::clipPoint(const Vector3& point, Vector4& clipped) const { clipped[0] = point[0]; clipped[1] = point[1]; clipped[2] = point[2]; clipped[3] = 1; clipped = transform(clipped); return homogenous_clip_point(clipped); } std::size_t Matrix4::clipTriangle(const Vector3& p0, const Vector3& p1, const Vector3& p2, Vector4 clipped[9]) const { clipped[0][0] = p0[0]; clipped[0][1] = p0[1]; clipped[0][2] = p0[2]; clipped[0][3] = 1; clipped[1][0] = p1[0]; clipped[1][1] = p1[1]; clipped[1][2] = p1[2]; clipped[1][3] = 1; clipped[2][0] = p2[0]; clipped[2][1] = p2[1]; clipped[2][2] = p2[2]; clipped[2][3] = 1; clipped[0] = transform(clipped[0]); clipped[1] = transform(clipped[1]); clipped[2] = transform(clipped[2]); return homogenous_clip_triangle(clipped); } std::size_t Matrix4::clipLine(const Vector3& p0, const Vector3& p1, Vector4 clipped[2]) const { clipped[0][0] = p0[0]; clipped[0][1] = p0[1]; clipped[0][2] = p0[2]; clipped[0][3] = 1; clipped[1][0] = p1[0]; clipped[1][1] = p1[1]; clipped[1][2] = p1[2]; clipped[1][3] = 1; clipped[0] = transform(clipped[0]); clipped[1] = transform(clipped[1]); return homogenous_clip_line(clipped); } DarkRadiant-2.0.2/libs/math/Matrix4.h000066400000000000000000001116761245424655700173140ustar00rootroot00000000000000#pragma once /// \file /// \brief Matrix data types and related operations. #include "math/Vector3.h" #include "math/Vector4.h" #include "math/pi.h" class Quaternion; typedef unsigned char ClipResult; const ClipResult c_CLIP_PASS = 0x00; // 000000 const ClipResult c_CLIP_LT_X = 0x01; // 000001 const ClipResult c_CLIP_GT_X = 0x02; // 000010 const ClipResult c_CLIP_LT_Y = 0x04; // 000100 const ClipResult c_CLIP_GT_Y = 0x08; // 001000 const ClipResult c_CLIP_LT_Z = 0x10; // 010000 const ClipResult c_CLIP_GT_Z = 0x20; // 100000 const ClipResult c_CLIP_FAIL = 0x3F; // 111111 /** * A 4x4 matrix stored in double-precision floating-point. * * The elements of this matrix are stored columnwise in memory: * * | 0 4 8 12 | * | 1 5 9 13 | * | 2 6 10 14 | * | 3 7 11 15 | * * or, alternatively, as the 4 columns are regarded as 4 vectors named x, y, z, t: * * | xx yx zx tx | * | xy yy zy ty | * | xz yz zz tz | * | xw yw zw tw | */ class Matrix4 { // Elements of the 4x4 matrix. These appear to be treated COLUMNWISE, i.e. // elements [0] through [3] are the first column, [4] through [7] are the // second column, etc. double _m[16]; private: // Initialising constructor, elements are passed in column-wise order Matrix4(double xx_, double xy_, double xz_, double xw_, double yx_, double yy_, double yz_, double yw_, double zx_, double zy_, double zz_, double zw_, double tx_, double ty_, double tz_, double tw_); public: /// Construct a matrix with uninitialised values. Matrix4() { } /* NAMED CONSTRUCTORS FOR SPECIFIC MATRICES */ /** * \brief * Obtain the identity matrix. */ static const Matrix4& getIdentity(); /** * \brief * Get a matrix representing the given 3D translation. * * @param translation * Vector3 representing the translation in 3D space. */ static Matrix4 getTranslation(const Vector3& translation); /** * greebo: Attempts to parse the rotation from the given string, which is * a whitespace-separated chain of nine floating point values, as used * in entity spawnargs. * * Example: "0 1 0 -1 0 0 0 0 1" * * Returns: the parsed (translation-free) matrix. In case of parser errors * the identity matrix is returned. */ static Matrix4 getRotation(const std::string& rotationString); /** * greebo: Returns the rotation matrix defined by two three-component * vectors. * The rotational axis is defined by the normalised cross product of those * two vectors, the angle can be retrieved from the dot product. */ static Matrix4 getRotation(const Vector3& a, const Vector3& b); /** * greebo: Returns the rotation matrix defined by an arbitrary axis * and an angle. * * Important: the axis vector must be normalised. */ static Matrix4 getRotation(const Vector3& axis, const double angle); /** * Constructs a pure-rotation matrix from the given quaternion. */ static Matrix4 getRotation(const Quaternion& quaternion); /** * Constructs a pure-rotation matrix from the given quaternion, quantised. */ static Matrix4 getRotationQuantised(const Quaternion& quaternion); /** * Constructs a pure-rotation matrix about the x axis from sin and cosine of an angle. */ static Matrix4 getRotationAboutXForSinCos(double s, double c); /** * Constructs a pure-rotation matrix about the x axis from an angle in radians */ static Matrix4 getRotationAboutX(double angle); /** * Constructs a pure-rotation matrix about the x axis from an angle in degrees. */ static Matrix4 getRotationAboutXDegrees(double angle); /** * Constructs a pure-rotation matrix about the y axis from sin and cosine of an angle. */ static Matrix4 getRotationAboutYForSinCos(double s, double c); /** * Constructs a pure-rotation matrix about the y axis from an angle in radians */ static Matrix4 getRotationAboutY(double angle); /** * Constructs a pure-rotation matrix about the y axis from an angle in degrees. */ static Matrix4 getRotationAboutYDegrees(double angle); /** * Constructs a pure-rotation matrix about the z axis from sin and cosine of an angle. */ static Matrix4 getRotationAboutZForSinCos(double s, double c); /** * Constructs a pure-rotation matrix about the z axis from an angle in radians */ static Matrix4 getRotationAboutZ(double angle); /** * Constructs a pure-rotation matrix about the z axis from an angle in degrees. */ static Matrix4 getRotationAboutZDegrees(double angle); /** * Constructs a pure-rotation matrix from a set of euler angles (radians) in the order (x, y, z). */ static Matrix4 getRotationForEulerXYZ(const Vector3& euler); /** * Constructs a pure-rotation matrix from a set of euler angles (degrees) in the order (x, y, z). */ static Matrix4 getRotationForEulerXYZDegrees(const Vector3& euler); /** * Constructs a pure-rotation matrix from a set of euler angles (radians) in the order (y, z, x). */ static Matrix4 getRotationForEulerYZX(const Vector3& euler); /** * Constructs a pure-rotation matrix from a set of euler angles (degrees) in the order (y, z, x). */ static Matrix4 getRotationForEulerYZXDegrees(const Vector3& euler); /** * Constructs a pure-rotation matrix from a set of euler angles (radians) in the order (x, z, y). */ static Matrix4 getRotationForEulerXZY(const Vector3& euler); /** * Constructs a pure-rotation matrix from a set of euler angles (degrees) in the order (x, z, y). */ static Matrix4 getRotationForEulerXZYDegrees(const Vector3& euler); /** * Constructs a pure-rotation matrix from a set of euler angles (radians) in the order (y, x, z). */ static Matrix4 getRotationForEulerYXZ(const Vector3& euler); /** * Constructs a pure-rotation matrix from a set of euler angles (degrees) in the order (y, x, z). */ static Matrix4 getRotationForEulerYXZDegrees(const Vector3& euler); /** * Constructs a pure-rotation matrix from a set of euler angles (radians) in the order (z, x, y). */ static Matrix4 getRotationForEulerZXY(const Vector3& euler); /** * Constructs a pure-rotation matrix from a set of euler angles (degrees) in the order (z, x, y). */ static Matrix4 getRotationForEulerZXYDegrees(const Vector3& euler); /** * Constructs a pure-rotation matrix from a set of euler angles (radians) in the order (z, y, x). */ static Matrix4 getRotationForEulerZYX(const Vector3& euler); /** * Constructs a pure-rotation matrix from a set of euler angles (degrees) in the order (z, y, x). */ static Matrix4 getRotationForEulerZYXDegrees(const Vector3& euler); /** * \brief * Get a matrix representing the given scale in 3D space. * * \param scale * Vector3 representing the scale. */ static Matrix4 getScale(const Vector3& scale); /** * Returns a perspective projection matrix for the six given frustum planes. The result is the projection * matrix as constructed by openGL when calling the glFrustum() function. */ static Matrix4 getProjectionForFrustum(double left, double right, double bottom, double top, double nearval, double farval); /** * \brief * Construct a matrix containing the given elements. * * The elements are specified column-wise, starting with the left-most * column. */ static Matrix4 byColumns(double xx, double xy, double xz, double xw, double yx, double yy, double yz, double yw, double zx, double zy, double zz, double zw, double tx, double ty, double tz, double tw); /** * \brief * Construct a matrix containing the given elements. * * The elements are specified row-wise, starting with the top row. */ static Matrix4 byRows(double xx, double yx, double zx, double tx, double xy, double yy, double zy, double ty, double xz, double yz, double zz, double tz, double xw, double yw, double zw, double tw); enum Handedness { RIGHTHANDED = 0, LEFTHANDED = 1, }; /** * Return matrix elements * \{ */ double& xx() { return _m[0]; } const double& xx() const { return _m[0]; } double& xy() { return _m[1]; } const double& xy() const { return _m[1]; } double& xz() { return _m[2]; } const double& xz() const { return _m[2]; } double& xw() { return _m[3]; } const double& xw() const { return _m[3]; } double& yx() { return _m[4]; } const double& yx() const { return _m[4]; } double& yy() { return _m[5]; } const double& yy() const { return _m[5]; } double& yz() { return _m[6]; } const double& yz() const { return _m[6]; } double& yw() { return _m[7]; } const double& yw() const { return _m[7]; } double& zx() { return _m[8]; } const double& zx() const { return _m[8]; } double& zy() { return _m[9]; } const double& zy() const { return _m[9]; } double& zz() { return _m[10]; } const double& zz() const { return _m[10]; } double& zw() { return _m[11]; } const double& zw() const { return _m[11]; } double& tx() { return _m[12]; } const double& tx() const { return _m[12]; } double& ty() { return _m[13]; } const double& ty() const { return _m[13]; } double& tz() { return _m[14]; } const double& tz() const { return _m[14]; } double& tw() { return _m[15]; } const double& tw() const { return _m[15]; } /** * \} */ /** * Return columns of the matrix as vectors. * \{ */ Vector4& x() { return reinterpret_cast(xx()); } const Vector4& x() const { return reinterpret_cast(xx()); } Vector4& y() { return reinterpret_cast(yx()); } const Vector4& y() const { return reinterpret_cast(yx()); } Vector4& z() { return reinterpret_cast(zx()); } const Vector4& z() const { return reinterpret_cast(zx()); } Vector4& t() { return reinterpret_cast(tx()); } const Vector4& t() const { return reinterpret_cast(tx()); } /** * \} */ /** * Cast to double* for use with GL functions that accept a double * array, also provides operator[]. */ operator double* () { return _m; } /** * Cast to const double* to provide operator[] for const objects. */ operator const double* () const { return _m; } /** * \brief * Transpose this matrix in-place. */ void transpose(); /** * \brief * Return a transposed copy of this matrix. */ Matrix4 getTransposed() const; /** * \brief * Return the affine inverse of this transformation matrix. */ Matrix4 getInverse() const; /** * Affine invert this matrix in-place. */ void invert(); /** * \brief * Return the full inverse of this matrix. */ Matrix4 getFullInverse() const; /** * Invert this matrix in-place. */ void invertFull(); /** * Returns the given 3-component point transformed by this matrix. */ template BasicVector3 transformPoint(const BasicVector3& point) const; /** * Returns the given 3-component direction transformed by this matrix. * The given vector is treated as direction so it won't receive a translation, just like * a 4-component vector with its w-component set to 0 would be transformed. */ template BasicVector3 transformDirection(const BasicVector3& direction) const; /** * \brief * Use this matrix to transform the provided vector and return a new vector * containing the result. * * \param vector4 * The 4-element vector to transform. */ template BasicVector4 transform(const BasicVector4& vector4) const; /** * \brief * Return the result of this matrix post-multiplied by another matrix. */ Matrix4 getMultipliedBy(const Matrix4& other) const; /** * \brief * Post-multiply this matrix by another matrix, in-place. */ void multiplyBy(const Matrix4& other); /** * Returns this matrix pre-multiplied by the other */ Matrix4 getPremultipliedBy(const Matrix4& other) const; /** * Pre-multiplies this matrix by other in-place. */ void premultiplyBy(const Matrix4& other); /** * \brief * Add a translation component to the transformation represented by this * matrix. * * Equivalent to multiplyBy(Matrix4::getTranslation(translation)); */ void translateBy(const Vector3& translation); /** * \brief * Add a translation component to the transformation represented by this * matrix. * * Equivalent to getMultipliedBy(Matrix4::getTranslation(translation)); */ Matrix4 getTranslatedBy(const Vector3& translation) const; /** * Returns this matrix concatenated with the rotation transform produced by the given quat. * The concatenated rotation occurs before the transformation of this matrix. * * Equivalent to getMultipliedBy(getRotation(rotation)); */ Matrix4 getRotatedBy(const Quaternion& rotation) const; /** * Concatenates this matrix with the rotation transform produced by the given quat. * The concatenated rotation occurs before the transformation of this matrix. */ void rotateBy(const Quaternion& rotation); /** * Concatenates this matrix with the pivoted rotation transform produced by the given quat. * The concatenated rotation occurs before the transformation of this matrix. */ void rotateBy(const Quaternion& rotation, const Vector3& pivot); /** * \brief * Add a scale component to the transformation represented by this matrix. * * Equivalent to multiplyBy(Matrix4::getScale(scale)); */ void scaleBy(const Vector3& scale); /** * \brief * Add a pivoted scale transformation to this matrix. */ void scaleBy(const Vector3& scale, const Vector3& pivot); /** * Equality operator, Returns true if this and the other are exactly element-wise equal. */ bool operator==(const Matrix4& other) const; /** * Inequality operator. */ bool operator!=(const Matrix4& other) const; /** * Returns true if self and other are element-wise equal within epsilon. */ bool isEqual(const Matrix4& other, double epsilon) const; /** * Returns true if this and the given matrix are exactly element-wise equal. * This and the other matrix must be affine. */ bool isAffineEqual(const Matrix4& other) const; /** * Returns RIGHTHANDED if this is right-handed, else returns LEFTHANDED. */ Handedness getHandedness() const; /** * Returns true if this matrix is affine. */ bool isAffine() const; /** * Returns this matrix post-multiplied by the other. * This and the other matrix must be affine. */ Matrix4 getAffineMultipliedBy(const Matrix4& other) const; /** * Post-multiplies this matrix by the other in-place. * This and the other matrix must be affine. */ void affineMultiplyBy(const Matrix4& other); /** * Returns this matrix pre-multiplied by the other. * This matrix and the other must be affine. */ Matrix4 getAffinePremultipliedBy(const Matrix4& other) const; /** * Pre-multiplies this matrix by the other in-place. * This and the other matrix must be affine. */ void affinePremultiplyBy(const Matrix4& other); /** * Returns the determinant of this 4x4 matrix */ double getDeterminant() const; /// Return the 3-element translation component of this matrix const Vector3& translation() const; /** * Concatenates this with the rotation transform produced * by euler angles (degrees) in the order (x, y, z). * The concatenated rotation occurs before self. */ void rotateByEulerXYZDegrees(const Vector3& euler); /** * Concatenates this with the pivoted rotation transform produced * by euler angles (degrees) in the order (x, y, z). * The concatenated rotation occurs before self. */ void rotateByEulerXYZDegrees(const Vector3& euler, const Vector3& pivot); /** * Returns this matrix concatenated with the rotation transform produced by the given * euler angles (degrees) in the order (y, x, z). The concatenated rotation occurs before this matrix. */ Matrix4 getRotatedByEulerYXZDegrees(const Vector3& euler) const; /** * Concatenates this with the rotation transform produced * by euler angles (degrees) in the order (y, x, z). * The concatenated rotation occurs before self. */ void rotateByEulerYXZDegrees(const Vector3& euler); /** * Returns this matrix concatenated with the rotation transform produced by the given * euler angles (degrees) in the order (z, x, y). The concatenated rotation occurs before this matrix. */ Matrix4 getRotatedByEulerZXYDegrees(const Vector3& euler) const; /** * Concatenates this with the rotation transform produced * by euler angles (degrees) in the order (z, x, y). * The concatenated rotation occurs before self. */ void rotateByEulerZXYDegrees(const Vector3& euler); /** * Calculates and returns a set of euler angles in radians that produce * the rotation component of this matrix when applied in the order (x, y, z). * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. */ Vector3 getEulerAnglesXYZ() const; /** * Calculates and returns a set of euler angles in degrees that produce * the rotation component of this matrix when applied in the order (x, y, z). * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. */ Vector3 getEulerAnglesXYZDegrees() const; /** * Calculates and returns a set of euler angles in radians that produce * the rotation component of this matrix when applied in the order (y, x, z). * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. */ Vector3 getEulerAnglesYXZ() const; /** * Calculates and returns a set of euler angles in degrees that produce * the rotation component of this matrix when applied in the order (y, x, z). * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. */ Vector3 getEulerAnglesYXZDegrees() const; /** * Calculates and returns a set of euler angles in radians that produce * the rotation component of this matrix when applied in the order (z, x, y). * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. */ Vector3 getEulerAnglesZXY() const; /** * Calculates and returns a set of euler angles in degrees that produce * the rotation component of this matrix when applied in the order (z, x, y). * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. */ Vector3 getEulerAnglesZXYDegrees() const; /** * Calculates and returns a set of euler angles in radians that produce * the rotation component of this matrix when applied in the order (z, y, x). * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. */ Vector3 getEulerAnglesZYX() const; /** * Calculates and returns a set of euler angles in degrees that produce * the rotation component of this matrix when applied in the order (z, y, x). * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. */ Vector3 getEulerAnglesZYXDegrees() const; /** * Calculates and returns the (x, y, z) scale values that produce the scale component of this matrix. * This matrix must be affine and orthogonal to produce a meaningful result. */ Vector3 getScale() const; /** * Transforms and clips the line formed by p0, p1 by this canonical matrix. * Stores the resulting line in clipped. * * @returns: the number of points in the resulting line. */ std::size_t clipLine(const Vector3& p0, const Vector3& p1, Vector4 clipped[2]) const; /** * Clips point by this canonical matrix and stores the result in clipped. * Returns a bitmask indicating which clip-planes the point was outside. */ ClipResult clipPoint(const Vector3& point, Vector4& clipped) const; /** * Transforms and clips the triangle formed by p0, p1, p2 by this canonical matrix. * Stores the resulting polygon in clipped. * Returns the number of points in the resulting polygon. */ std::size_t clipTriangle(const Vector3& p0, const Vector3& p1, const Vector3& p2, Vector4 clipped[9]) const; }; // ========================================================================================= // Inlined member definitions // ========================================================================================= // Construct a matrix with given column elements inline Matrix4 Matrix4::byColumns(double xx, double xy, double xz, double xw, double yx, double yy, double yz, double yw, double zx, double zy, double zz, double zw, double tx, double ty, double tz, double tw) { return Matrix4(xx, xy, xz, xw, yx, yy, yz, yw, zx, zy, zz, zw, tx, ty, tz, tw); } // Construct a matrix with given row elements inline Matrix4 Matrix4::byRows(double xx, double yx, double zx, double tx, double xy, double yy, double zy, double ty, double xz, double yz, double zz, double tz, double xw, double yw, double zw, double tw) { return Matrix4(xx, xy, xz, xw, yx, yy, yz, yw, zx, zy, zz, zw, tx, ty, tz, tw); } // Post-multiply this with other inline Matrix4 Matrix4::getMultipliedBy(const Matrix4& other) const { return Matrix4::byColumns( other[0] * _m[0] + other[1] * _m[4] + other[2] * _m[8] + other[3] * _m[12], other[0] * _m[1] + other[1] * _m[5] + other[2] * _m[9] + other[3] * _m[13], other[0] * _m[2] + other[1] * _m[6] + other[2] * _m[10]+ other[3] * _m[14], other[0] * _m[3] + other[1] * _m[7] + other[2] * _m[11]+ other[3] * _m[15], other[4] * _m[0] + other[5] * _m[4] + other[6] * _m[8] + other[7] * _m[12], other[4] * _m[1] + other[5] * _m[5] + other[6] * _m[9] + other[7] * _m[13], other[4] * _m[2] + other[5] * _m[6] + other[6] * _m[10]+ other[7] * _m[14], other[4] * _m[3] + other[5] * _m[7] + other[6] * _m[11]+ other[7] * _m[15], other[8] * _m[0] + other[9] * _m[4] + other[10]* _m[8] + other[11]* _m[12], other[8] * _m[1] + other[9] * _m[5] + other[10]* _m[9] + other[11]* _m[13], other[8] * _m[2] + other[9] * _m[6] + other[10]* _m[10]+ other[11]* _m[14], other[8] * _m[3] + other[9] * _m[7] + other[10]* _m[11]+ other[11]* _m[15], other[12]* _m[0] + other[13]* _m[4] + other[14]* _m[8] + other[15]* _m[12], other[12]* _m[1] + other[13]* _m[5] + other[14]* _m[9] + other[15]* _m[13], other[12]* _m[2] + other[13]* _m[6] + other[14]* _m[10]+ other[15]* _m[14], other[12]* _m[3] + other[13]* _m[7] + other[14]* _m[11]+ other[15]* _m[15] ); } inline Matrix4 Matrix4::getPremultipliedBy(const Matrix4& other) const { return other.getMultipliedBy(*this); } inline Matrix4 Matrix4::getRotationAboutX(double angle) { return getRotationAboutXForSinCos(sin(angle), cos(angle)); } inline Matrix4 Matrix4::getRotationAboutXDegrees(double angle) { return getRotationAboutX(degrees_to_radians(angle)); } inline Matrix4 Matrix4::getRotationAboutY(double angle) { return getRotationAboutYForSinCos(sin(angle), cos(angle)); } inline Matrix4 Matrix4::getRotationAboutYDegrees(double angle) { return getRotationAboutY(degrees_to_radians(angle)); } inline Matrix4 Matrix4::getRotationAboutZ(double angle) { return getRotationAboutZForSinCos(sin(angle), cos(angle)); } inline Matrix4 Matrix4::getRotationAboutZDegrees(double angle) { return getRotationAboutZ(degrees_to_radians(angle)); } inline Matrix4 Matrix4::getProjectionForFrustum(double left, double right, double bottom, double top, double nearval, double farval) { return Matrix4::byColumns( (2*nearval) / (right-left), 0, 0, 0, 0, (2*nearval) / (top-bottom), 0, 0, (right+left) / (right-left), (top+bottom) / (top-bottom), -(farval+nearval) / (farval-nearval), -1, 0, 0, -(2*farval*nearval) / (farval-nearval), 0 ); } inline bool Matrix4::operator==(const Matrix4& other) const { return xx() == other.xx() && xy() == other.xy() && xz() == other.xz() && xw() == other.xw() && yx() == other.yx() && yy() == other.yy() && yz() == other.yz() && yw() == other.yw() && zx() == other.zx() && zy() == other.zy() && zz() == other.zz() && zw() == other.zw() && tx() == other.tx() && ty() == other.ty() && tz() == other.tz() && tw() == other.tw(); } inline bool Matrix4::operator!=(const Matrix4& other) const { return !operator==(other); } inline bool Matrix4::isEqual(const Matrix4& other, double epsilon) const { return float_equal_epsilon(xx(), other.xx(), epsilon) && float_equal_epsilon(xy(), other.xy(), epsilon) && float_equal_epsilon(xz(), other.xz(), epsilon) && float_equal_epsilon(xw(), other.xw(), epsilon) && float_equal_epsilon(yx(), other.yx(), epsilon) && float_equal_epsilon(yy(), other.yy(), epsilon) && float_equal_epsilon(yz(), other.yz(), epsilon) && float_equal_epsilon(yw(), other.yw(), epsilon) && float_equal_epsilon(zx(), other.zx(), epsilon) && float_equal_epsilon(zy(), other.zy(), epsilon) && float_equal_epsilon(zz(), other.zz(), epsilon) && float_equal_epsilon(zw(), other.zw(), epsilon) && float_equal_epsilon(tx(), other.tx(), epsilon) && float_equal_epsilon(ty(), other.ty(), epsilon) && float_equal_epsilon(tz(), other.tz(), epsilon) && float_equal_epsilon(tw(), other.tw(), epsilon); } inline bool Matrix4::isAffineEqual(const Matrix4& other) const { return xx() == other.xx() && xy() == other.xy() && xz() == other.xz() && yx() == other.yx() && yy() == other.yy() && yz() == other.yz() && zx() == other.zx() && zy() == other.zy() && zz() == other.zz() && tx() == other.tx() && ty() == other.ty() && tz() == other.tz(); } inline Matrix4::Handedness Matrix4::getHandedness() const { return (x().getVector3().crossProduct(y().getVector3()).dot(z().getVector3()) < 0.0f) ? LEFTHANDED : RIGHTHANDED; } inline void Matrix4::premultiplyBy(const Matrix4& other) { *this = getPremultipliedBy(other); } inline bool Matrix4::isAffine() const { return xw() == 0 && yw() == 0 && zw() == 0 && tw() == 1; } inline Matrix4 Matrix4::getAffineMultipliedBy(const Matrix4& other) const { return Matrix4::byColumns( other.xx() * xx() + other.xy() * yx() + other.xz() * zx(), other.xx() * xy() + other.xy() * yy() + other.xz() * zy(), other.xx() * xz() + other.xy() * yz() + other.xz() * zz(), 0, other.yx() * xx() + other.yy() * yx() + other.yz() * zx(), other.yx() * xy() + other.yy() * yy() + other.yz() * zy(), other.yx() * xz() + other.yy() * yz() + other.yz() * zz(), 0, other.zx() * xx() + other.zy() * yx() + other.zz()* zx(), other.zx() * xy() + other.zy() * yy() + other.zz()* zy(), other.zx() * xz() + other.zy() * yz() + other.zz()* zz(), 0, other.tx()* xx() + other.ty()* yx() + other.tz()* zx() + tx(), other.tx()* xy() + other.ty()* yy() + other.tz()* zy() + ty(), other.tx()* xz() + other.ty()* yz() + other.tz()* zz()+ tz(), 1 ); } inline void Matrix4::affineMultiplyBy(const Matrix4& other) { *this = getAffineMultipliedBy(other); } inline Matrix4 Matrix4::getAffinePremultipliedBy(const Matrix4& other) const { return other.getAffineMultipliedBy(*this); } inline void Matrix4::affinePremultiplyBy(const Matrix4& other) { *this = getAffinePremultipliedBy(other); } template BasicVector3 Matrix4::transformPoint(const BasicVector3& point) const { return BasicVector3( static_cast(xx() * point[0] + yx() * point[1] + zx() * point[2] + tx()), static_cast(xy() * point[0] + yy() * point[1] + zy() * point[2] + ty()), static_cast(xz() * point[0] + yz() * point[1] + zz() * point[2] + tz()) ); } template BasicVector3 Matrix4::transformDirection(const BasicVector3& direction) const { return BasicVector3( static_cast(xx() * direction[0] + yx() * direction[1] + zx() * direction[2]), static_cast(xy() * direction[0] + yy() * direction[1] + zy() * direction[2]), static_cast(xz() * direction[0] + yz() * direction[1] + zz() * direction[2]) ); } template BasicVector4 Matrix4::transform(const BasicVector4& vector4) const { return BasicVector4( static_cast(_m[0] * vector4[0] + _m[4] * vector4[1] + _m[8] * vector4[2] + _m[12] * vector4[3]), static_cast(_m[1] * vector4[0] + _m[5] * vector4[1] + _m[9] * vector4[2] + _m[13] * vector4[3]), static_cast(_m[2] * vector4[0] + _m[6] * vector4[1] + _m[10] * vector4[2] + _m[14] * vector4[3]), static_cast(_m[3] * vector4[0] + _m[7] * vector4[1] + _m[11] * vector4[2] + _m[15] * vector4[3]) ); } inline void Matrix4::invert() { *this = getInverse(); } inline void Matrix4::invertFull() { *this = getFullInverse(); } inline double Matrix4::getDeterminant() const { // greebo: This is following Laplace's formula by expanding it along the first column // It needs a couple of 2x2 minors (which are re-used two times each) and four 3x3 minors // The expanded formula is like this: det A = a11*M11 - a21*M21 + a31*M31 + a41*M41 // where aij is a matrix element, and Mij is the minor leaving out the i-th row and j-th column // Six 2x2 minors, each is used two times double minor1 = zz() * tw() - zw() * tz(); double minor2 = zy() * tw() - zw() * ty(); double minor3 = zx() * tw() - zw() * tx(); double minor4 = zy() * tz() - zz() * ty(); double minor5 = zx() * tz() - zz() * tx(); double minor6 = zx() * ty() - zy() * tx(); // Four 3x3 minors double minor11 = yy() * minor1 - yz() * minor2 + yw() * minor4; double minor21 = yx() * minor1 - yz() * minor3 + yw() * minor5; double minor31 = yx() * minor2 - yy() * minor3 + yw() * minor6; double minor41 = yx() * minor4 - yy() * minor5 + yz() * minor6; // Assemble and return final determinant return xx() * minor11 - xy() * minor21 + xz() * minor31 - xw() * minor41; } inline const Vector3& Matrix4::translation() const { return t().getVector3(); } inline Matrix4 Matrix4::getTranslatedBy(const Vector3& translation) const { return getMultipliedBy(Matrix4::getTranslation(translation)); } inline Matrix4 Matrix4::getRotatedBy(const Quaternion& rotation) const { return getMultipliedBy(getRotation(rotation)); } inline void Matrix4::rotateBy(const Quaternion& rotation) { *this = getRotatedBy(rotation); } inline void Matrix4::rotateBy(const Quaternion& rotation, const Vector3& pivot) { translateBy(pivot); rotateBy(rotation); translateBy(-pivot); } inline void Matrix4::rotateByEulerXYZDegrees(const Vector3& euler) { multiplyBy(getRotationForEulerXYZDegrees(euler)); } inline void Matrix4::rotateByEulerXYZDegrees(const Vector3& euler, const Vector3& pivot) { translateBy(pivot); rotateByEulerXYZDegrees(euler); translateBy(-pivot); } inline Matrix4 Matrix4::getRotatedByEulerYXZDegrees(const Vector3& euler) const { return getMultipliedBy(getRotationForEulerYXZDegrees(euler)); } /// \brief Concatenates \p self with the rotation transform produced by \p euler angles (degrees) in the order (y, x, z). /// The concatenated rotation occurs before \p self. inline void Matrix4::rotateByEulerYXZDegrees(const Vector3& euler) { *this = getRotatedByEulerYXZDegrees(euler); } inline Matrix4 Matrix4::getRotatedByEulerZXYDegrees(const Vector3& euler) const { return getMultipliedBy(getRotationForEulerZXYDegrees(euler)); } inline void Matrix4::rotateByEulerZXYDegrees(const Vector3& euler) { *this = getRotatedByEulerZXYDegrees(euler); } inline Vector3 Matrix4::getEulerAnglesXYZ() const { double a = asin(-xz()); double ca = cos(a); if (fabs(ca) > 0.005f) // Gimbal lock? { return Vector3( atan2(yz() / ca, zz() / ca), a, atan2(xy() / ca, xx() / ca) ); } else // Gimbal lock has occurred { return Vector3( atan2(-zy(), yy()), a, 0 ); } } inline Vector3 Matrix4::getEulerAnglesXYZDegrees() const { Vector3 eulerRad = getEulerAnglesXYZ(); return Vector3(radians_to_degrees(eulerRad.x()), radians_to_degrees(eulerRad.y()), radians_to_degrees(eulerRad.z())); } inline Vector3 Matrix4::getEulerAnglesYXZ() const { double a = asin(yz()); double ca = cos(a); if (fabs(ca) > 0.005f) // Gimbal lock? { return Vector3( a, atan2(-xz() / ca, zz() / ca), atan2(-yx() / ca, yy() / ca) ); } else // Gimbal lock has occurred { return Vector3( a, atan2(zx(), xx()), 0 ); } } inline Vector3 Matrix4::getEulerAnglesYXZDegrees() const { Vector3 eulerRad = getEulerAnglesYXZ(); return Vector3(radians_to_degrees(eulerRad.x()), radians_to_degrees(eulerRad.y()), radians_to_degrees(eulerRad.z())); } inline Vector3 Matrix4::getEulerAnglesZXY() const { double a = asin(-zy()); double ca = cos(a); if (fabs(ca) > 0.005f) // Gimbal lock? { return Vector3( a, atan2(zx() / ca, zz() / ca), atan2(xy() / ca, yy()/ ca) ); } else // Gimbal lock has occurred { return Vector3( a, 0, atan2(-yx(), xx()) ); } } inline Vector3 Matrix4::getEulerAnglesZXYDegrees() const { Vector3 eulerRad = getEulerAnglesZXY(); return Vector3(radians_to_degrees(eulerRad.x()), radians_to_degrees(eulerRad.y()), radians_to_degrees(eulerRad.z())); } inline Vector3 Matrix4::getEulerAnglesZYX() const { double a = asin(zx()); double ca = cos(a); if (fabs(ca) > 0.005f) // Gimbal lock? { return Vector3( atan2(-zy() / ca, zz()/ ca), a, atan2(-yx() / ca, xx() / ca) ); } else // Gimbal lock has occurred { return Vector3( 0, a, atan2(xy(), yy()) ); } } inline Vector3 Matrix4::getEulerAnglesZYXDegrees() const { Vector3 eulerRad = getEulerAnglesZYX(); return Vector3(radians_to_degrees(eulerRad.x()), radians_to_degrees(eulerRad.y()), radians_to_degrees(eulerRad.z())); } inline Vector3 Matrix4::getScale() const { return Vector3( x().getVector3().getLength(), y().getVector3().getLength(), z().getVector3().getLength() ); } inline void Matrix4::scaleBy(const Vector3& scale, const Vector3& pivot) { translateBy(pivot); scaleBy(scale); translateBy(-pivot); } /** Stream insertion operator for Matrix4. */ inline std::ostream& operator<<(std::ostream& st, const Matrix4& m) { st << "|" << m[0] << ", " << m[4] << ", " << m[8] << ", " << m[12] << "|\n"; st << "|" << m[1] << ", " << m[5] << ", " << m[9] << ", " << m[13] << "|\n"; st << "|" << m[2] << ", " << m[6] << ", " << m[10] << ", " << m[14] << "|\n"; st << "|" << m[3] << ", " << m[7] << ", " << m[11] << ", " << m[15] << "|\n"; return st; } DarkRadiant-2.0.2/libs/math/Plane3.cpp000066400000000000000000000022351245424655700174270ustar00rootroot00000000000000#include "Plane3.h" #include "AABB.h" #include "Matrix4.h" double Plane3::distanceToOrientedExtents(const Vector3& extents, const Matrix4& orientation) const { return fabs(extents[0] * normal().dot(orientation.x().getVector3())) + fabs(extents[1] * normal().dot(orientation.y().getVector3())) + fabs(extents[2] * normal().dot(orientation.z().getVector3())); } bool Plane3::containsAABB(const AABB& aabb, const Matrix4& orientation) const { double dot = distanceToPoint(aabb.origin); return !(dot > 0 || -dot < distanceToOrientedExtents(aabb.extents, orientation)); } void Plane3::translate(const Vector3& translation) { _dist = _dist - ( translation.x() * _normal.x() + translation.y() * _normal.y() + translation.z() * _normal.z()); } Plane3& Plane3::transform(const Matrix4& m) { _normal = m.transformDirection(_normal); _dist = _normal.x() * (_dist * _normal.x() - m.tx()) + _normal.y() * (_dist * _normal.y() - m.ty()) + _normal.z() * (_dist * _normal.z() - m.tz()); return *this; } Plane3 Plane3::transformed(const Matrix4& m) const { return Plane3(*this).transform(m); } DarkRadiant-2.0.2/libs/math/Plane3.h000066400000000000000000000176171245424655700171060ustar00rootroot00000000000000#pragma once /* greebo: A plane in 3D space can be represented by a point and a normal vector. * * It is sufficient to specify four numbers to fully describe the plane: the three * components of the normal vector (x,y,z) and the dot product of the normal and any point of this plane. * * There are several constructors available: one requires all four number be passed directly, * the second requires the normal vector and the distance to be passed, the third and fourth * requires a set of three points that define the plane. * * Note: the plane numbers are stored in double precision. * Note: the constructor requiring three points does NOT check if two or more points are equal. * Note: two planes are considered equal when the difference of their normals and distances are below an epsilon. * * Note about the stored values: in contrast to the Doom 3 Engine sources where the idPlane object * stores 4 floating point values a, b, c, d as in the plane equation a*x + b*y + c*z + d = 0, * DarkRadiant's Plane3 class stores the normal vector and the actual distance value, which is -d. * The Plane3::dist() method returns the same value as idPlane3::Dist(), just beware when using the dist * member variable in any of Plane3 backends. */ #include "FloatTools.h" #include "Vector3.h" class Matrix4; class AABB; namespace { // Some constants for "equality" check. const double EPSILON_NORMAL = 0.0001f; const double EPSILON_DIST = 0.02f; } class Plane3 { Vector3 _normal; // normal vector (a, b, c) double _dist; // distance (-d) public: // Constructor with no arguments Plane3() {} // Constructor which expects four numbers, the first three are the components of the normal vector. Plane3(double nx, double ny, double nz, double dist) : _normal(nx, ny, nz), _dist(dist) {} // Construct a plane from any BasicVector3 and the distance template Plane3(const BasicVector3& normal, double dist) : _normal(normal), _dist(dist) {} // Construct a plane from three points , and template Plane3(const BasicVector3& p0, const BasicVector3& p1, const BasicVector3& p2) : _normal((p1 - p0).crossProduct(p2 - p0).getNormalised()), _dist(p0.dot(_normal)) {} // Construct a plane from three points (same as above, just with an array as argument template Plane3(const BasicVector3 points[3]) : _normal((points[1] - points[0]).crossProduct(points[2] - points[0]).getNormalised()), _dist(points[0].dot(_normal)) {} // The negation operator for this plane - the normal vector components and the distance are negated Plane3 operator- () const { return Plane3(-_normal, -_dist); } /** * greebo: Note that planes are considered equal if their normal vectors and * distances don't differ more than an epsilon value. */ bool operator== (const Plane3& other) const { return _normal.isEqual(other._normal, EPSILON_NORMAL) && float_equal_epsilon(_dist, other._dist, EPSILON_DIST); } // Subtracts plane equations: the returned plane is (a1-a2)*x + (b1-b2)*y + (c1-c2)*z + (d1-d2) = 0 Plane3 operator-(const Plane3& other) const { return Plane3(_normal[0] - other._normal[0], _normal[1] - other._normal[1], _normal[2] - other._normal[2], _dist - other._dist); } // Returns the normal vector of this plane Vector3& normal() { return _normal; } const Vector3& normal() const { return _normal; } // Returns the distance of the plane (where the plane intersects the z-axis) double& dist() { return _dist; } const double& dist() const { return _dist; } /* greebo: This normalises the plane by turning the normal vector into a unit vector (dividing it by its length) * and scaling the distance down by the same amount */ Plane3 getNormalised() const { double rmagnitudeInv = 1 / _normal.getLength(); return Plane3(_normal * rmagnitudeInv, _dist * rmagnitudeInv); } // Normalises this Plane3 object in-place void normalise() { double rmagnitudeInv = 1 / _normal.getLength(); _normal *= rmagnitudeInv; _dist *= rmagnitudeInv; } /// Reverses this plane, by negating all components void reverse() { _normal = -_normal; _dist = -_dist; } /// Translate this plane, leaving the normal vector untouched void translate(const Vector3& translation); /** * \brief * Transform this plane by an arbitrary matrix * * \return * A reference to *this. */ Plane3& transform(const Matrix4& matrix); /// Return a copy of this plane transformed with the given matrix Plane3 transformed(const Matrix4& matrix) const; // Checks if the floats of this plane are valid, returns true if this is the case bool isValid() const { return float_equal_epsilon(_normal.dot(_normal), 1.0, 0.01); } /* greebo: Use this to calculate the projection of a onto this plane. * * @returns: the Vector3 pointing to the point on the plane with the shortest * distance from the passed */ Vector3 getProjection(const Vector3& pointToProject) const { // Get the normal vector of this plane and normalise it Vector3 n = _normal.getNormalised(); // Retrieve a point of the plane Vector3 planePoint = n*_dist; // Calculate the projection and return it return pointToProject + planePoint - n*pointToProject.dot(n); } /** greebo: Returns the signed distance to the given point. */ double distanceToPoint(const Vector3& point) const { return point.dot(_normal) - _dist; } /** * Returns true if the given point is on the negative side of this plane (which is the * opposite side as the plane's normal vector is). */ bool testPoint(const Vector3& point) const { return point.dot(_normal) + _dist <= 0; } /* greebo: This calculates the intersection point of three planes. * Returns <0,0,0> if no intersection point could be found, otherwise returns the coordinates of the intersection point * (this may also be 0,0,0) */ static Vector3 intersect(const Plane3& plane1, const Plane3& plane2, const Plane3& plane3) { const Vector3& n1 = plane1.normal(); const Vector3& n2 = plane2.normal(); const Vector3& n3 = plane3.normal(); Vector3 n1n2 = n1.crossProduct(n2); Vector3 n2n3 = n2.crossProduct(n3); Vector3 n3n1 = n3.crossProduct(n1); double denom = n1.dot(n2n3); // Check if the denominator is zero (which would mean that no intersection is to be found if (denom != 0) { return (n2n3*plane1.dist() + n3n1*plane2.dist() + n1n2*plane3.dist()) / denom; } else { // No intersection could be found, return <0,0,0> return Vector3(0,0,0); } } double distanceToOrientedExtents(const Vector3& extents, const Matrix4& orientation) const; /** * Return false if the given AABB with the given orientation is partially or completely outside this plane. */ bool containsAABB(const AABB& aabb, const Matrix4& orientation) const; }; // class Plane3 /** * \brief * Stream insertion operator for a plane. */ inline std::ostream& operator<< (std::ostream& os, const Plane3& plane) { os << "Plane3 { " << plane.normal().x() << "x + " << plane.normal().y() << "y + " << plane.normal().z() << "z = " << plane.dist() << " }"; return os; } DarkRadiant-2.0.2/libs/math/Quaternion.cpp000066400000000000000000000024471245424655700204370ustar00rootroot00000000000000#include "Quaternion.h" #include "Matrix4.h" Quaternion Quaternion::createForMatrix(const Matrix4& matrix4) { Matrix4 transposed = matrix4.getTransposed(); double trace = transposed[0] + transposed[5] + transposed[10] + 1.0; if (trace > 0.0001) { double S = 0.5 / sqrt(trace); return Quaternion( (transposed[9] - transposed[6]) * S, (transposed[2] - transposed[8]) * S, (transposed[4] - transposed[1]) * S, 0.25f / S ); } if (transposed[0] >= transposed[5] && transposed[0] >= transposed[10]) { double S = 2.0 * sqrt(1.0 + transposed[0] - transposed[5] - transposed[10]); return Quaternion( 0.25 / S, (transposed[1] + transposed[4]) / S, (transposed[2] + transposed[8]) / S, (transposed[6] + transposed[9]) / S ); } if (transposed[5] >= transposed[0] && transposed[5] >= transposed[10]) { double S = 2.0 * sqrt(1.0 + transposed[5] - transposed[0] - transposed[10]); return Quaternion( (transposed[1] + transposed[4]) / S, 0.25 / S, (transposed[6] + transposed[9]) / S, (transposed[2] + transposed[8]) / S ); } double S = 2.0 * sqrt(1.0 + transposed[10] - transposed[0] - transposed[5]); return Quaternion( (transposed[2] + transposed[8]) / S, (transposed[6] + transposed[9]) / S, 0.25 / S, (transposed[1] + transposed[4]) / S ); } DarkRadiant-2.0.2/libs/math/Quaternion.h000066400000000000000000000135631245424655700201050ustar00rootroot00000000000000#pragma once /// \file /// \brief Quaternion data types and related operations. #include "Vector3.h" #include "Vector4.h" // Forward declaration, include Matrix4.h for definition class Matrix4; /// \brief A quaternion stored in single-precision floating-point. class Quaternion : public Vector4 { public: Quaternion() : Vector4() {} Quaternion(const Vector4& vector) : Vector4(vector) {} // Construct a Quaternion out of the 4 arguments Quaternion(ElementType x_, ElementType y_, ElementType z_, ElementType w_) : Vector4(x_, y_, z_, w_) {} // Construct a Quaternion out of a Vector3 plus a fourth argument Quaternion(const Vector3& other, ElementType w_) : Vector4(other, w_) {} /** * Returns the identity quaternion (named constructor) */ static const Quaternion& Identity(); /** * Constructs a quaternion which rotates between two points on the unit-sphere (from and to). */ static Quaternion createForUnitVectors(const Vector3& from, const Vector3& to); /** * Constructs a rotation quaternion for the given euler angles. * Each component of the given vector refers to an angle (in degrees) * of one of the x-/y-/z-axis. */ static Quaternion createForEulerXYZDegrees(const Vector3& eulerXYZ); /** * Constructs a quat for the given axis and angle */ static Quaternion createForAxisAngle(const Vector3& axis, double angle); /** * Constructs a rotation quaternion about a given axis. */ static Quaternion createForX(double angle); static Quaternion createForY(double angle); static Quaternion createForZ(double angle); /** * Retrieves the quaternion from the given matrix. */ static Quaternion createForMatrix(const Matrix4& matrix4); /** * Returns this quaternion multiplied by the other one. */ Quaternion getMultipliedBy(const Quaternion& other) const; /** * Multiplies this quaternion by the other one in place. * Equivalent to: *this = getMultipliedBy(other); */ void multiplyBy(const Quaternion& other); /** * Multiplies this quaternion by the other one in place. * Equivalent to: *this = other.getMultipliedBy(*this); */ void preMultiplyBy(const Quaternion& other); /** * Returns the inverse of this quaternion. */ Quaternion getInverse() const; /** * Conjugates/inverts this quaternion in place. */ void conjugate(); /** * Returns a normalised copy of this quaternion. */ Quaternion getNormalised() const; /** * Normalise this quaternion in-place. */ void normalise(); /** * Returns the given point as transformed by this quaternion */ Vector3 transformPoint(const Vector3& point) const; }; inline const Quaternion& Quaternion::Identity() { static Quaternion _identity(0, 0, 0, 1); return _identity; } inline Quaternion Quaternion::createForUnitVectors(const Vector3& from, const Vector3& to) { return Quaternion(from.crossProduct(to), from.dot(to)); } inline Quaternion Quaternion::createForEulerXYZDegrees(const Vector3& eulerXYZ) { double cx = cos(degrees_to_radians(eulerXYZ[0] * 0.5f)); double sx = sin(degrees_to_radians(eulerXYZ[0] * 0.5f)); double cy = cos(degrees_to_radians(eulerXYZ[1] * 0.5f)); double sy = sin(degrees_to_radians(eulerXYZ[1] * 0.5f)); double cz = cos(degrees_to_radians(eulerXYZ[2] * 0.5f)); double sz = sin(degrees_to_radians(eulerXYZ[2] * 0.5f)); return Quaternion( cz * cy * sx - sz * sy * cx, cz * sy * cx + sz * cy * sx, sz * cy * cx - cz * sy * sx, cz * cy * cx + sz * sy * sx ); } inline Quaternion Quaternion::createForAxisAngle(const Vector3& axis, double angle) { angle *= 0.5f; double sa = sin(angle); return Quaternion(axis[0] * sa, axis[1] * sa, axis[2] * sa, cos(angle)); } inline Quaternion Quaternion::createForX(double angle) { angle *= 0.5f; return Quaternion(sin(angle), 0, 0, cos(angle)); } inline Quaternion Quaternion::createForY(double angle) { angle *= 0.5f; return Quaternion(0, sin(angle), 0, cos(angle)); } inline Quaternion Quaternion::createForZ(double angle) { angle *= 0.5f; return Quaternion(0, 0, sin(angle), cos(angle)); } inline Quaternion Quaternion::getMultipliedBy(const Quaternion& other) const { return Quaternion( w() * other.x() + x() * other.w() + y() * other.z() - z() * other.y(), w() * other.y() + y() * other.w() + z() * other.x() - x() * other.z(), w() * other.z() + z() * other.w() + x() * other.y() - y() * other.x(), w() * other.w() - x() * other.x() - y() * other.y() - z() * other.z() ); } inline void Quaternion::multiplyBy(const Quaternion& other) { *this = getMultipliedBy(other); } inline void Quaternion::preMultiplyBy(const Quaternion& other) { *this = other.getMultipliedBy(*this); } inline Quaternion Quaternion::getInverse() const { return Quaternion(-getVector3(), w()); } inline void Quaternion::conjugate() { *this = getInverse(); } inline Quaternion Quaternion::getNormalised() const { const double n = 1.0f / sqrt(x() * x() + y() * y() + z() * z() + w() * w()); return Quaternion(x() * n, y() * n, z() * n, w() * n); } inline void Quaternion::normalise() { *this = getNormalised(); } inline Vector3 Quaternion::transformPoint(const Vector3& point) const { double xx = x() * x(); double yy = y() * y(); double zz = z() * z(); double ww = w() * w(); double xy2 = x() * y() * 2; double xz2 = x() * z() * 2; double xw2 = x() * w() * 2; double yz2 = y() * z() * 2; double yw2 = y() * w() * 2; double zw2 = z() * w() * 2; return Vector3( ww * point.x() + yw2 * point.z() - zw2 * point.y() + xx * point.x() + xy2 * point.y() + xz2 * point.z() - zz * point.x() - yy * point.x(), xy2 * point.x() + yy * point.y() + yz2 * point.z() + zw2 * point.x() - zz * point.y() + ww * point.y() - xw2 * point.z() - xx * point.y(), xz2 * point.x() + yz2 * point.y() + zz * point.z() - yw2 * point.x() - yy * point.z() + xw2 * point.y() - xx * point.z() + ww * point.z() ); } const double c_half_sqrt2 = 0.70710678118654752440084436210485; const float c_half_sqrt2f = static_cast(c_half_sqrt2); DarkRadiant-2.0.2/libs/math/Ray.h000066400000000000000000000136521245424655700165120ustar00rootroot00000000000000#pragma once #include "Vector3.h" #include "Plane3.h" #include "Matrix4.h" #include "AABB.h" class Ray { public: Vector3 origin; Vector3 direction; Ray() {} Ray(const Vector3& origin_, const Vector3& direction_) : origin(origin_), direction(direction_) {} static Ray createForPoints(const Vector3& origin, const Vector3& p2) { return Ray(origin, (p2 - origin).getNormalised()); } /* greebo: this calculates the intersection point of two rays * (copied from Radiant's Intersection code, there may be better ways) */ Vector3 getIntersection(Ray& other) { Vector3 intersection = origin - other.origin; Vector3::ElementType dot = direction.dot(other.direction); Vector3::ElementType d = direction.dot(intersection); Vector3::ElementType e = other.direction.dot(intersection); Vector3::ElementType D = 1 - dot*dot; // always >= 0 if (D < 0.000001f) { // the lines are almost parallel return other.origin + other.direction*e; } else { return other.origin + other.direction*((e - dot*d) / D); } } void transform(const Matrix4& matrix) { origin = matrix.transformPoint(origin); direction = matrix.transformDirection(direction); } // closest-point-on-line Vector3::ElementType getSquaredDistance(const Vector3& point) const { return (point - (origin + direction * (point - origin).dot(direction))).getLengthSquared(); } Vector3::ElementType getDistance(const Plane3& plane) const { return -(plane.normal().dot(origin) - plane.dist()) / direction.dot(plane.normal()); } /** * Intersect this ray with the given bounding box. If no intersection occurs, this method * returns FALSE, in case of intersection (even if the ray starts within the AABB volume) * the method returns TRUE. The coord parameter will contain the intersection point in the * latter case (which will be the Ray's origin if it starts within the AABB to test). * Algorithm taken and adjusted from http://tog.acm.org/resources/GraphicsGems/gems/RayBox.c */ bool intersectAABB(const AABB& aabb, Vector3& intersection) const { if (!aabb.isValid()) return false; #define QUADRANT_RIGHT 0 #define QUADRANT_LEFT 1 #define QUADRANT_MIDDLE 2 bool inside = true; char quadrant[3]; Vector3::ElementType candidatePlane[3]; Vector3 aabbMin = aabb.getOrigin() - aabb.getExtents(); Vector3 aabbMax = aabb.getOrigin() + aabb.getExtents(); // Find candidate planes; this loop can be avoided if // rays cast all from the eye(assume perpsective view) for (int i = 0; i < 3; i++) { if (origin[i] < aabbMin[i]) { quadrant[i] = QUADRANT_LEFT; candidatePlane[i] = aabbMin[i]; inside = false; } else if (origin[i] > aabbMax[i]) { quadrant[i] = QUADRANT_RIGHT; candidatePlane[i] = aabbMax[i]; inside = false; } else { quadrant[i] = QUADRANT_MIDDLE; } } // Ray origin inside bounding box if (inside) { intersection = origin; return true; } Vector3::ElementType maxT[3]; // Calculate T distances to candidate planes for (int i = 0; i < 3; i++) { if (quadrant[i] != QUADRANT_MIDDLE && direction[i] != 0) { maxT[i] = (candidatePlane[i] - origin[i]) / direction[i]; } else { maxT[i] = -1; } } // Get largest of the maxT's for final choice of intersection int whichPlane = 0; for (int i = 1; i < 3; i++) { if (maxT[whichPlane] < maxT[i]) { whichPlane = i; } } // Check final candidate actually inside box if (maxT[whichPlane] < 0) return false; for (int i = 0; i < 3; i++) { if (whichPlane != i) { intersection[i] = origin[i] + maxT[whichPlane] * direction[i]; if (intersection[i] < aabbMin[i] || intersection[i] > aabbMax[i]) { return false; } } else { intersection[i] = candidatePlane[i]; } } return true; // ray hits box } // Return type for intersectTriangle() enum eTriangleIntersectionType { NO_INTERSECTION, POINT, COPLANAR, }; /** * Intersect this ray with the given triangle as represented by the 3 given points and * returns the found intersection type. Only in the case of eTriangleIntersectionType::POINT * the intersection argument will be filled with suitable coordinates, otherwise it's undefined. * * Note: degenerate triangles will return NO_INTERSECTION. * Taken and adjusted from http://geomalgorithms.com/a06-_intersect-2.html */ eTriangleIntersectionType intersectTriangle(const Vector3& p1, const Vector3& p2, const Vector3& p3, Vector3& intersection) const { // get triangle edge vectors and plane normal Vector3 u = p2 - p1; Vector3 v = p3 - p1; Vector3 n = u.crossProduct(v); if (n.getLengthSquared() == 0) { return NO_INTERSECTION; // triangle is degenerate } Vector3 dir = direction; // ray direction vector Vector3 w0 = origin - p1; double a = -n.dot(w0); double b = n.dot(dir); if (fabs(b) < 0.00001) { // ray is parallel to triangle plane if (a == 0) { return COPLANAR; // ray lies in triangle plane } else { return NO_INTERSECTION; // ray disjoint from plane } } // get intersect point of ray with triangle plane double r = a / b; if (r < 0.0) // ray goes away from triangle { return NO_INTERSECTION; // => no intersect } // for a segment, also test if (r > 1.0) => no intersect intersection = origin + direction * r; // // intersect point of ray and plane // is I inside T? double uu = u.dot(u); double uv = u.dot(v); double vv = v.dot(v); Vector3 w = intersection - p1; double wu = w.dot(u); double wv = w.dot(v); double D = uv * uv - uu * vv; // get and test parametric coords double s = (uv * wv - vv * wu) / D; if (s < 0.0 || s > 1.0) { return NO_INTERSECTION; // intersection is outside T } double t = (uv * wu - uu * wv) / D; if (t < 0.0 || (s + t) > 1.0) { return NO_INTERSECTION; // intersection is outside T } return POINT; // I is in T } }; DarkRadiant-2.0.2/libs/math/Segment.h000066400000000000000000000014161245424655700173540ustar00rootroot00000000000000#pragma once #include "Vector3.h" #include "Plane3.h" class Segment { public: Vector3 origin; Vector3 extents; Segment() {} Segment(const Vector3& origin_, const Vector3& extents_) : origin(origin_), extents(extents_) {} static Segment createForStartEnd(const Vector3& start, const Vector3& end) { Segment segment; segment.origin = start.mid(end); segment.extents = end - segment.origin; return segment; } unsigned int classifyPlane(const Plane3& plane) const { double distance_origin = plane.normal().dot(origin) - plane.dist(); if (fabs(distance_origin) < fabs(plane.normal().dot(extents))) { return 1; // partially inside } else if (distance_origin < 0) { return 2; // totally inside } return 0; // totally outside } }; DarkRadiant-2.0.2/libs/math/Vector2.h000066400000000000000000000210411245424655700172720ustar00rootroot00000000000000#pragma once /* greebo: This file contains the templated class definition of the two-component vector * * BasicVector2: A vector with two components of type * * The BasicVector2 is equipped with the most important operators like *, *= and so on. * * Note: The most commonly used Vector2 is a BasicVector2, this is also defined in this file * * Note: that the multiplication of a Vector2 with another one (Vector2*Vector2) does NOT * result in an inner product but in a component-wise scaling. Use the .dot() method to * execute an inner product of two vectors. */ #include "lrint.h" #include #include #include template class BasicVector2 { // This is where the components of the vector are stored. Element _v[2]; public: // Public typedef to read the type of our elements typedef Element ElementType; // Constructor with no arguments BasicVector2() { _v[0] = 0; _v[1] = 0; } // Templated copy constructor template BasicVector2(const BasicVector2& other) { x() = static_cast(other.x()); y() = static_cast(other.y()); } /** Construct a BasicVector2 with the 2 provided components. */ BasicVector2(const Element& x_, const Element& y_) { _v[0] = x_; _v[1] = y_; } /** Construct a BasicVector2 from a 2-element array. The array must be * valid as no bounds checking is done. */ BasicVector2(const Element* array) { for (int i = 0; i < 2; ++i) _v[i] = array[i]; } /** Construct a BasicVector2 by parsing the supplied string. The string * must contain 2 numeric values separated by whitespace. * * @param str * The string from which component values are extracted. */ BasicVector2(const std::string& str) { // Initialise the vector with 0, in case the string parse fails _v[0] = _v[1] = 0; // Use a stringstream to parse the string std::stringstream strm(str); strm << std::skipws; strm >> x(); strm >> y(); } /** Construct a BasicVector2 out of 2 elements of type OtherType */ template BasicVector2(OtherType x, OtherType y) { _v[0] = static_cast(x); _v[1] = static_cast(y); } // Return NON-CONSTANT references to the vector components Element& x() { return _v[0]; } Element& y() { return _v[1]; } // Return CONSTANT references to the vector components const Element& x() const { return _v[0]; } const Element& y() const { return _v[1]; } /** * Operator cast to Element*. Also provides operator[] due to the inbuilt * operation on a pointer type. */ operator Element* () { return _v; } /** * Operator cast to const Element*. */ operator const Element* () const { return _v; } Element* data() { return _v; } const Element* data() const { return _v; } /** Compare this BasicVector2 against another for equality. */ bool operator== (const BasicVector2& other) const { return (other.x() == x() && other.y() == y()); } /** Compare this BasicVector2 against another for inequality. */ bool operator!= (const BasicVector2& other) const { return !(*this == other); } /* Define the negation operator - * All the vector's components are negated */ BasicVector2 operator- () const { return BasicVector2( -_v[0], -_v[1] ); } /* Define the addition operators + and += with any other BasicVector2 of type OtherElement * The vectors are added to each other element-wise */ template BasicVector2 operator+ (const BasicVector2& other) const { return BasicVector2( _v[0] + static_cast(other.x()), _v[1] + static_cast(other.y()) ); } template void operator+= (const BasicVector2& other) { _v[0] += static_cast(other.x()); _v[1] += static_cast(other.y()); } /* Define the substraction operators - and -= with any other BasicVector2 of type OtherElement * The vectors are substracted from each other element-wise */ template BasicVector2 operator- (const BasicVector2& other) const { return BasicVector2( _v[0] - static_cast(other.x()), _v[1] - static_cast(other.y()) ); } template void operator-= (const BasicVector2& other) { _v[0] -= static_cast(other.x()); _v[1] -= static_cast(other.y()); } /* Define the multiplication operators * and *= with another Vector2 of type OtherElement * * The vectors are multiplied element-wise * * greebo: This is mathematically kind of senseless, as this is a mixture of * a dot product and scalar multiplication. It can be used to scale each * vector component by a different factor, so maybe this comes in handy. */ template BasicVector2 operator* (const BasicVector2& other) const { return BasicVector2( _v[0] * static_cast(other.x()), _v[1] * static_cast(other.y()) ); } template void operator*= (const BasicVector2& other) { _v[0] *= static_cast(other.x()); _v[1] *= static_cast(other.y()); } /* Define the multiplications * and *= with a scalar */ template BasicVector2 operator* (const OtherElement& other) const { Element factor = static_cast(other); return BasicVector2( _v[0] * factor, _v[1] * factor ); } template void operator*= (const OtherElement& other) { Element factor = static_cast(other); _v[0] *= factor; _v[1] *= factor; } /* Define the division operators / and /= with another Vector2 of type OtherElement * The vectors are divided element-wise */ template BasicVector2 operator/ (const BasicVector2& other) const { return BasicVector2( _v[0] / static_cast(other.x()), _v[1] / static_cast(other.y()) ); } template void operator/= (const BasicVector2& other) { _v[0] /= static_cast(other.x()); _v[1] /= static_cast(other.y()); } /* Define the scalar divisions / and /= */ template BasicVector2 operator/ (const OtherElement& other) const { Element divisor = static_cast(other); return BasicVector2( _v[0] / divisor, _v[1] / divisor ); } template void operator/= (const OtherElement& other) { Element divisor = static_cast(other); _v[0] /= divisor; _v[1] /= divisor; } /** Cast to std::string */ operator std::string() const { return (boost::format("%s %s") % _v[0] % _v[1]).str(); } /** Return the length of this vector. * * @returns * The Pythagorean length of this vector. */ double getLength() const { double lenSquared = _v[0]*_v[0] + _v[1]*_v[1]; return sqrt(lenSquared); } /** Return the squared length of this vector. */ double getLengthSquared() const { double lenSquared = _v[0]*_v[0] + _v[1]*_v[1]; return lenSquared; } /* Scalar product this vector with another Vector2, * returning the projection of onto * * @param other * The Vector2 to dot-product with this Vector2. * * @returns * The inner product (a scalar): a[0]*b[0] + a[1]*b[1] */ template Element dot(const BasicVector2& other) const { return Element(_v[0] * other.x() + _v[1] * other.y()); } /* Cross-product this vector with another Vector2, returning the scalar result * * @param other * The Vector2 to cross-product with this Vector2. * * @returns * The cross-product of the two vectors, a scalar: a[0]*b[1] - b[0]*a[1] */ template Element crossProduct(const BasicVector2& other) const { return Element(_v[0] * other.y() - _v[1] * other.x()); } }; // ========================================================================================== // A 2-element vector stored in double-precision floating-point. typedef BasicVector2 Vector2; // Stream insertion operator for a BasicVector2 template std::ostream& operator<<(std::ostream& st, BasicVector2 vec) { st << "<" << vec.x() << ", " << vec.y() << ">"; return st; } DarkRadiant-2.0.2/libs/math/Vector3.h000066400000000000000000000353671245424655700173130ustar00rootroot00000000000000#pragma once /* greebo: This file contains the templated class definition of the three-component vector * * BasicVector3: A vector with three components of type * * The BasicVector3 is equipped with the most important operators like *, *= and so on. * * Note: The most commonly used Vector3 is a BasicVector3, this is also defined in this file * * Note: that the multiplication of a Vector3 with another one (Vector3*Vector3) does NOT * result in an inner product but in a component-wise scaling. Use the .dot() method to * execute an inner product of two vectors. */ #include #include #include #include #include "math/pi.h" #include "lrint.h" #include "FloatTools.h" /// A 3-element vector of type Element template class BasicVector3 { // The actual values of the vector, an array containing 3 values of type // Element Element _v[3]; public: // Public typedef to read the type of our elements typedef Element ElementType; /** * Default constructor. Initialise Vector with all zeroes. */ BasicVector3() { _v[0] = 0; _v[1] = 0; _v[2] = 0; } /// Construct a BasicVector3 with the 3 provided components. BasicVector3(const Element& x_, const Element& y_, const Element& z_) { x() = x_; y() = y_; z() = z_; } /** Construct a BasicVector3 from a 3-element array. The array must be * valid as no bounds checking is done. */ BasicVector3(const Element* array) { for (int i = 0; i < 3; ++i) _v[i] = array[i]; } /** * Named constructor, returning a vector on the unit sphere for the given spherical coordinates. */ static BasicVector3 createForSpherical(Element theta, Element phi) { return BasicVector3( cos(theta) * cos(phi), sin(theta) * cos(phi), sin(phi) ); } /** Set all 3 components to the provided values. */ void set(const Element& x, const Element& y, const Element& z) { _v[0] = x; _v[1] = y; _v[2] = z; } /** * Check if this Vector is valid. A Vector is invalid if any of its * components are NaN. */ bool isValid() const { return !isnan(_v[0]) && !isnan(_v[1]) && !isnan(_v[2]); } // Return NON-CONSTANT references to the vector components Element& x() { return _v[0]; } Element& y() { return _v[1]; } Element& z() { return _v[2]; } // Return CONSTANT references to the vector components const Element& x() const { return _v[0]; } const Element& y() const { return _v[1]; } const Element& z() const { return _v[2]; } /** Compare this BasicVector3 against another for equality. */ bool operator== (const BasicVector3& other) const { return (other.x() == x() && other.y() == y() && other.z() == z()); } /** Compare this BasicVector3 against another for inequality. */ bool operator!= (const BasicVector3& other) const { return !(*this == other); } /* Define the negation operator - * All the vector's components are negated */ BasicVector3 operator- () const { return BasicVector3( -_v[0], -_v[1], -_v[2] ); } /* Define the addition operators + and += with any other BasicVector3 of type OtherElement * The vectors are added to each other element-wise */ template BasicVector3 operator+ (const BasicVector3& other) const { return BasicVector3( _v[0] + static_cast(other.x()), _v[1] + static_cast(other.y()), _v[2] + static_cast(other.z()) ); } template void operator+= (const BasicVector3& other) { _v[0] += static_cast(other.x()); _v[1] += static_cast(other.y()); _v[2] += static_cast(other.z()); } /* Define the substraction operators - and -= with any other BasicVector3 of type OtherElement * The vectors are substracted from each other element-wise */ template BasicVector3 operator- (const BasicVector3& other) const { return BasicVector3( _v[0] - static_cast(other.x()), _v[1] - static_cast(other.y()), _v[2] - static_cast(other.z()) ); } template void operator-= (const BasicVector3& other) { _v[0] -= static_cast(other.x()); _v[1] -= static_cast(other.y()); _v[2] -= static_cast(other.z()); } /* Define the multiplication operators * and *= with another Vector3 of type OtherElement * * The vectors are multiplied element-wise * * greebo: This is mathematically kind of senseless, as this is a mixture of * a dot product and scalar multiplication. It can be used to scale each * vector component by a different factor, so maybe this comes in handy. */ template BasicVector3 operator* (const BasicVector3& other) const { return BasicVector3( _v[0] * static_cast(other.x()), _v[1] * static_cast(other.y()), _v[2] * static_cast(other.z()) ); } template void operator*= (const BasicVector3& other) { _v[0] *= static_cast(other.x()); _v[1] *= static_cast(other.y()); _v[2] *= static_cast(other.z()); } /* Define the multiplications * and *= with a scalar */ template BasicVector3 operator* (const OtherElement& other) const { Element factor = static_cast(other); return BasicVector3( _v[0] * factor, _v[1] * factor, _v[2] * factor ); } template void operator*= (const OtherElement& other) { Element factor = static_cast(other); _v[0] *= factor; _v[1] *= factor; _v[2] *= factor; } /* Define the division operators / and /= with another Vector3 of type OtherElement * The vectors are divided element-wise */ template BasicVector3 operator/ (const BasicVector3& other) const { return BasicVector3( _v[0] / static_cast(other.x()), _v[1] / static_cast(other.y()), _v[2] / static_cast(other.z()) ); } template void operator/= (const BasicVector3& other) { _v[0] /= static_cast(other.x()); _v[1] /= static_cast(other.y()); _v[2] /= static_cast(other.z()); } /* Define the scalar divisions / and /= */ template BasicVector3 operator/ (const OtherElement& other) const { Element divisor = static_cast(other); return BasicVector3( _v[0] / divisor, _v[1] / divisor, _v[2] / divisor ); } template void operator/= (const OtherElement& other) { Element divisor = static_cast(other); _v[0] /= divisor; _v[1] /= divisor; _v[2] /= divisor; } /* * Mathematical operations on the BasicVector3 */ /** Return the length of this vector. * * @returns * The Pythagorean length of this vector. */ float getLength() const { float lenSquared = getLengthSquared(); return sqrt(lenSquared); } /** Return the squared length of this vector. */ float getLengthSquared() const { float lenSquared = float(_v[0]) * float(_v[0]) + float(_v[1]) * float(_v[1]) + float(_v[2]) * float(_v[2]); return lenSquared; } /** * Return a new BasicVector3 equivalent to the normalised version of this * BasicVector3 (scaled by the inverse of its size) */ BasicVector3 getNormalised() const { return (*this)/getLength(); } /** * Normalise this vector in-place by scaling by the inverse of its size. * Returns the length it had before normalisation. */ float normalise() { float length = getLength(); float inverseLength = 1/length; _v[0] *= inverseLength; _v[1] *= inverseLength; _v[2] *= inverseLength; return length; } // Returns a vector with the reciprocal values of each component BasicVector3 getInversed() { return BasicVector3( 1.0f / _v[0], 1.0f / _v[1], 1.0f / _v[2] ); } /* Scalar product this vector with another Vector3, * returning the projection of onto * * @param other * The Vector3 to dot-product with this Vector3. * * @returns * The inner product (a scalar): a[0]*b[0] + a[1]*b[1] + a[2]*b[2] */ template Element dot(const BasicVector3& other) const { return Element(_v[0] * other.x() + _v[1] * other.y() + _v[2] * other.z()); } /* Returns the angle between and * * @returns * The angle as defined by the arccos( (a*b) / (|a|*|b|) ) */ template Element angle(const BasicVector3& other) const { BasicVector3 aNormalised = getNormalised(); BasicVector3 otherNormalised = other.getNormalised(); Element dot = aNormalised.dot(otherNormalised); // greebo: Sanity correction: Make sure the dot product // of two normalised vectors is not greater than 1 if (dot > 1.0) { dot = 1; } return acos( dot ); } /* Cross-product this vector with another Vector3, returning the result * in a new Vector3. * * @param other * The Vector3 to cross-product with this Vector3. * * @returns * The cross-product of the two vectors. */ template BasicVector3 crossProduct(const BasicVector3& other) const { return BasicVector3( _v[1] * other.z() - _v[2] * other.y(), _v[2] * other.x() - _v[0] * other.z(), _v[0] * other.y() - _v[1] * other.x()); } /** Implicit cast to C-style array. This allows a Vector3 to be * passed directly to GL functions that expect an array (e.g. * glFloat3dv()). These functions implicitly provide operator[] * as well, since the C-style array provides this function. */ operator const Element* () const { return _v; } operator Element* () { return _v; } // Returns the maximum absolute value of the components Element max() const { return std::max(fabs(_v[0]), std::max(fabs(_v[1]), fabs(_v[2]))); } // Returns the minimum absolute value of the components Element min() const { return std::min(fabs(_v[0]), std::min(fabs(_v[1]), fabs(_v[2]))); } template bool isParallel(const BasicVector3& other) const { return float_equal_epsilon(angle(other), 0.0, 0.001) || float_equal_epsilon(angle(other), c_pi, 0.001); } // Swaps all components with the other vector template void swap(BasicVector3& other) { std::swap(x(), other.x()); std::swap(y(), other.y()); std::swap(z(), other.z()); } // Returns the mid-point of this vector and the other one BasicVector3 mid(const BasicVector3& other) const { return (*this + other) * 0.5f; } // Returns true if this vector is equal to the other one, considering the given tolerance. template bool isEqual(const BasicVector3& other, Epsilon epsilon) const { return float_equal_epsilon(x(), other.x(), epsilon) && float_equal_epsilon(y(), other.y(), epsilon) && float_equal_epsilon(z(), other.z(), epsilon); } /** * Returns a "snapped" copy of this Vector, each component rounded to integers. */ BasicVector3 getSnapped() const { return BasicVector3( static_cast(float_to_integer(x())), static_cast(float_to_integer(y())), static_cast(float_to_integer(z())) ); } /** * Snaps this vector to integer values in place. */ void snap() { *this = getSnapped(); } /** * Returns a "snapped" copy of this Vector, each component rounded to the given precision. */ template BasicVector3 getSnapped(const OtherElement& snap) const { return BasicVector3( static_cast(float_snapped(x(), snap)), static_cast(float_snapped(y(), snap)), static_cast(float_snapped(z(), snap)) ); } /** * Snaps this vector to the given precision in place. */ template void snap(const OtherElement& snap) { *this = getSnapped(snap); } }; /// Stream insertion for BasicVector3 template inline std::ostream& operator<<(std::ostream& st, BasicVector3 vec) { return st << vec.x() << " " << vec.y() << " " << vec.z(); } /// Stream extraction for BasicVector3 template inline std::istream& operator>>(std::istream& st, BasicVector3& vec) { return st >> std::skipws >> vec.x() >> vec.y() >> vec.z(); } // ========================================================================================== // A 3-element vector stored in double-precision floating-point. typedef BasicVector3 Vector3; // A 3-element vector (single-precision variant) typedef BasicVector3 Vector3f; // =============== Vector3 Constants ================================================== const Vector3 g_vector3_identity(0, 0, 0); const Vector3 g_vector3_axis_x(1, 0, 0); const Vector3 g_vector3_axis_y(0, 1, 0); const Vector3 g_vector3_axis_z(0, 0, 1); const Vector3 g_vector3_axes[3] = { g_vector3_axis_x, g_vector3_axis_y, g_vector3_axis_z }; DarkRadiant-2.0.2/libs/math/Vector4.h000066400000000000000000000241301245424655700172760ustar00rootroot00000000000000#pragma once /* greebo: This file contains the templated class definition of the three-component vector * * BasicVector4: A vector with three components of type * * The BasicVector4 is equipped with the most important operators like *, *= and so on. * * Note: The most commonly used Vector4 is a BasicVector4, this is also defined in this file * * Note: that the multiplication of a Vector4 with another one (Vector4*Vector4) does NOT * result in an inner product but in a component-wise scaling. Use the .dot() method to * execute an inner product of two vectors. */ #include "lrint.h" #include "FloatTools.h" #include "Vector3.h" /// A 4-element vector of type template class BasicVector4 { // The components of this vector Element _v[4]; public: // Public typedef to read the type of our elements typedef Element ElementType; // Constructor (no arguments) BasicVector4() { _v[0] = 0; _v[1] = 0; _v[2] = 0; _v[3] = 0; } // Construct a BasicVector4 out of the 4 arguments BasicVector4(Element x_, Element y_, Element z_, Element w_) { _v[0] = x_; _v[1] = y_; _v[2] = z_; _v[3] = w_; } // Construct a BasicVector4 out of a Vector3 plus a fourth argument BasicVector4(const BasicVector3& other, Element w_) { _v[0] = other.x(); _v[1] = other.y(); _v[2] = other.z(); _v[3] = w_; } // Return non-constant references to the components Element& x() { return _v[0]; } Element& y() { return _v[1]; } Element& z() { return _v[2]; } Element& w() { return _v[3]; } // Return constant references to the components const Element& x() const { return _v[0]; } const Element& y() const { return _v[1]; } const Element& z() const { return _v[2]; } const Element& w() const { return _v[3]; } Element index(std::size_t i) const { return _v[i]; } Element& index(std::size_t i) { return _v[i]; } /** Compare this BasicVector4 against another for equality. */ bool operator== (const BasicVector4& other) const { return (other.x() == x() && other.y() == y() && other.z() == z() && other.w() == w()); } /** Compare this BasicVector4 against another for inequality. */ bool operator!= (const BasicVector4& other) const { return !(*this == other); } /* Define the addition operators + and += with any other BasicVector4 of type OtherElement * The vectors are added to each other element-wise */ template BasicVector4 operator+ (const BasicVector4& other) const { return BasicVector4( _v[0] + static_cast(other.x()), _v[1] + static_cast(other.y()), _v[2] + static_cast(other.z()), _v[3] + static_cast(other.w()) ); } template void operator+= (const BasicVector4& other) { _v[0] += static_cast(other.x()); _v[1] += static_cast(other.y()); _v[2] += static_cast(other.z()); _v[3] += static_cast(other.w()); } /* Define the substraction operators - and -= with any other BasicVector4 of type OtherElement * The vectors are substracted from each other element-wise */ template BasicVector4 operator- (const BasicVector4& other) const { return BasicVector4( _v[0] - static_cast(other.x()), _v[1] - static_cast(other.y()), _v[2] - static_cast(other.z()), _v[3] - static_cast(other.w()) ); } template void operator-= (const BasicVector4& other) { _v[0] -= static_cast(other.x()); _v[1] -= static_cast(other.y()); _v[2] -= static_cast(other.z()); _v[3] -= static_cast(other.w()); } /* Define the multiplication operators * and *= with another Vector4 of type OtherElement * * The vectors are multiplied element-wise * * greebo: This is mathematically kind of senseless, as this is a mixture of * a dot product and scalar multiplication. It can be used to scale each * vector component by a different factor, so maybe this comes in handy. */ template BasicVector4 operator* (const BasicVector4& other) const { return BasicVector4( _v[0] * static_cast(other.x()), _v[1] * static_cast(other.y()), _v[2] * static_cast(other.z()), _v[3] * static_cast(other.w()) ); } template void operator*= (const BasicVector4& other) { _v[0] *= static_cast(other.x()); _v[1] *= static_cast(other.y()); _v[2] *= static_cast(other.z()); _v[3] *= static_cast(other.w()); } /* Define the multiplications * and *= with a scalar */ template BasicVector4 operator* (const OtherElement& other) const { Element factor = static_cast(other); return BasicVector4( _v[0] * factor, _v[1] * factor, _v[2] * factor, _v[3] * factor ); } template void operator*= (const OtherElement& other) { Element factor = static_cast(other); _v[0] *= factor; _v[1] *= factor; _v[2] *= factor; _v[3] *= factor; } /* Define the division operators / and /= with another Vector4 of type OtherElement * The vectors are divided element-wise */ template BasicVector4 operator/ (const BasicVector4& other) const { return BasicVector4( _v[0] / static_cast(other.x()), _v[1] / static_cast(other.y()), _v[2] / static_cast(other.z()), _v[3] / static_cast(other.w()) ); } template void operator/= (const BasicVector4& other) { _v[0] /= static_cast(other.x()); _v[1] /= static_cast(other.y()); _v[2] /= static_cast(other.z()); _v[3] /= static_cast(other.w()); } /* Define the scalar divisions / and /= */ template BasicVector4 operator/ (const OtherElement& other) const { Element divisor = static_cast(other); return BasicVector4( _v[0] / divisor, _v[1] / divisor, _v[2] / divisor, _v[3] / divisor ); } template void operator/= (const OtherElement& other) { Element divisor = static_cast(other); _v[0] /= divisor; _v[1] /= divisor; _v[2] /= divisor; _v[3] /= divisor; } /* Scalar product this vector with another Vector4, * returning the projection of onto * * @param other * The Vector4 to dot-product with this Vector4. * * @returns * The inner product (a scalar): a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3] */ template Element dot(const BasicVector4& other) const { return Element(_v[0] * other.x() + _v[1] * other.y() + _v[2] * other.z() + _v[3] * other.w()); } /** Project this homogeneous Vector4 into a Cartesian Vector3 * by dividing by w. * * @returns * A Vector3 representing the Cartesian equivalent of this * homogeneous vector. */ BasicVector3 getProjected() { return BasicVector3( _v[0] / _v[3], _v[1] / _v[3], _v[2] / _v[3]); } /** Implicit cast to C-style array. This allows a Vector4 to be * passed directly to GL functions that expect an array (e.g. * glFloat4dv()). These functions implicitly provide operator[] * as well, since the C-style array provides this function. */ operator const Element* () const { return _v; } operator Element* () { return _v; } /* Cast this Vector4 onto a Vector3, both const and non-const */ BasicVector3& getVector3() { return *reinterpret_cast*>(_v); } const BasicVector3& getVector3() const { return *reinterpret_cast*>(_v); } /** * Equality check with tolerance epsilon. */ template bool isEqual(const BasicVector4& other, Element epsilon) const { return float_equal_epsilon(x(), other.x(), epsilon) && float_equal_epsilon(y(), other.y(), epsilon) && float_equal_epsilon(z(), other.z(), epsilon) && float_equal_epsilon(w(), other.w(), epsilon); } }; // BasicVector4 /// Stream insertion for BasicVector4 template inline std::ostream& operator<<(std::ostream& st, BasicVector4 vec) { return st << vec.x() << " " << vec.y() << " " << vec.z() << " " << vec.w(); } /// Stream extraction for BasicVector4 template inline std::istream& operator>>(std::istream& st, BasicVector4& vec) { return st >> std::skipws >> vec.x() >> vec.y() >> vec.z() >> vec.w(); } // A 4-element vector stored in double-precision floating-point. typedef BasicVector4 Vector4; // A 4-element vector stored in single-precision floating-point. typedef BasicVector4 Vector4f; DarkRadiant-2.0.2/libs/math/ViewProjection.h000066400000000000000000000015361245424655700207240ustar00rootroot00000000000000#pragma once #include "Matrix4.h" /** * Specialisation of the Matrix4 class offering convenience methods * for viewprojection-related calculations. */ class ViewProjection : public Matrix4 { public: ViewProjection() : Matrix4() {} ViewProjection(const Matrix4& other) : Matrix4(other) {} bool testPoint(const Vector3& point) const; bool testPoint(const Vector3& point, const Matrix4& localToWorld) const; }; inline bool ViewProjection::testPoint(const Vector3& point) const { Vector4 hpoint = transform(Vector4(point, 1.0f)); if (fabs(hpoint[0]) < fabs(hpoint[3]) && fabs(hpoint[1]) < fabs(hpoint[3]) && fabs(hpoint[2]) < fabs(hpoint[3])) { return true; } return false; } inline bool ViewProjection::testPoint(const Vector3& point, const Matrix4& localToWorld) const { return testPoint(localToWorld.transformPoint(point)); } DarkRadiant-2.0.2/libs/math/Viewer.h000066400000000000000000000037251245424655700172200ustar00rootroot00000000000000#pragma once #include "Vector4.h" #include "Plane3.h" #include "Matrix4.h" #include "ViewProjection.h" class Viewer : public Vector4 { public: Viewer() : Vector4() {} Viewer(const Vector4& other) : Vector4(other) {} Viewer(const Vector3& vec3, float w) : Vector4(vec3, w) {} static Viewer createFromTransformedViewer(const Vector4& viewer, const Matrix4& transform); static Viewer createFromViewProjection(const ViewProjection& viewproj); bool testPlane(const Plane3& plane) const; bool testPlane(const Plane3& plane, const Matrix4& localToWorld) const; bool testTriangle(const Vector3& p0, const Vector3& p1, const Vector3& p2) const; }; inline bool Viewer::testPlane(const Plane3& plane) const { return (plane.normal().x() * x()) + (plane.normal().y() * y()) + (plane.normal().z() * z()) + (plane.dist() * w()) > 0; } inline bool Viewer::testPlane(const Plane3& plane, const Matrix4& localToWorld) const { return testPlane(plane.transformed(localToWorld)); } inline Viewer Viewer::createFromTransformedViewer(const Vector4& viewer, const Matrix4& transform) { if (viewer.w() == 0) { return Viewer(transform.transformDirection(viewer.getVector3()), 0); } else { return Viewer(transform.transformPoint(viewer.getVector3()), viewer.w()); } } inline Vector3 triangle_cross(const Vector3& p0, const Vector3& p1, const Vector3& p2) { return (p1 - p0).crossProduct(p1 - p2); } inline bool Viewer::testTriangle(const Vector3& p0, const Vector3& p1, const Vector3& p2) const { Vector3 cross = triangle_cross(p0, p1, p2); return (x() * cross[0]) + (y() * cross[1]) + (z() * cross[2]) > 0; } inline Viewer Viewer::createFromViewProjection(const ViewProjection& viewproj) { // get viewer pos in object coords Vector4 viewer(viewproj.getFullInverse().transform(Vector4(0, 0, -1, 0))); if (viewer[3] != 0) // non-affine matrix { viewer[0] /= viewer[3]; viewer[1] /= viewer[3]; viewer[2] /= viewer[3]; viewer[3] /= viewer[3]; } return viewer; } DarkRadiant-2.0.2/libs/math/curve.h000066400000000000000000000147051245424655700171030ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_MATH_CURVE_H) #define INCLUDED_MATH_CURVE_H /// \file /// \brief Curve data types and related operations. #include #include "math/Matrix4.h" template struct BernsteinPolynomial { static double apply(double t) { return 1; // general case not implemented } }; /// \brief A compile-time-constant integer. template struct IntegralConstantC { enum unnamed_{ VALUE = VALUE_ }; }; typedef IntegralConstantC<0> Zero; typedef IntegralConstantC<1> One; typedef IntegralConstantC<2> Two; typedef IntegralConstantC<3> Three; typedef IntegralConstantC<4> Four; template<> struct BernsteinPolynomial { static double apply(double t) { return 1; } }; template<> struct BernsteinPolynomial { static double apply(double t) { return 1 - t; } }; template<> struct BernsteinPolynomial { static double apply(double t) { return t; } }; template<> struct BernsteinPolynomial { static double apply(double t) { return (1 - t) * (1 - t); } }; template<> struct BernsteinPolynomial { static double apply(double t) { return 2 * (1 - t) * t; } }; template<> struct BernsteinPolynomial { static double apply(double t) { return t * t; } }; template<> struct BernsteinPolynomial { static double apply(double t) { return (1 - t) * (1 - t) * (1 - t); } }; template<> struct BernsteinPolynomial { static double apply(double t) { return 3 * (1 - t) * (1 - t) * t; } }; template<> struct BernsteinPolynomial { static double apply(double t) { return 3 * (1 - t) * t * t; } }; template<> struct BernsteinPolynomial { static double apply(double t) { return t * t * t; } }; typedef std::vector ControlPoints; inline Vector3 CubicBezier_evaluate(const Vector3* firstPoint, double t) { Vector3 result(0, 0, 0); double denominator = 0; { double weight = BernsteinPolynomial::apply(t); result += (*firstPoint++) * weight; denominator += weight; } { double weight = BernsteinPolynomial::apply(t); result += (*firstPoint++) * weight; denominator += weight; } { double weight = BernsteinPolynomial::apply(t); result += (*firstPoint++) * weight; denominator += weight; } { double weight = BernsteinPolynomial::apply(t); result += (*firstPoint++) * weight; denominator += weight; } return result / denominator; } inline Vector3 CubicBezier_evaluateMid(const Vector3* firstPoint) { return firstPoint[0]*0.125 + firstPoint[1]*0.375 + firstPoint[2]*0.375 + firstPoint[3]*0.125; } inline Vector3 CatmullRom_evaluate(const ControlPoints& controlPoints, double t) { // scale t to be segment-relative t *= double(controlPoints.size() - 1); // subtract segment index; std::size_t segment = 0; for(std::size_t i = 0; i < controlPoints.size() - 1; ++i) { if(t <= double(i+1)) { segment = i; break; } } t -= segment; const double reciprocal_alpha = 1.0 / 3.0; Vector3 bezierPoints[4]; bezierPoints[0] = controlPoints[segment]; bezierPoints[1] = (segment > 0) ? controlPoints[segment] + (controlPoints[segment + 1] - controlPoints[segment - 1]) * (reciprocal_alpha * 0.5) : controlPoints[segment] + (controlPoints[segment + 1] - controlPoints[segment]) * reciprocal_alpha; bezierPoints[2] = (segment < controlPoints.size() - 2) ? controlPoints[segment + 1] + (controlPoints[segment] - controlPoints[segment + 2]) * (reciprocal_alpha * 0.5) : controlPoints[segment + 1] + (controlPoints[segment] - controlPoints[segment + 1]) * reciprocal_alpha; bezierPoints[3] = controlPoints[segment + 1]; return CubicBezier_evaluate(bezierPoints, t); } typedef std::vector Knots; inline double BSpline_basis(const Knots& knots, std::size_t i, std::size_t degree, double t) { if(degree == 0) { if(knots[i] <= t && t < knots[i + 1] && knots[i] < knots[i + 1]) { return 1; } return 0; } double leftDenom = knots[i + degree] - knots[i]; double left = (leftDenom == 0) ? 0 : ((t - knots[i]) / leftDenom) * BSpline_basis(knots, i, degree - 1, t); double rightDenom = knots[i + degree + 1] - knots[i + 1]; double right = (rightDenom == 0) ? 0 : ((knots[i + degree + 1] - t) / rightDenom) * BSpline_basis(knots, i + 1, degree - 1, t); return left + right; } inline Vector3 BSpline_evaluate(const ControlPoints& controlPoints, const Knots& knots, std::size_t degree, double t) { Vector3 result(0, 0, 0); for(std::size_t i = 0; i < controlPoints.size(); ++i) { result += controlPoints[i] * BSpline_basis(knots, i, degree, t); } return result; } typedef std::vector NURBSWeights; inline Vector3 NURBS_evaluate(const ControlPoints& controlPoints, const NURBSWeights& weights, const Knots& knots, std::size_t degree, double t) { Vector3 result(0, 0, 0); double denominator = 0; for(std::size_t i = 0; i < controlPoints.size(); ++i) { double weight = weights[i] * BSpline_basis(knots, i, degree, t); result += controlPoints[i] * weight; denominator += weight; } return result / denominator; } inline void KnotVector_openUniform(Knots& knots, std::size_t count, std::size_t degree) { knots.resize(count + degree + 1); std::size_t equalKnots = 1; for(std::size_t i = 0; i < equalKnots; ++i) { knots[i] = 0; knots[knots.size() - (i + 1)] = 1; } std::size_t difference = knots.size() - 2 * (equalKnots); for(std::size_t i = 0; i < difference; ++i) { knots[i + equalKnots] = Knots::value_type(double(i + 1) * 1.0 / double(difference + 1)); } } #endif DarkRadiant-2.0.2/libs/math/lrint.h000066400000000000000000000020011245424655700170710ustar00rootroot00000000000000#ifndef LRINT_H_ #define LRINT_H_ /** * Casting a double to an int the fast way. */ #if defined (_MSC_VER) #if defined (_WIN64) // greebo: It seems VC++ 2012 math.h already provides lrint #if _MSC_VER >= 1800 #include #else // Only for SSE2 or x64 #include // greebo: VC++ x64 doesn't support inline assembly, we have to use x64 intrinsics instead inline int lrint(const double x) { return _mm_cvtsd_si32(_mm_load_sd(&x)); } #endif #else // greebo: It seems VC++ 2012 math.h already provides lrint #if _MSC_VER >= 1800 #include #else // Win32 target inline int lrint (double flt) { int i; _asm { fld flt fistp i }; return i; } #endif #endif #elif defined(__FreeBSD__) inline int lrint(double f) { return static_cast(f + 0.5); } #elif defined(__GNUC__) // lrint is part of ISO C99 #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #else #error "unsupported platform" #endif #endif /*LRINT_H_*/ DarkRadiant-2.0.2/libs/math/pi.h000066400000000000000000000023731245424655700163650ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #pragma once /// \file /// \brief Pi constants and degrees/radians conversion. const double c_pi = 3.1415926535897932384626433832795; const double c_half_pi = c_pi / 2; const double c_2pi = 2 * c_pi; const double c_inv_2pi = 1 / c_2pi; const double c_DEG2RADMULT = c_pi / 180.0; const double c_RAD2DEGMULT = 180.0 / c_pi; inline double radians_to_degrees(double radians) { return radians * c_RAD2DEGMULT; } inline double degrees_to_radians(double degrees) { return degrees * c_DEG2RADMULT; } DarkRadiant-2.0.2/libs/math/test/000077500000000000000000000000001245424655700165565ustar00rootroot00000000000000DarkRadiant-2.0.2/libs/math/test/matrixTest.cpp000066400000000000000000000457421245424655700214420ustar00rootroot00000000000000#define BOOST_TEST_DYN_LINK #define BOOST_TEST_MODULE matrixTest #include #include BOOST_AUTO_TEST_CASE(constructIdentity) { const Matrix4 identity = Matrix4::getIdentity(); BOOST_CHECK(identity.xx() == 1); BOOST_CHECK(identity.xy() == 0); BOOST_CHECK(identity.xz() == 0); BOOST_CHECK(identity.xw() == 0); BOOST_CHECK(identity.yx() == 0); BOOST_CHECK(identity.yy() == 1); BOOST_CHECK(identity.yz() == 0); BOOST_CHECK(identity.yw() == 0); BOOST_CHECK(identity.zx() == 0); BOOST_CHECK(identity.zy() == 0); BOOST_CHECK(identity.zz() == 1); BOOST_CHECK(identity.zw() == 0); BOOST_CHECK(identity.tx() == 0); BOOST_CHECK(identity.ty() == 0); BOOST_CHECK(identity.tz() == 0); BOOST_CHECK(identity.tw() == 1); Matrix4 identity2; identity2.xx() = 1; identity2.xy() = 0; identity2.xz() = 0; identity2.xw() = 0; identity2.yx() = 0; identity2.yy() = 1; identity2.yz() = 0; identity2.yw() = 0; identity2.zx() = 0; identity2.zy() = 0; identity2.zz() = 1; identity2.zw() = 0; identity2.tx() = 0; identity2.ty() = 0; identity2.tz() = 0; identity2.tw() = 1; BOOST_CHECK(identity == identity2); } BOOST_AUTO_TEST_CASE(constructInitialised) { Matrix4 m = Matrix4::byRows(1, 2.5, 3, 0.34, 51, -6, 7, 9, 9, 100, 11, 20, 13.11, 24, 15, 32); // Check individual values BOOST_CHECK_EQUAL(m.xx(), 1); BOOST_CHECK_EQUAL(m.xy(), 51); BOOST_CHECK_EQUAL(m.xz(), 9); BOOST_CHECK_EQUAL(m.xw(), 13.11); BOOST_CHECK_EQUAL(m.yx(), 2.5); BOOST_CHECK_EQUAL(m.yy(), -6); BOOST_CHECK_EQUAL(m.yz(), 100); BOOST_CHECK_EQUAL(m.yw(), 24); BOOST_CHECK_EQUAL(m.zx(), 3); BOOST_CHECK_EQUAL(m.zy(), 7); BOOST_CHECK_EQUAL(m.zz(), 11); BOOST_CHECK_EQUAL(m.zw(), 15); BOOST_CHECK_EQUAL(m.tx(), 0.34); BOOST_CHECK_EQUAL(m.ty(), 9); BOOST_CHECK_EQUAL(m.tz(), 20); BOOST_CHECK_EQUAL(m.tw(), 32); // Check vector components BOOST_CHECK_EQUAL(m.x(), Vector4(1, 51, 9, 13.11)); BOOST_CHECK_EQUAL(m.y(), Vector4(2.5, -6, 100, 24)); BOOST_CHECK_EQUAL(m.z(), Vector4(3, 7, 11, 15)); BOOST_CHECK_EQUAL(m.t(), Vector4(0.34, 9, 20, 32)); BOOST_CHECK_EQUAL(m.translation(), Vector3(0.34, 9, 20)); } BOOST_AUTO_TEST_CASE(testRotationMatrices) { double angle = 30.0; double cosAngle = cos(degrees_to_radians(angle)); double sinAngle = sin(degrees_to_radians(angle)); double EPSILON = 0.00001f; // Test X rotation Matrix4 xRot = Matrix4::getRotationAboutXDegrees(angle); BOOST_CHECK(float_equal_epsilon(xRot.xx(), 1, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.xy(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.xz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.xw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.yx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.yy(), cosAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.yz(), sinAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.yw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.zx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.zy(), -sinAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.zz(), cosAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.zw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.tx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.ty(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.tz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(xRot.tw(), 1, EPSILON)); // Test Y rotation Matrix4 yRot = Matrix4::getRotationAboutYDegrees(angle); BOOST_CHECK(float_equal_epsilon(yRot.xx(), cosAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.xy(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.xz(), -sinAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.xw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.yx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.yy(), 1, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.yz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.yw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.zx(), sinAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.zy(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.zz(), cosAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.zw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.tx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.ty(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.tz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(yRot.tw(), 1, EPSILON)); // Test Z rotation Matrix4 zRot = Matrix4::getRotationAboutZDegrees(angle); BOOST_CHECK(float_equal_epsilon(zRot.xx(), cosAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.xy(), sinAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.xz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.xw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.yx(), -sinAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.yy(), cosAngle, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.yz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.yw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.zx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.zy(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.zz(), 1, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.zw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.tx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.ty(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.tz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(zRot.tw(), 1, EPSILON)); // Test euler angle constructors Vector3 euler(30, -55, 75); // Convert degrees to radians double pi = 3.141592653589793238462643383f; double cx = cos(euler[0] * c_pi / 180.0f); double sx = sin(euler[0] * c_pi / 180.0f); double cy = cos(euler[1] * c_pi / 180.0f); double sy = sin(euler[1] * c_pi / 180.0f); double cz = cos(euler[2] * c_pi / 180.0f); double sz = sin(euler[2] * c_pi / 180.0f); // XYZ { Matrix4 eulerXYZ = Matrix4::getRotationForEulerXYZDegrees(euler); BOOST_CHECK(float_equal_epsilon(eulerXYZ.xx(), cy*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.xy(), cy*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.xz(), -sy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.xw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.yx(), sx*sy*cz - cx*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.yy(), sx*sy*sz + cx*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.yz(), sx*cy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.yw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.zx(), cx*sy*cz + sx*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.zy(), cx*sy*sz - sx*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.zz(), cx*cy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.zw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.tx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.ty(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.tz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXYZ.tw(), 1, EPSILON)); } // YZX { Matrix4 eulerYZX = Matrix4::getRotationForEulerYZXDegrees(euler); BOOST_CHECK(float_equal_epsilon(eulerYZX.xx(), cy*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.xy(), cx*cy*sz + sx*sy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.xz(), sx*cy*sz - cx*sy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.xw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.yx(), -sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.yy(), cx*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.yz(), sx*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.yw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.zx(), sy*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.zy(), cx*sy*sz - sx*cy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.zz(), sx*sy*sz + cx*cy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.zw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.tx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.ty(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.tz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYZX.tw(), 1, EPSILON)); } // XZY { Matrix4 eulerXZY = Matrix4::getRotationForEulerXZYDegrees(euler); BOOST_CHECK(float_equal_epsilon(eulerXZY.xx(), cy*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.xy(), sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.xz(), -sy*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.xw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.yx(), sx*sy - cx*cy*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.yy(), cx*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.yz(), cx*sy*sz + sx*cy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.yw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.zx(), sx*cy*sz + cx*sy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.zy(), -sx*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.zz(), cx*cy - sx*sy*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.zw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.tx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.ty(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.tz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerXZY.tw(), 1, EPSILON)); } // YXZ { Matrix4 eulerYXZ = Matrix4::getRotationForEulerYXZDegrees(euler); BOOST_CHECK(float_equal_epsilon(eulerYXZ.xx(), cy*cz - sx*sy*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.xy(), cy*sz + sx*sy*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.xz(), -cx*sy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.xw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.yx(), -cx*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.yy(), cx*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.yz(), sx, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.yw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.zx(), sy*cz + sx*cy*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.zy(), sy*sz - sx*cy*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.zz(), cx*cy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.zw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.tx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.ty(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.tz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerYXZ.tw(), 1, EPSILON)); } // ZXY { Matrix4 eulerZXY = Matrix4::getRotationForEulerZXYDegrees(euler); BOOST_CHECK(float_equal_epsilon(eulerZXY.xx(), cy*cz + sx*sy*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.xy(), cx*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.xz(), sx*cy*sz - sy*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.xw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.yx(), sx*sy*cz - cy*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.yy(), cx*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.yz(), sx*cy*cz + sy*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.yw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.zx(), cx*sy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.zy(), -sx, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.zz(), cx*cy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.zw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.tx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.ty(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.tz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZXY.tw(), 1, EPSILON)); } // ZYX { Matrix4 eulerZYX = Matrix4::getRotationForEulerZYXDegrees(euler); BOOST_CHECK(float_equal_epsilon(eulerZYX.xx(), cy*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.xy(), cx*sz + sx*sy*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.xz(), sx*sz - cx*sy*cz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.xw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.yx(), -cy*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.yy(), cx*cz - sx*sy*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.yz(), sx*cz + cx*sy*sz, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.yw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.zx(), sy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.zy(), -sx*cy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.zz(), cx*cy, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.zw(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.tx(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.ty(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.tz(), 0, EPSILON)); BOOST_CHECK(float_equal_epsilon(eulerZYX.tw(), 1, EPSILON)); } // Test Euler Angle retrieval (XYZ) { Matrix4 eulerXYZ = Matrix4::getRotationForEulerXYZDegrees(euler); Vector3 testEuler = eulerXYZ.getEulerAnglesXYZDegrees(); BOOST_CHECK(float_equal_epsilon(testEuler.x(), euler.x(), EPSILON)); BOOST_CHECK(float_equal_epsilon(testEuler.y(), euler.y(), EPSILON)); BOOST_CHECK(float_equal_epsilon(testEuler.z(), euler.z(), EPSILON)); } // Test Euler Angle retrieval (YXZ) { Matrix4 eulerYXZ = Matrix4::getRotationForEulerYXZDegrees(euler); Vector3 testEuler = eulerYXZ.getEulerAnglesYXZDegrees(); BOOST_CHECK(float_equal_epsilon(testEuler.x(), euler.x(), EPSILON)); BOOST_CHECK(float_equal_epsilon(testEuler.y(), euler.y(), EPSILON)); BOOST_CHECK(float_equal_epsilon(testEuler.z(), euler.z(), EPSILON)); } // Test Euler Angle retrieval (ZXY) { Matrix4 eulerZXY = Matrix4::getRotationForEulerZXYDegrees(euler); Vector3 testEuler = eulerZXY.getEulerAnglesZXYDegrees(); BOOST_CHECK(float_equal_epsilon(testEuler.x(), euler.x(), EPSILON)); BOOST_CHECK(float_equal_epsilon(testEuler.y(), euler.y(), EPSILON)); BOOST_CHECK(float_equal_epsilon(testEuler.z(), euler.z(), EPSILON)); } // Test Euler Angle retrieval (ZYX) { Matrix4 eulerZYX = Matrix4::getRotationForEulerZYXDegrees(euler); Vector3 testEuler = eulerZYX.getEulerAnglesZYXDegrees(); BOOST_CHECK(float_equal_epsilon(testEuler.x(), euler.x(), EPSILON)); BOOST_CHECK(float_equal_epsilon(testEuler.y(), euler.y(), EPSILON)); BOOST_CHECK(float_equal_epsilon(testEuler.z(), euler.z(), EPSILON)); } } BOOST_AUTO_TEST_CASE(testMultiplication) { Matrix4 a = Matrix4::byColumns(3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59); Matrix4 b = Matrix4::byColumns(61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137); Matrix4 c = a.getMultipliedBy(b); BOOST_CHECK(c.xx() == 6252); BOOST_CHECK(c.xy() == 7076); BOOST_CHECK(c.xz() == 8196); BOOST_CHECK(c.xw() == 9430); BOOST_CHECK(c.yx() == 8068); BOOST_CHECK(c.yy() == 9124); BOOST_CHECK(c.yz() == 10564); BOOST_CHECK(c.yw() == 12150); BOOST_CHECK(c.zx() == 9432); BOOST_CHECK(c.zy() == 10696); BOOST_CHECK(c.zz() == 12400); BOOST_CHECK(c.zw() == 14298); BOOST_CHECK(c.tx() == 11680); BOOST_CHECK(c.ty() == 13224); BOOST_CHECK(c.tz() == 15312); BOOST_CHECK(c.tw() == 17618); // Test Pre-Multiplication BOOST_CHECK(b.getMultipliedBy(a) == a.getPremultipliedBy(b)); // Create an affine matrix Matrix4 affineA = a; affineA.xw() = 0; affineA.yw() = 0; affineA.zw() = 0; affineA.tw() = 1; BOOST_CHECK(affineA.isAffine()); } BOOST_AUTO_TEST_CASE(testTransformation) { Matrix4 a = Matrix4::byColumns(3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59); { Vector3 v(61, 67, 71); Vector3 transformed = a.transformPoint(v); BOOST_CHECK(transformed.x() == 3156); BOOST_CHECK(transformed.y() == 3692); BOOST_CHECK(transformed.z() == 4380); Vector3 transformedDir = a.transformDirection(v); BOOST_CHECK(transformedDir.x() == 3113); BOOST_CHECK(transformedDir.y() == 3645); BOOST_CHECK(transformedDir.z() == 4327); } { Vector4 vector(83, 89, 97, 101); Vector4 transformed = a.transform(vector); BOOST_CHECK(transformed.x() == 8562); BOOST_CHECK(transformed.y() == 9682); BOOST_CHECK(transformed.z() == 11214); BOOST_CHECK(transformed.w() == 12896); } BOOST_CHECK_EQUAL(a.translation().x(), 43); BOOST_CHECK_EQUAL(a.translation().y(), 47); BOOST_CHECK_EQUAL(a.translation().z(), 53); } BOOST_AUTO_TEST_CASE(testMatrixDeterminant) { Matrix4 a = Matrix4::byColumns(3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59); BOOST_CHECK(a.getDeterminant() == -448); } BOOST_AUTO_TEST_CASE(testMatrixInversion) { Matrix4 a = Matrix4::byColumns(3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59); Matrix4 inv = a.getFullInverse(); double EPSILON = 0.00001f; BOOST_CHECK(float_equal_epsilon(inv.xx(), 0.392857f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.xy(), -0.714286f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.xz(), -0.321429f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.xw(), 0.428571f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.yx(), -0.276786f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.yy(), 0.446429f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.yz(), -0.330357f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.yw(), 0.107143f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.zx(), -0.669643f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.zy(), 0.660714f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.zz(), 0.991071f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.zw(), -0.821429f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.tx(), 0.535714f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.ty(), -0.428571f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.tz(), -0.392857f, EPSILON)); BOOST_CHECK(float_equal_epsilon(inv.tw(), 0.357143f, EPSILON)); } ������������������������������DarkRadiant-2.0.2/libs/math/test/planeTest.cpp������������������������������������������������������0000664�0000000�0000000�00000012272�12454246557�0021225�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define BOOST_TEST_DYN_LINK #define BOOST_TEST_MODULE vectorTest #include #include #include #include using namespace boost::math; namespace { const double EPSILON = 0.0000001; const double ONE_OVER_ROOT_TWO = 1.0 / constants::root_two(); } BOOST_AUTO_TEST_CASE(constructPlane) { Plane3 plane(1, 0, 0, 4); BOOST_CHECK_EQUAL(plane.normal(), Vector3(1, 0, 0)); BOOST_CHECK_EQUAL(plane.dist(), 4); Plane3 plane2(1.5, 56.4, -325, 19.23); BOOST_CHECK_EQUAL(plane2.normal(), Vector3(1.5, 56.4, -325)); BOOST_CHECK_EQUAL(plane2.dist(), 19.23); Plane3 copy = plane2; BOOST_CHECK_EQUAL(copy.normal(), Vector3(1.5, 56.4, -325)); BOOST_CHECK_EQUAL(copy.dist(), 19.23); } BOOST_AUTO_TEST_CASE(translatePlaneDirectly) { // Basic plane Plane3 plane(1, 0, 0, 2.5); plane.translate(Vector3(2, 0, 0)); BOOST_CHECK_EQUAL(plane.normal(), Vector3(1, 0, 0)); BOOST_CHECK_EQUAL(plane.dist(), 0.5); // Inclined plane Vector3 normal = Vector3(1.5, 2.6, -0.3).getNormalised(); Plane3 inclined(normal, 4.5); BOOST_CHECK_EQUAL(inclined.normal(), normal); inclined.translate(Vector3(1, 1, 0)); BOOST_CHECK_CLOSE(inclined.normal().x(), 0.49724515641972766, EPSILON); BOOST_CHECK_CLOSE(inclined.normal().y(), 0.86189160446086122, EPSILON); BOOST_CHECK_CLOSE(inclined.normal().z(), -0.0994490312834552, EPSILON); // Check that a plane transformed by a translation matrix matches the // plane's own translation function Vector3 normal3 = Vector3(0.5, 1.24, 56).getNormalised(); Plane3 plane3(normal3, -56.1); Vector3 transVec(1.5, 45, -2.29); Matrix4 transMat = Matrix4::getTranslation(transVec); Plane3 p3_matrix = plane3.transformed(transMat); Plane3 p3_trans = plane3; p3_trans.translate(transVec); BOOST_CHECK_CLOSE(p3_matrix.normal().x(), p3_trans.normal().x(), EPSILON); BOOST_CHECK_CLOSE(p3_matrix.normal().y(), p3_trans.normal().y(), EPSILON); BOOST_CHECK_CLOSE(p3_matrix.normal().z(), p3_trans.normal().z(), EPSILON); } BOOST_AUTO_TEST_CASE(translatePlaneWithMatrix) { // Plane for y = 5 Plane3 plane(0, 1, 0, 5); BOOST_CHECK_EQUAL(plane.normal(), Vector3(0, 1, 0)); // Translate the plane by 3 in the Y direction Matrix4 trans = Matrix4::getTranslation(Vector3(0, 3, 0)); Plane3 newPlane = plane.transformed(trans); // The normal should not have changed but the distance should, although for // some reason the translation happens backwards (i.e. negative Y) BOOST_CHECK_EQUAL(newPlane.normal(), Vector3(0, 1, 0)); BOOST_CHECK_EQUAL(newPlane.dist(), 2); // Inclined plane Plane3 inclined(1, -1, 0, 0); BOOST_CHECK_EQUAL(inclined.dist(), 0); // Again move 3 in the Y direction Plane3 newInclined = inclined.transformed(trans); // Again there should be no normal change, but a distance change BOOST_CHECK_EQUAL(newInclined.normal(), Vector3(1, -1, 0)); BOOST_CHECK_EQUAL(newInclined.dist(), 3); // If moved along Z the distance should not change Plane3 movedZ = inclined.transformed( Matrix4::getTranslation(Vector3(0, 0, 2.3)) ); BOOST_CHECK_EQUAL(movedZ.normal(), Vector3(1, -1, 0)); BOOST_CHECK_EQUAL(movedZ.dist(), 0); } BOOST_AUTO_TEST_CASE(rotatePlane) { // A plane at 5 in the Y direction Plane3 plane(0, 1, 0, 5); // Rotate 45 degrees around the Z axis Matrix4 rot = Matrix4::getRotation( Vector3(0, 0, 1), constants::pi() / 4 ); Plane3 rotated = plane.transformed(rot); BOOST_CHECK_CLOSE(rotated.normal().x(), ONE_OVER_ROOT_TWO, EPSILON); BOOST_CHECK_CLOSE(rotated.normal().y(), ONE_OVER_ROOT_TWO, EPSILON); BOOST_CHECK_EQUAL(rotated.normal().z(), 0); } BOOST_AUTO_TEST_CASE(scalePlane) { Plane3 plane(1, -1, 0, 3.5); // Scale the plane by a factor of 2 Matrix4 times2 = Matrix4::getScale(Vector3(2, 2, 2)); Plane3 scaled = plane.transformed(times2); BOOST_CHECK_EQUAL(scaled.normal().x(), 2); BOOST_CHECK_EQUAL(scaled.normal().y(), -2); BOOST_CHECK_EQUAL(scaled.normal().z(), 0); BOOST_CHECK_EQUAL(scaled.dist(), 28); } BOOST_AUTO_TEST_CASE(transformPlane) { // Check transform with some randomly-generated values with no particular // geometric meaning Plane3 plane(-2.643101, -47.856364, 17.5173264, -35.589485); Plane3 copy = plane; Matrix4 arbMatrix = Matrix4::byRows( -30.1065587, -28.048640, -10.003604, 18.986724, 18.94792014, -16.186764, -8.7790217, -32.59777, 12.85452125, -8.8305872, -36.502315, 32.345895, 0, 0, 0, 1 ); Plane3 transformed = plane.transformed(arbMatrix); BOOST_CHECK_EQUAL(plane, copy); // must not be changed by transformed() // TODO: Improve the maths so that this works more accurately static const double ROUGH_EPSILON = 0.001; BOOST_CHECK_CLOSE(transformed.normal().x(), 1246.64431, ROUGH_EPSILON); BOOST_CHECK_CLOSE(transformed.normal().y(), 570.775895, ROUGH_EPSILON); BOOST_CHECK_CLOSE(transformed.normal().z(), -250.79896, ROUGH_EPSILON); BOOST_CHECK_CLOSE(transformed.dist(), -69140351.87, EPSILON); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/math/test/quaternionTest.cpp�������������������������������������������������0000664�0000000�0000000�00000004043�12454246557�0022310�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define BOOST_TEST_DYN_LINK #define BOOST_TEST_MODULE quaternionTest #include #include BOOST_AUTO_TEST_CASE(testQuaternions) { Quaternion q1(3, 5, 7, 11); Quaternion q2(13, 17, 19, 23); Quaternion product = q1.getMultipliedBy(q2); BOOST_CHECK(product.x() == 188); BOOST_CHECK(product.y() == 336); BOOST_CHECK(product.z() == 356); BOOST_CHECK(product.w() == -4); Quaternion q1multiplied = q1; q1multiplied.multiplyBy(q2); BOOST_CHECK(q1multiplied.x() == 188); BOOST_CHECK(q1multiplied.y() == 336); BOOST_CHECK(q1multiplied.z() == 356); BOOST_CHECK(q1multiplied.w() == -4); Quaternion q1inverted = q1.getInverse(); BOOST_CHECK(q1inverted.x() == -3); BOOST_CHECK(q1inverted.y() == -5); BOOST_CHECK(q1inverted.z() == -7); BOOST_CHECK(q1inverted.w() == 11); Quaternion normalised = q1.getNormalised(); const double EPSILON = 0.0001f; BOOST_CHECK_CLOSE(normalised.x(), 0.2100420126042014f, EPSILON); BOOST_CHECK_CLOSE(normalised.y(), 0.3500700210070024f, EPSILON); BOOST_CHECK_CLOSE(normalised.z(), 0.4900980294098034f, EPSILON); BOOST_CHECK_CLOSE(normalised.w(), 0.7701540462154054f, EPSILON); Vector3 point(13, 17, 19); Vector3 transformed = q1.transformPoint(point); BOOST_CHECK(transformed.x() == q1.w()*q1.w()*point.x() + 2*q1.y()*q1.w()*point.z() - 2*q1.z()*q1.w()*point.y() + q1.x()*q1.x()*point.x() + 2*q1.y()*q1.x()*point.y() + 2*q1.z()*q1.x()*point.z() - q1.z()*q1.z()*point.x() - q1.y()*q1.y()*point.x()); BOOST_CHECK(transformed.y() == 2*q1.x()*q1.y()*point.x() + q1.y()*q1.y()*point.y() + 2*q1.z()*q1.y()*point.z() + 2*q1.w()*q1.z()*point.x() - q1.z()*q1.z()*point.y() + q1.w()*q1.w()*point.y() - 2*q1.x()*q1.w()*point.z() - q1.x()*q1.x()*point.y()); BOOST_CHECK(transformed.z() == 2*q1.x()*q1.z()*point.x() + 2*q1.y()*q1.z()*point.y() + q1.z()*q1.z()*point.z() - 2*q1.w()*q1.y()*point.x() - q1.y()*q1.y()*point.z() + 2*q1.w()*q1.x()*point.y() - q1.x()*q1.x()*point.z() + q1.w()*q1.w()*point.z()); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/math/test/vectorTest.cpp�����������������������������������������������������0000664�0000000�0000000�00000000474�12454246557�0021431�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define BOOST_TEST_DYN_LINK #define BOOST_TEST_MODULE vectorTest #include #include BOOST_AUTO_TEST_CASE(constructVector3) { Vector3 vec(1.0, 2.0, 3.5); BOOST_CHECK_EQUAL(vec.x(), 1.0); BOOST_CHECK_EQUAL(vec.y(), 2.0); BOOST_CHECK_EQUAL(vec.z(), 3.5); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/moduleobservers.h������������������������������������������������������������0000664�0000000�0000000�00000004700�12454246557�0020240�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_MODULEOBSERVERS_H) #define INCLUDED_MODULEOBSERVERS_H #include "debugging/debugging.h" #include #include "imodule.h" #ifdef _DEBUG #include #endif #include class ModuleObservers { typedef std::set Observers; Observers m_observers; // greebo: Added this to make debugging easier, so that // the warning in the destructor provides more information. std::string _ownerName; public: // Default constructor, for backwards compatibility ModuleObservers() : _ownerName("Owner unknown.") {} ModuleObservers(const std::string& ownerName) : _ownerName(ownerName) {} #ifdef _DEBUG // Warning if observers still attached in destructor (may not be necessary, // replaces previous ASSERT. ~ModuleObservers() { if (!m_observers.empty()) { std::cout << "Warning: destroying ModuleObservers with " << m_observers.size() << " observers attached." << " (Owner: " << _ownerName << ")" << std::endl; } } #endif void attach(ModuleObserver& observer) { ASSERT_MESSAGE(m_observers.find(&observer) == m_observers.end(), "ModuleObservers::attach: cannot attach observer"); m_observers.insert(&observer); } void detach(ModuleObserver& observer) { ASSERT_MESSAGE(m_observers.find(&observer) != m_observers.end(), "ModuleObservers::detach: cannot detach observer"); m_observers.erase(&observer); } void realise() { for(Observers::iterator i = m_observers.begin(); i != m_observers.end(); ++i) { (*i)->realise(); } } void unrealise() { for(Observers::reverse_iterator i = m_observers.rbegin(); i != m_observers.rend(); ++i) { (*i)->unrealise(); } } }; #endif ����������������������������������������������������������������DarkRadiant-2.0.2/libs/os/��������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12454246557�0015267�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/os/dir.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000001431�12454246557�0016550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "dir.h" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/os/dir.h���������������������������������������������������������������������0000664�0000000�0000000�00000006753�12454246557�0016231�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#pragma once /// \file /// \brief OS directory-listing object. #include namespace fs = boost::filesystem; #include #include #if 0 inline bool directory_good(Directory* directory) { return directory != 0; } inline Directory* directory_open(const std::string& name) { return g_dir_open(name.c_str(), 0, 0); } inline void directory_close(Directory* directory) { g_dir_close(directory); } inline const char* directory_read_and_increment(Directory* directory) { return g_dir_read_name(directory); } #endif // greebo: Moved this from GtkRadiant's cmdlib.h to here // some easy portability crap #define access_owner_read 0400 #define access_owner_write 0200 #define access_owner_execute 0100 #define access_owner_rw_ 0600 #define access_owner_r_x 0500 #define access_owner__wx 0300 #define access_owner_rwx 0700 #define access_group_read 0040 #define access_group_write 0020 #define access_group_execute 0010 #define access_group_rw_ 0060 #define access_group_r_x 0050 #define access_group__wx 0030 #define access_group_rwx 0070 #define access_others_read 0004 #define access_others_write 0002 #define access_others_execute 0001 #define access_others_rw_ 0006 #define access_others_r_x 0005 #define access_others__wx 0003 #define access_others_rwx 0007 #define access_rwxrwxr_x (access_owner_rwx | access_group_rwx | access_others_r_x) #define access_rwxrwxrwx (access_owner_rwx | access_group_rwx | access_others_rwx) namespace os { /** * Exception thrown by Directory_forEach to indicate that the given directory * does not exist. */ class DirectoryNotFoundException : public std::runtime_error { public: DirectoryNotFoundException(const std::string& what) : std::runtime_error(what) {} }; // Invoke functor for all items in a directory inline void foreachItemInDirectory(const std::string& path, const std::function& functor) { fs::path start(path); if (!fs::exists(start)) { throw DirectoryNotFoundException( "foreachItemInDirectory(): invalid directory '" + path + "'" ); } for (fs::directory_iterator it(start); it != fs::directory_iterator(); ++it) { const fs::path& candidate = *it; functor(candidate); } #if 0 Directory* dir = directory_open(path); if (directory_good(dir)) { for (;;) { const char* name = directory_read_and_increment(dir); if (name == 0) { break; } functor(name); } directory_close(dir); } else { throw DirectoryNotFoundException( "Directory_forEach(): invalid directory '" + path + "'" ); } #endif } } // namespace #ifdef WIN32 #include namespace os { /** * \brief * Create the named directory if it doesn't exist * * \return * true if the directory was created or already exists, false if there was an * error. */ inline bool makeDirectory(const std::string& name) { int mkVal = _mkdir(name.c_str()); if (mkVal == -1) { int err; _get_errno(&err); if (err == EEXIST) { return true; } else { std::cerr << "os::makeDirectory(" << name << ") failed with error " << err << std::endl; return false; } } return true; } } // namespace os #else // POSIX #include namespace os { // returns true if succeeded in creating directory inline bool makeDirectory(const std::string& name) { return mkdir(name.c_str(), access_rwxrwxr_x) != -1; } } // namespace os #endif ���������������������DarkRadiant-2.0.2/libs/os/file.cpp������������������������������������������������������������������0000664�0000000�0000000�00000001432�12454246557�0016712�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "file.h" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/os/file.h��������������������������������������������������������������������0000664�0000000�0000000�00000011377�12454246557�0016370�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_OS_FILE_H) #define INCLUDED_OS_FILE_H /// \file /// \brief OS file-system querying and manipulation. #if defined( WIN32 ) #define S_ISDIR(mode) (mode & _S_IFDIR) #include // _access() #if defined(_MSC_VER) // greebo: These are needed in VC++ 2005 Express + Platform SDK #define F_OK 0x00 #define W_OK 0x02 #define R_OK 0x04 #endif #define access(path, mode) _access(path, mode) #else #include // access() #endif #include // rename(), remove() #include // stat() #include // this is included by stat.h on win32 #include #include #include "debugging/debugging.h" /// \brief Attempts to move the file identified by \p from to \p to and returns true if the operation was successful. /// /// The operation will fail unless: /// - The path \p from identifies an existing file which is accessible for writing. /// - The directory component of \p from identifies an existing directory which is accessible for writing. /// - The path \p to does not identify an existing file or directory. /// - The directory component of \p to identifies an existing directory which is accessible for writing. inline bool file_move(const char* from, const char* to) { ASSERT_MESSAGE(from != 0 && to != 0, "file_move: invalid path"); return rename(from, to) == 0; } /// \brief Attempts to remove the file identified by \p path and returns true if the operation was successful. /// /// The operation will fail unless: /// - The \p path identifies an existing file. /// - The parent-directory component of \p path identifies an existing directory which is accessible for writing. inline bool file_remove(const char* path) { ASSERT_MESSAGE(path != 0, "file_remove: invalid path"); return remove(path) == 0; } namespace FileAccess { enum Mode { Read = R_OK, Write = W_OK, ReadWrite = Read | Write, Exists = F_OK }; } /// \brief Returns true if the file or directory identified by \p path exists and/or may be accessed for reading, writing or both, depending on the value of \p mode. inline bool file_accessible(const char* path, FileAccess::Mode mode) { ASSERT_MESSAGE(path != 0, "file_accessible: invalid path"); return access(path, static_cast(mode)) == 0; } /// \brief Returns true if the file or directory identified by \p path exists and may be opened for reading. inline bool file_readable(const char* path) { return file_accessible(path, FileAccess::Read); } /// \brief Returns true if the file or directory identified by \p path exists and may be opened for writing. inline bool file_writeable(const char* path) { return file_accessible(path, FileAccess::Write); } namespace os { /// \brief Returns true if the file or directory identified by \p path exists. inline bool fileOrDirExists(const std::string& path) { return file_accessible(path.c_str(), FileAccess::Exists); } } /// \brief Returns true if the file or directory identified by \p path exists and is a directory. inline bool file_is_directory(const char* path) { ASSERT_MESSAGE(path != 0, "file_is_directory: invalid path"); struct stat st; if(stat(path, &st) == -1) { return false; } return S_ISDIR (st.st_mode) != 0; } typedef std::size_t FileSize; /// \brief Returns the size in bytes of the file identified by \p path, or 0 if the file was not found. inline FileSize file_size(const char* path) { ASSERT_MESSAGE(path != 0, "file_size: invalid path"); struct stat st; if(stat(path, &st) == -1) { return 0; } return st.st_size; } /// Seconds elapsed since Jan 1, 1970 typedef std::time_t FileTime; /// No file can have been modified earlier than this time. const FileTime c_invalidFileTime = -1; /// \brief Returns the time that the file identified by \p path was last modified, or c_invalidFileTime if the file was not found. inline FileTime file_modified(const char* path) { ASSERT_MESSAGE(path != 0, "file_modified: invalid path"); struct stat st; if(stat(path, &st) == -1) { return c_invalidFileTime; } return st.st_mtime; } #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/os/fs.h����������������������������������������������������������������������0000664�0000000�0000000�00000002630�12454246557�0016051�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * \file * Helper header for boost::filesystem. Includes the relevant Boost headers, * defines the common "fs" namespace alias, and includes some helper functions * to deal with the transition from Filesystem V2 to V3. */ #pragma once #include #include #include namespace fs = boost::filesystem; namespace os { /// Return the string filename of a path object inline std::string filename_from_path(const fs::path& p) { #if BOOST_VERSION < 104600 return p.filename(); #else return p.filename().string(); #endif } /// Return a string for the given path in platform-independent format inline std::string string_from_path(const fs::path& p) { #if BOOST_VERSION < 104600 return p.string(); // in contrast to file_string() (native format) #else return p.generic_string(); // in this case string() is native format #endif } /// Overload of standardPathWithSlash that accepts a fs::path inline std::string standardPathWithSlash(const fs::path& p) { std::string genString = string_from_path(p); // Just add slash if needed, we don't need to convert intermediate // slashes since string_from_path will already have done that. if (!boost::algorithm::ends_with(genString, "/")) { genString += "/"; } return genString; } } ��������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/os/path.cpp������������������������������������������������������������������0000664�0000000�0000000�00000001431�12454246557�0016726�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "path.h" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/os/path.h��������������������������������������������������������������������0000664�0000000�0000000�00000017715�12454246557�0016407�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined (INCLUDED_OS_PATH_H) #define INCLUDED_OS_PATH_H /// \file /// \brief OS file-system path comparison, decomposition and manipulation. /// /// - Paths are c-style null-terminated-character-arrays. /// - Path separators must be forward slashes (unix style). /// - Directory paths must end in a separator. /// - Paths must not contain the ascii characters \\ : * ? " < > or |. /// - Paths may be encoded in UTF-8 or any extended-ascii character set. #include "string/string.h" #include #include #if defined(WIN32) #define OS_CASE_INSENSITIVE #endif /// \brief Returns true if \p path is lexicographically sorted before \p other. /// If both \p path and \p other refer to the same file, neither will be sorted before the other. /// O(n) inline bool path_less(const char* path, const char* other) { #if defined(OS_CASE_INSENSITIVE) return string_less_nocase(path, other); #else return string_less(path, other); #endif } /// \brief Returns <0 if \p path is lexicographically less than \p other. /// Returns >0 if \p path is lexicographically greater than \p other. /// Returns 0 if both \p path and \p other refer to the same file. /// O(n) inline int path_compare(const char* path, const char* other) { #if defined(OS_CASE_INSENSITIVE) return string_compare_nocase(path, other); #else return string_compare(path, other); #endif } /// \brief Returns true if \p path and \p other refer to the same file or directory. /// O(n) inline bool path_equal(const char* path, const char* other) { #if defined(OS_CASE_INSENSITIVE) return string_equal_nocase(path, other); #else return string_equal(path, other); #endif } /// \brief Returns true if the first \p n bytes of \p path and \p other form paths that refer to the same file or directory. /// If the paths are UTF-8 encoded, [\p path, \p path + \p n) must be a complete path. /// O(n) inline bool path_equal_n(const char* path, const char* other, std::size_t n) { #if defined(OS_CASE_INSENSITIVE) return string_equal_nocase_n(path, other, n); #else return string_equal_n(path, other, n); #endif } /// \brief Returns true if \p path is a fully qualified file-system path. /// O(1) inline bool path_is_absolute(const char* path) { #if defined(WIN32) return path[0] == '/' || (path[0] != '\0' && path[1] == ':'); // local drive #elif defined(POSIX) return path[0] == '/'; #endif } /// \brief Returns true if \p path is a directory. /// O(n) inline bool path_is_directory(const char* path) { std::size_t length = strlen(path); if(length > 0) { return path[length-1] == '/'; } return false; } /// \brief Returns a pointer to the first character of the component of \p path following the first directory component. /// O(n) inline const char* path_remove_directory(const char* path) { const char* first_separator = strchr(path, '/'); if(first_separator != 0) { return ++first_separator; } return ""; } /// \brief Returns a pointer to the first character of the filename component of \p path. /// O(n) inline const char* path_get_filename_start(const char* path) { { const char* last_forward_slash = strrchr(path, '/'); if(last_forward_slash != 0) { return last_forward_slash + 1; } } // not strictly necessary,since paths should not contain '\' { const char* last_backward_slash = strrchr(path, '\\'); if(last_backward_slash != 0) { return last_backward_slash + 1; } } return path; } /// \brief Returns a pointer to the first character of the file extension of \p path, or "" if not found. /// O(n) inline const char* path_get_extension(const char* path) { const char* last_period = strrchr(path_get_filename_start(path), '.'); if(last_period != 0) { return ++last_period; } return ""; } /** General utility functions for OS-related tasks */ namespace os { /** Convert the slashes in a Doom 3 path to forward-slashes. Doom 3 accepts either * forward or backslashes in its definitions */ inline std::string standardPath(const std::string& inPath) { return boost::algorithm::replace_all_copy(inPath, "\\", "/"); } /** greebo: OS Folder names have forward slashes and a trailing slash * at the end by convention. */ inline std::string standardPathWithSlash(const std::string& input) { std::string output = standardPath(input); // Append a slash at the end, if there isn't already one if (!boost::algorithm::ends_with(output, "/")) { output += "/"; } return output; } /** * Return the path of fullPath relative to basePath, as long as fullPath * is contained within basePath. If not, fullPath is returned unchanged. */ inline std::string getRelativePath(const std::string& fullPath, const std::string& basePath) { #ifdef OS_CASE_INSENSITIVE if (boost::algorithm::istarts_with(fullPath, basePath)) #else if (boost::algorithm::starts_with(fullPath, basePath)) #endif { return fullPath.substr(basePath.length()); } else { return fullPath; } } /** * stifu: Does the same as getRelativePath, but also strips the filename. */ inline std::string getRelativePathMinusFilename(const std::string& fullPath, const std::string& basePath) { #ifdef OS_CASE_INSENSITIVE if (boost::algorithm::istarts_with(fullPath, basePath)) #else if (boost::algorithm::starts_with(fullPath, basePath)) #endif { return fullPath.substr(basePath.length(), fullPath.rfind('/') - basePath.length()); } else { return fullPath; } } /** * greebo: Get the filename contained in the given path (the part after the last slash). * If there is no filename, an empty string is returned. * * Note: The input string is expected to be standardised (forward slashes). */ inline std::string getFilename(const std::string& path) { std::size_t slashPos = path.rfind('/'); if (slashPos == std::string::npos) { return ""; } else { return path.substr(slashPos + 1); } } /** * Get the extension of the given filename. If there is no extension, an * empty string is returned. */ inline std::string getExtension(const std::string& path) { std::size_t dotPos = path.rfind('.'); if (dotPos == std::string::npos) { return ""; } else { return path.substr(dotPos + 1); } } /** * Get the containing folder of the specified object. This is calculated * as the directory before the rightmost slash (which will be the object * itself, if the pathname ends in a slash). * * If the path does not contain a slash, the empty string will be returned. * * E.g. * blah/bleh/file -> "bleh" * blah/bloog/ -> "bloog" */ inline std::string getContainingDir(const std::string& path) { std::size_t lastSlash = path.rfind('/'); if (lastSlash == std::string::npos) { return ""; } std::string trimmed = path.substr(0, lastSlash); lastSlash = trimmed.rfind('/'); return trimmed.substr(lastSlash + 1); } } #endif ���������������������������������������������������DarkRadiant-2.0.2/libs/parser/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�12454246557�0016142�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/parser/CodeTokeniser.h�������������������������������������������������������0000664�0000000�0000000�00000054577�12454246557�0021073�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef _CODE_TOKENISER_H_ #define _CODE_TOKENISER_H_ #include "iarchive.h" #include "DefTokeniser.h" #include #include #include #include #include #include "Tokeniser.h" namespace parser { // Code tokeniser function, with special treatment for #define statements class CodeTokeniserFunc { // Enumeration of states enum { SEARCHING, // haven't found anything yet TOKEN_STARTED, // found the start of a possible multi-char token AFTER_DEFINE, // after parsing a #define command AFTER_DEFINE_BACKSLASH, // after a #define token, encountering a backslash AFTER_DEFINE_SEARCHING_FOR_EOL, // after a #define token, after encountering a backslash AFTER_DEFINE_FORWARDSLASH, // after parsing when encountering a forward slash QUOTED, // inside quoted text, no tokenising AFTER_CLOSING_QUOTE, // right after a quoted text, checking for backslash SEARCHING_FOR_QUOTE, // searching for continuation of quoted string (after a backslash was found) FORWARDSLASH, // forward slash found, possible comment coming COMMENT_EOL, // double-forwardslash comment COMMENT_DELIM, // inside delimited comment (/*) STAR // asterisk, possibly indicates end of comment (*/) } _state; // List of delimiters to skip const char* _delims; // List of delimiters to keep const char* _keptDelims; // Test if a character is a delimiter bool isDelim(char c) { const char* curDelim = _delims; while (*curDelim != 0) { if (*(curDelim++) == c) { return true; } } return false; } // Test if a character is a kept delimiter bool isKeptDelim(char c) { const char* curDelim = _keptDelims; while (*curDelim != 0) { if (*(curDelim++) == c) { return true; } } return false; } public: // Constructor CodeTokeniserFunc(const char* delims, const char* keptDelims) : _state(SEARCHING), _delims(delims), _keptDelims(keptDelims) {} /* REQUIRED. Operator() is called by the boost::tokenizer. This function * must search for a token between the two iterators next and end, and if * a token is found, set tok to the token, set next to position to start * parsing on the next call, and return true. */ template bool operator() (InputIterator& next, InputIterator end, Token& tok) { // Initialise state, no persistence between calls _state = SEARCHING; // Clear out the token, no guarantee that it is empty tok = ""; while (next != end) { switch (_state) { case SEARCHING: // If we have a delimiter, just advance to the next character if (isDelim(*next)) { ++next; continue; } // If we have a KEPT delimiter, this is the token to return. if (isKeptDelim(*next)) { tok = *(next++); return true; } // Otherwise fall through into TOKEN_STARTED, saving the state for the // next iteration _state = TOKEN_STARTED; case TOKEN_STARTED: // Here a delimiter indicates a successful token match if (isDelim(*next) || isKeptDelim(*next)) { // Check the token for possible preprocessor #define if (tok == "#define") { _state = AFTER_DEFINE; continue; } return true; } // Now next is pointing at a non-delimiter. Switch on this // character. switch (*next) { // Found a quote, enter QUOTED state, or return the // current token if we are in the process of building // one. case '\"': if (tok != "") { return true; } else { _state = QUOTED; ++next; continue; // skip the quote } // Found a slash, possibly start of comment case '/': _state = FORWARDSLASH; ++next; continue; // skip slash, will need to add it back if this is not a comment // General case. Token lasts until next delimiter. default: tok += *next; ++next; continue; } case AFTER_DEFINE: // Collect token until EOL is found if (*next == '\r' || *next == '\n') { _state = SEARCHING; ++next; return true; } else if (*next == '\\') { // Found a backslash, this can be used to connect lines _state = AFTER_DEFINE_BACKSLASH; ++next; continue; } else if (*next == '/') { // This could be a (line) comment starting here _state = AFTER_DEFINE_FORWARDSLASH; ++next; continue; } else { tok += *next; ++next; continue; // do nothing } case AFTER_DEFINE_BACKSLASH: // Skip delimiters if (!isDelim(*next)) { // False alarm, not a delimiter after the backslash tok += '\\'; tok += *next; _state = AFTER_DEFINE; ++next; continue; } // Skip delimiters until next line break _state = AFTER_DEFINE_SEARCHING_FOR_EOL; // FALL THROUGH to AFTER_DEFINE_SEARCHING_FOR_EOL case AFTER_DEFINE_SEARCHING_FOR_EOL: // Search for EOL if (*next == '\r' || *next == '\n') { tok += '\n'; // add the line break to the token _state = AFTER_DEFINE; } ++next; continue; case AFTER_DEFINE_FORWARDSLASH: if (*next == '/') { // This is the second forward slash, we're in line comment mode now _state = COMMENT_EOL; ++next; continue; } else if (*next == '*') { // This is a star, we're in block comment mode now _state = COMMENT_DELIM; ++next; continue; } else { // False alarm, add the first slash and this character tok += '/'; // Switch back to DEFINE mode _state = AFTER_DEFINE; continue; } case QUOTED: // In the quoted state, just advance until the closing // quote. No delimiter splitting is required. if (*next == '\"') { ++next; // greebo: We've found a closing quote, but there might be a backslash indicating // a multi-line string constant "" \ "", so switch to AFTER_CLOSING_QUOTE mode _state = AFTER_CLOSING_QUOTE; continue; } else if (*next == '\\') { // Escape found, check next character ++next; if (next != end) { if (*next == 'n') // Linebreak { tok += '\n'; } else if (*next == 't') // Tab { tok += '\t'; } else if (*next == '"') // Quote { tok += '"'; } else { // No special escape sequence, add the backslash tok += '\\'; // Plus the character itself tok += *next; } ++next; } continue; } else { tok += *next; ++next; continue; } case AFTER_CLOSING_QUOTE: // We already have a valid string token in our hands, but it might be continued // if one of the next tokens is a backslash if (*next == '\\') { // We've found a backslash right after a closing quote, this indicates we could // proceed with parsing quoted content ++next; _state = SEARCHING_FOR_QUOTE; continue; } // Ignore delimiters if (isDelim(*next)) { ++next; continue; } // Everything except delimiters and backslashes indicates that // the quoted content is not continued, so break the loop. // This returns the token and parsing continues. // Return TRUE in any case, even if the parsed token is empty (""). return true; case SEARCHING_FOR_QUOTE: // We have found a backslash after a closing quote, search for an opening quote // Step over delimiters if (isDelim(*next)) { ++next; continue; } if (*next == '\"') { // Found the desired opening quote, switch to QUOTED ++next; _state = QUOTED; continue; } // Everything except delimiters or opening quotes indicates an error throw ParseException("Could not find opening double quote after backslash."); case FORWARDSLASH: // If we have a forward slash we may be entering a comment. The forward slash // will NOT YET have been added to the token, so we must add it manually if // this proves not to be a comment. switch (*next) { case '*': _state = COMMENT_DELIM; ++next; continue; case '/': _state = COMMENT_EOL; ++next; continue; default: // false alarm, add the slash and carry on _state = SEARCHING; tok += "/"; // Do not increment next here continue; } case COMMENT_DELIM: // Inside a delimited comment, we add nothing to the token but check for // the "*/" sequence. if (*next == '*') { _state = STAR; ++next; continue; } else { ++next; continue; // ignore and carry on } case COMMENT_EOL: // This comment lasts until the end of the line. if (*next == '\r' || *next == '\n') { _state = SEARCHING; ++next; // If we have a token after a line comment, return it if (tok != "") { return true; } else { continue; } } else { ++next; continue; // do nothing } case STAR: // The star may indicate the end of a delimited comment. // This state will only be entered if we are inside a // delimited comment. if (*next == '/') { // End of comment _state = SEARCHING; ++next; continue; } else if (*next == '*') { // Another star, remain in the STAR state in case we // have a "**/" end of comment. _state = STAR; ++next; continue; } else { // No end of comment _state = COMMENT_DELIM; ++next; continue; } } // end of state switch } // end of for loop // Return true if we have added anything to the token if (tok != "") return true; else return false; } // REQUIRED. Reset function to clear internal state void reset() { _state = SEARCHING; } }; class SingleCodeFileTokeniser : public DefTokeniser { // Istream iterator type typedef std::istream_iterator CharStreamIterator; // Internal Boost tokenizer and its iterator typedef boost::tokenizer CharTokeniser; CharTokeniser _tok; CharTokeniser::iterator _tokIter; private: // Helper function to set noskipws on the input stream. static std::istream& setNoskipws(std::istream& is) { is >> std::noskipws; return is; } public: /** * Construct a SingleCodeFileTokeniser with the given input stream, and optionally * a list of separators. * * @param str * The std::istream to tokenise. This is a non-const parameter, since tokens * will be extracted from the stream. * * @param delims * The list of characters to use as delimiters. * * @param keptDelims * String of characters to treat as delimiters but return as tokens in their * own right. */ SingleCodeFileTokeniser(std::istream& str, const char* delims = WHITESPACE, const char* keptDelims = "{}(),") : _tok(CharStreamIterator(setNoskipws(str)), // start iterator CharStreamIterator(), // end (null) iterator CodeTokeniserFunc(delims, keptDelims)), _tokIter(_tok.begin()) { } /** * Test if this StringTokeniser has more tokens to return. * * @returns * true if there are further tokens, false otherwise */ bool hasMoreTokens() const { return _tokIter != _tok.end(); } /** * Return the next token in the sequence. This function consumes * the returned token and advances the internal state to the following * token. * * @returns * std::string containing the next token in the sequence. * * @pre * hasMoreTokens() must be true, otherwise an exception will be thrown. */ std::string nextToken() { if (hasMoreTokens()) return *(_tokIter++); else throw ParseException("DefTokeniser: no more tokens"); } std::string peek() const { if (hasMoreTokens()) { return *_tokIter; } else { throw ParseException("DefTokeniser: no more tokens"); } } }; /** * High-level tokeniser taking a specific VFS file as input. * It is able to handle preprocessor statements like #include * by maintaining several child tokenisers. This can be used * to parse code-like files as Doom 3 Scripts or GUIs. * * Note: Don't expect this tokeniser to be particularly fast. */ class CodeTokeniser : public DefTokeniser { private: struct ParseNode { ArchiveTextFilePtr archive; std::istream inputStream; SingleCodeFileTokeniser tokeniser; ParseNode(const ArchiveTextFilePtr& archive_, const char* delims, const char* keptDelims) : archive(archive_), inputStream(&archive->getInputStream()), tokeniser(inputStream, delims, keptDelims) {} }; typedef std::shared_ptr ParseNodePtr; // The stack of child tokenisers typedef std::list NodeList; NodeList _nodes; NodeList::iterator _curNode; // A set of visited files to catch infinite include loops typedef std::list FileNameStack; FileNameStack _fileStack; typedef std::list StringList; // A map associating #define names with a one or more sub-tokens typedef std::map DefinitionMap; DefinitionMap _definitions; // A small local buffer which is needed to properly resolve #define statements // which could consist of several tokens themselves StringList _tokenBuffer; const char* _delims; const char* _keptDelims; public: /** * Construct a CodeTokeniser with the given text file from the VFS. */ CodeTokeniser(const ArchiveTextFilePtr& file, const char* delims = " \t\n\v\r", const char* keptDelims = "{}(),;") : _delims(delims), _keptDelims(keptDelims) { _nodes.push_back(ParseNodePtr(new ParseNode(file, _delims, _keptDelims))); _curNode = _nodes.begin(); _fileStack.push_back(file->getName()); fillTokenBuffer(); } bool hasMoreTokens() const { return !_tokenBuffer.empty(); } std::string nextToken() { if (_tokenBuffer.empty()) { throw ParseException("No more tokens."); } std::string temp = _tokenBuffer.front(); _tokenBuffer.pop_front(); // Keep the buffer filled if (_tokenBuffer.empty()) { fillTokenBuffer(); } return temp; } std::string peek() const { if (_tokenBuffer.empty()) { throw ParseException("No more tokens."); } return _tokenBuffer.front(); } private: void fillTokenBuffer() { while (_curNode != _nodes.end()) { if (!(*_curNode)->tokeniser.hasMoreTokens()) { _fileStack.pop_back(); ++_curNode; continue; } std::string token = (*_curNode)->tokeniser.nextToken(); // Don't treat #strNNNN as preprocessor tokens if (!token.empty() && token[0] == '#' && !boost::algorithm::starts_with(token, "#str")) { // A pre-processor token is ahead handlePreprocessorToken(token); continue; } _tokenBuffer.push_front(token); // Found a non-preprocessor token while (!_tokenBuffer.empty()) { // Exit if the first buffer token is processed if (!processFirstBufferToken()) { return; } } } } // Checks if the first token in the buffer is to be replaced by some #define // Returns true if the token got processed (the buffer is changed then) bool processFirstBufferToken() { if (_tokenBuffer.empty()) return false; // Check if this is matching a preprocessor definition DefinitionMap::const_iterator found = _definitions.find(_tokenBuffer.front()); if (found != _definitions.end()) { // Remove the token _tokenBuffer.pop_front(); // Replace the token by the #defined contents _tokenBuffer.insert(_tokenBuffer.begin(), found->second.begin(), found->second.end()); return true; } return false; } void handlePreprocessorToken(const std::string& token) { if (token == "#include") { std::string includeFile = (*_curNode)->tokeniser.nextToken(); ArchiveTextFilePtr file = GlobalFileSystem().openTextFile(includeFile); if (file != NULL) { // Catch infinite recursions FileNameStack::const_iterator found = std::find(_fileStack.begin(), _fileStack.end(), file->getName()); if (found == _fileStack.end()) { // Push a new parse node and switch _fileStack.push_back(file->getName()); _curNode = _nodes.insert( _curNode, ParseNodePtr(new ParseNode(file, _delims, _keptDelims)) ); } else { rError() << "Caught infinite loop on parsing #include token: " << includeFile << " in " << (*_curNode)->archive->getName() << std::endl; } } else { rWarning() << "Couldn't find include file: " << includeFile << " in " << (*_curNode)->archive->getName() << std::endl; } } else if (boost::algorithm::starts_with(token, "#define")) { std::string defineToken = token; if (defineToken.length() <= 7) { rWarning() << "Invalid #define statement: " << " in " << (*_curNode)->archive->getName() << std::endl; return; } // Replace tabs with spaces std::replace(defineToken.begin(), defineToken.end(), '\t', ' '); // Cut off the "#define " (including space) std::string key = defineToken.substr(8); std::size_t firstSpace = key.find(' '); // Extract the value (can be empty) and trim it (everything after the space) std::string value = (firstSpace == std::string::npos) ? "" : key.substr(firstSpace + 1); boost::algorithm::trim(value); key = key.substr(0, firstSpace); std::pair result = _definitions.insert( DefinitionMap::value_type(key, StringList()) ); if (!result.second) { rWarning() << "Redefinition of " << key << " in " << (*_curNode)->archive->getName() << std::endl; result.first->second.clear(); } // Instantiate a local stringtokeniser to split up the #defined string BasicStringTokeniser tokeniser(value, _delims); while (tokeniser.hasMoreTokens()) { result.first->second.push_back(tokeniser.nextToken()); } } else if (token == "#undef") { std::string key = (*_curNode)->tokeniser.nextToken(); _definitions.erase(key); } else if (token == "#ifdef") { std::string key = (*_curNode)->tokeniser.nextToken(); DefinitionMap::const_iterator found = _definitions.find(key); if (found == _definitions.end()) { skipInactivePreprocessorBlock(); } } else if (token == "#ifndef") { DefinitionMap::const_iterator found = _definitions.find( (*_curNode)->tokeniser.nextToken()); if (found != _definitions.end()) { skipInactivePreprocessorBlock(); } } else if (token == "#else") { // We have an #else during active parsing, an inactive preprocessor block is ahead skipInactivePreprocessorBlock(); } else if (token == "#if") { (*_curNode)->tokeniser.skipTokens(1); } } void skipInactivePreprocessorBlock() { // Not defined, skip everything until matching #endif for (std::size_t level = 1; level > 0;) { if (!(*_curNode)->tokeniser.hasMoreTokens()) { rWarning() << "No matching #endif for #if(n)def in " << (*_curNode)->archive->getName() << std::endl; } std::string token = (*_curNode)->tokeniser.nextToken(); if (token == "#endif") { level--; } else if (token == "#ifdef" || token == "#ifndef" || token == "#if") { level++; } else if (token == "#else" && level == 1) { // Matching #else, break the loop break; } } } }; } // namespace parser #endif /* _CODE_TOKENISER_H_ */ ���������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/parser/DefBlockTokeniser.h���������������������������������������������������0000664�0000000�0000000�00000031066�12454246557�0021656�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef DEF_BLOCK_TOKENISER_H_ #define DEF_BLOCK_TOKENISER_H_ #include "ParseException.h" #include #include #include namespace parser { /** * Abstract base class BlockTokeniser. This class inspects a given input block * or stream and returns definition blocks (including name). * * C and C++-style comments are properly ignored. */ class BlockTokeniser { public: struct Block { // The name of this block std::string name; // The block contents (excluding braces) std::string contents; void clear() { name.clear(); contents.clear(); } }; /** Destructor */ virtual ~BlockTokeniser() {} /** * Test if this DefTokeniser has more blocks to return. * * @returns * true if there are further blocks, false otherwise */ virtual bool hasMoreBlocks() = 0; /** * Return the next block in the sequence. This function consumes * the returned block and advances the internal state to the following * block. * * @returns * A named Block structure. * * @pre * hasMoreBlocks() must be true, otherwise an exception will be thrown. */ virtual Block nextBlock() = 0; }; /* Model of boost::TokenizerFunction which splits tokens on whitespace with additional * protection of quoted content. */ class DefBlockTokeniserFunc { // Enumeration of states enum State { SEARCHING_NAME, // haven't found anything yet TOKEN_STARTED, // first non-delimiter character found SEARCHING_BLOCK, // searching for block opening char BLOCK_CONTENT, // within a block FORWARDSLASH, // forward slash found, possible comment coming COMMENT_EOL, // double-forwardslash comment COMMENT_DELIM, // inside delimited comment (/*) STAR // asterisk, possibly indicates end of comment (*/) } _state; const char* _delims; // whitespace const char _blockStartChar; // "{" const char _blockEndChar; // "}" // Test if a character is a delimiter bool isDelim(char c) { const char* curDelim = _delims; while (*curDelim != 0) { if (*(curDelim++) == c) { return true; } } return false; } public: // Constructor DefBlockTokeniserFunc(const char* delims, char blockStartChar, char blockEndChar) : _state(SEARCHING_NAME), _delims(delims), _blockStartChar(blockStartChar), _blockEndChar(blockEndChar) {} /* REQUIRED. Operator() is called by the boost::tokenizer. This function * must search for a token between the two iterators next and end, and if * a token is found, set tok to the token, set next to position to start * parsing on the next call, and return true. */ template bool operator() (InputIterator& next, InputIterator end, Token& tok) { // Initialise state, no persistence between calls _state = SEARCHING_NAME; // Clear out the token, no guarantee that it is empty tok.clear(); char ch = '\0'; std::size_t blockLevel = 0; while (next != end) { ch = *next; switch (_state) { case SEARCHING_NAME: // Ignore delimiters if (isDelim(ch)) { ++next; continue; } // We have a non-delimiter, examine it _state = TOKEN_STARTED; // Fall through case TOKEN_STARTED: // Here a delimiter indicates a successful token match if (isDelim(ch)) { _state = SEARCHING_BLOCK; continue; } // The character is pointing at a non-delimiter. Switch on it. switch (ch) { // Found a slash, possibly start of comment case '/': _state = FORWARDSLASH; ++next; continue; // skip slash, will need to add it back if this is not a comment // General case. Token lasts until next delimiter. default: tok.name += ch; ++next; continue; } break; case SEARCHING_BLOCK: if (isDelim(ch)) { ++next; // keep on searching continue; } else if (ch == _blockStartChar) { // Found an opening brace _state = BLOCK_CONTENT; blockLevel++; ++next; continue; } else if (ch == '/') { // Forward slash, possible comment start _state = FORWARDSLASH; ++next; continue; } else { // Not a delimiter, not an opening brace, must be // an "extension" for the name tok.name += ' '; tok.name += ch; // Switch back to name _state = TOKEN_STARTED; ++next; continue; } case BLOCK_CONTENT: // Check for another opening brace if (ch == _blockEndChar) { blockLevel--; if (blockLevel == 0) { // End of block content, we're done here, // don't add this last character either ++next; return true; } else { // Still within a block, add to contents tok.contents += ch; ++next; continue; } } else if (ch == _blockStartChar) { // another block within this block, ignore this blockLevel++; tok.contents += ch; ++next; continue; } else { tok.contents += ch; ++next; continue; } case FORWARDSLASH: // If we have a forward slash we may be entering a comment. The forward slash // will NOT YET have been added to the token, so we must add it manually if // this proves not to be a comment. switch (ch) { case '*': _state = COMMENT_DELIM; ++next; continue; case '/': _state = COMMENT_EOL; ++next; continue; default: // false alarm, add the slash and carry on _state = TOKEN_STARTED; tok.name += '/'; // Do not increment next here continue; } case COMMENT_DELIM: // Inside a delimited comment, we add nothing to the token but check for // the "*/" sequence. if (ch == '*') { _state = STAR; ++next; continue; } else { ++next; continue; // ignore and carry on } case COMMENT_EOL: // This comment lasts until the end of the line. if (ch == '\r' || ch == '\n') { // An EOL comment with non-empty name means searching for block _state = (tok.name.empty()) ? SEARCHING_NAME : SEARCHING_BLOCK; ++next; continue; } else { ++next; continue; // do nothing } case STAR: // The star may indicate the end of a delimited comment. // This state will only be entered if we are inside a // delimited comment. if (ch == '/') { // End of comment _state = (tok.name.empty()) ? SEARCHING_NAME : SEARCHING_BLOCK; ++next; continue; } else if (ch == '*') { // Another star, remain in the STAR state in case we // have a "**/" end of comment. _state = STAR; ++next; continue; } else { // No end of comment _state = COMMENT_DELIM; ++next; continue; } } } // Return true if we have found a named block if (!tok.name.empty()) return true; else return false; } // REQUIRED. Reset function to clear internal state void reset() { _state = SEARCHING_NAME; } }; /** * Tokenise a DEF file. * * This class provides a similar interface to Java's StringTokenizer class. It accepts * an input stream and provides a simple interface to return the next block in the stream. * It also protects quoted content and ignores both C and C++ style comments. */ template class BasicDefBlockTokeniser : public BlockTokeniser { // Internal Boost tokenizer and its iterator typedef boost::tokenizer Tokeniser; Tokeniser _tok; Tokeniser::iterator _tokIter; public: /** * Construct a BasicDefBlockTokeniser with the given input type. * * @param str * The container to tokenise. */ BasicDefBlockTokeniser(const ContainerT& str, const char* delims = " \t\n\v\r", const char blockStartChar = '{', const char blockEndChar = '}') : _tok(str, DefBlockTokeniserFunc(delims, blockStartChar, blockEndChar)), _tokIter(_tok.begin()) {} /** Test if this StringTokeniser has more blocks to return. * * @returns * true if there are further blocks, false otherwise */ bool hasMoreBlocks() { return _tokIter != _tok.end(); } /** Return the next token in the sequence. This function consumes * the returned token and advances the internal state to the following * token. * * @returns * std::string containing the next token in the sequence. * * @pre * hasMoreTokens() must be true, otherwise an exception will be thrown. */ Block nextBlock() { if (hasMoreBlocks()) return *(_tokIter++); else throw ParseException("BlockTokeniser: no more blocks"); } }; /** * Specialisation of DefTokeniser to work with std::istream objects. This is * needed because an std::istream does not provide begin() and end() methods * to get an iterator, but needs a separate istream_iterator<> to be constructed * for it. */ template<> class BasicDefBlockTokeniser : public BlockTokeniser { // Istream iterator type typedef std::istream_iterator CharStreamIterator; // Internal Boost tokenizer and its iterator typedef boost::tokenizer Tokeniser; Tokeniser _tok; Tokeniser::iterator _tokIter; private: // Helper function to set noskipws on the input stream. static std::istream& setNoskipws(std::istream& is) { is >> std::noskipws; return is; } public: /** * Construct a BasicDefBlockTokeniser with the given input stream. * * @param str * The std::istream to tokenise. This is a non-const parameter, since tokens * will be extracted from the stream. */ BasicDefBlockTokeniser(std::istream& str, const char* delims = " \t\n\v\r", const char blockStartChar = '{', const char blockEndChar = '}') : _tok(CharStreamIterator(setNoskipws(str)), // start iterator CharStreamIterator(), // end (null) iterator DefBlockTokeniserFunc(delims, blockStartChar, blockEndChar)), _tokIter(_tok.begin()) {} /** * Test if this BlockTokeniser has more blocks to return. * * @returns * true if there are further blocks, false otherwise */ bool hasMoreBlocks() { return _tokIter != _tok.end(); } /** * Return the next block in the sequence. This function consumes * the returned block and advances the internal state to the following * block. * * @returns * The named block. * * @pre * hasMoreBlocks() must be true, otherwise an exception will be thrown. */ Block nextBlock() { if (hasMoreBlocks()) return *(_tokIter++); else throw ParseException("BlockTokeniser: no more tokens"); } }; } // namespace parser #endif /* DEF_BLOCK_TOKENISER_H_ */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/parser/DefTokeniser.h��������������������������������������������������������0000664�0000000�0000000�00000043421�12454246557�0020701�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef DEFTOKENISER_H_ #define DEFTOKENISER_H_ #include "ParseException.h" #include #include namespace parser { /* Model of boost::TokenizerFunction which splits tokens on whitespace with additional * protection of quoted content. */ class DefTokeniserFunc { // Enumeration of states enum { SEARCHING, // haven't found anything yet TOKEN_STARTED, // found the start of a possible multi-char token QUOTED, // inside quoted text, no tokenising AFTER_CLOSING_QUOTE, // right after a quoted text, checking for backslash SEARCHING_FOR_QUOTE, // searching for continuation of quoted string (after a backslash was found) FORWARDSLASH, // forward slash found, possible comment coming COMMENT_EOL, // double-forwardslash comment COMMENT_DELIM, // inside delimited comment (/*) STAR // asterisk, possibly indicates end of comment (*/) } _state; // List of delimiters to skip const char* _delims; // List of delimiters to keep const char* _keptDelims; // Test if a character is a delimiter bool isDelim(char c) { const char* curDelim = _delims; while (*curDelim != 0) { if (*(curDelim++) == c) { return true; } } return false; } // Test if a character is a kept delimiter bool isKeptDelim(char c) { const char* curDelim = _keptDelims; while (*curDelim != 0) { if (*(curDelim++) == c) { return true; } } return false; } public: // Constructor DefTokeniserFunc(const char* delims, const char* keptDelims) : _state(SEARCHING), _delims(delims), _keptDelims(keptDelims) {} /* REQUIRED. Operator() is called by the boost::tokenizer. This function * must search for a token between the two iterators next and end, and if * a token is found, set tok to the token, set next to position to start * parsing on the next call, and return true. */ template bool operator() (InputIterator& next, InputIterator end, Token& tok) { // Initialise state, no persistence between calls _state = SEARCHING; // Clear out the token, no guarantee that it is empty tok = ""; while (next != end) { switch (_state) { case SEARCHING: // If we have a delimiter, just advance to the next character if (isDelim(*next)) { ++next; continue; } // If we have a KEPT delimiter, this is the token to return. if (isKeptDelim(*next)) { tok = *(next++); return true; } // Otherwise fall through into TOKEN_STARTED, saving the state for the // next iteration _state = TOKEN_STARTED; case TOKEN_STARTED: // Here a delimiter indicates a successful token match if (isDelim(*next) || isKeptDelim(*next)) { return true; } // Now next is pointing at a non-delimiter. Switch on this // character. switch (*next) { // Found a quote, enter QUOTED state, or return the // current token if we are in the process of building // one. case '\"': if (tok != "") { return true; } else { _state = QUOTED; ++next; continue; // skip the quote } // Found a slash, possibly start of comment case '/': _state = FORWARDSLASH; ++next; continue; // skip slash, will need to add it back if this is not a comment // General case. Token lasts until next delimiter. default: tok += *next; ++next; continue; } case QUOTED: // In the quoted state, just advance until the closing // quote. No delimiter splitting is required. if (*next == '\"') { ++next; // greebo: We've found a closing quote, but there might be a backslash indicating // a multi-line string constant "" \ "", so switch to AFTER_CLOSING_QUOTE mode _state = AFTER_CLOSING_QUOTE; continue; } else if (*next == '\\') { // Escape found, check next character ++next; if (next != end) { if (*next == 'n') // Linebreak { tok += '\n'; } else if (*next == 't') // Tab { tok += '\t'; } else if (*next == '"') // Quote { tok += '"'; } else { // No special escape sequence, add the backslash tok += '\\'; // Plus the character itself tok += *next; } ++next; } continue; } else { tok += *next; ++next; continue; } case AFTER_CLOSING_QUOTE: // We already have a valid string token in our hands, but it might be continued // if one of the next tokens is a backslash if (*next == '\\') { // We've found a backslash right after a closing quote, this indicates we could // proceed with parsing quoted content ++next; _state = SEARCHING_FOR_QUOTE; continue; } // Ignore delimiters if (isDelim(*next)) { ++next; continue; } // Everything except delimiters and backslashes indicates that // the quoted content is not continued, so break the loop. // This returns the token and parsing continues. // Return TRUE in any case, even if the parsed token is empty (""). return true; case SEARCHING_FOR_QUOTE: // We have found a backslash after a closing quote, search for an opening quote // Step over delimiters if (isDelim(*next)) { ++next; continue; } if (*next == '\"') { // Found the desired opening quote, switch to QUOTED ++next; _state = QUOTED; continue; } // Everything except delimiters or opening quotes indicates an error throw ParseException("Could not find opening double quote after backslash."); case FORWARDSLASH: // If we have a forward slash we may be entering a comment. The forward slash // will NOT YET have been added to the token, so we must add it manually if // this proves not to be a comment. switch (*next) { case '*': _state = COMMENT_DELIM; ++next; continue; case '/': _state = COMMENT_EOL; ++next; continue; default: // false alarm, add the slash and carry on // greebo: switch to TOKEN_STARTED, the SEARCHING state might // overwrite this if the next token is a kept delimiter _state = TOKEN_STARTED; tok += "/"; // Do not increment next here continue; } case COMMENT_DELIM: // Inside a delimited comment, we add nothing to the token but check for // the "*/" sequence. if (*next == '*') { _state = STAR; ++next; continue; } else { ++next; continue; // ignore and carry on } case COMMENT_EOL: // This comment lasts until the end of the line. if (*next == '\r' || *next == '\n') { ++next; // If we have a token at this point, return it if (tok != "") { return true; } else { _state = SEARCHING; continue; } } else { ++next; continue; // do nothing } case STAR: // The star may indicate the end of a delimited comment. // This state will only be entered if we are inside a // delimited comment. if (*next == '/') { // End of comment ++next; // If we have a token at this point, return it if (tok != "") { return true; } else { _state = SEARCHING; continue; } continue; } else if (*next == '*') { // Another star, remain in the STAR state in case we // have a "**/" end of comment. _state = STAR; ++next; continue; } else { // No end of comment _state = COMMENT_DELIM; ++next; continue; } } // end of state switch } // end of for loop // Return true if we have added anything to the token if (tok != "") return true; else return false; } // REQUIRED. Reset function to clear internal state void reset() { _state = SEARCHING; } }; const char* const WHITESPACE = " \t\n\v\r"; /** * DefTokeniser abstract base class. This class provides a unified interface to * DefTokeniser subclasses, so that calling code can retrieve a stream of tokens * without needing knowledge of the underlying container type (std::string, * std::istream etc). * * Each subclass MUST implement hasMoreTokens() and nextToken() appropriately, * while default implementations of assertNextToken() and skipTokens() are * provided that make use of the former two methods. */ class DefTokeniser { public: /** * Destructor */ virtual ~DefTokeniser() {} /** * Test if this DefTokeniser has more tokens to return. * * @returns * true if there are further tokens, false otherwise */ virtual bool hasMoreTokens() const = 0; /** * Return the next token in the sequence. This function consumes * the returned token and advances the internal state to the following * token. * * @returns * std::string containing the next token in the sequence. * * @pre * hasMoreTokens() must be true, otherwise an exception will be thrown. */ virtual std::string nextToken() = 0; /** * Assert that the next token in the sequence must be equal to the provided * value. A ParseException is thrown if the assert fails. * * @param val * The expected value of the token. */ virtual void assertNextToken(const std::string& val) { const std::string tok = nextToken(); if (tok != val) throw ParseException("DefTokeniser: Assertion failed: Required \"" + val + "\", found \"" + tok + "\""); } /** * Skip the next n tokens. This method provides a convenient way to dispose * of a number of tokens without returning them. * * @param n * The number of tokens to consume. */ virtual void skipTokens(unsigned int n) { for (unsigned int i = 0; i < n; i++) { nextToken(); } } /** * Returns the next token without incrementing the internal * iterator. Use this if you want to take a look at what is coming * next without actually changing the tokeniser's state. */ virtual std::string peek() const = 0; }; /** * Tokenise a DEF file. * * This class provides a similar interface to Java's StringTokenizer class. It accepts * and std::string and a list of separators, and provides a simple interface to return * the next token in the string. It also protects quoted content and ignores both C and * C++ style comments. */ template class BasicDefTokeniser : public DefTokeniser { // Internal Boost tokenizer and its iterator typedef boost::tokenizer CharTokeniser; CharTokeniser _tok; CharTokeniser::iterator _tokIter; public: /** * Construct a DefTokeniser with the given input type, and optionally * a list of separators. * * @param str * The container to tokenise. * * @param delims * The list of characters to use as delimiters. * * @param keptDelims * String of characters to treat as delimiters but return as tokens in their * own right. */ BasicDefTokeniser(const ContainerT& str, const char* delims = WHITESPACE, const char* keptDelims = "{}()") : _tok(str, DefTokeniserFunc(delims, keptDelims)), _tokIter(_tok.begin()) { } /** Test if this StringTokeniser has more tokens to return. * * @returns * true if there are further tokens, false otherwise */ bool hasMoreTokens() const { return _tokIter != _tok.end(); } /** Return the next token in the sequence. This function consumes * the returned token and advances the internal state to the following * token. * * @returns * std::string containing the next token in the sequence. * * @pre * hasMoreTokens() must be true, otherwise an exception will be thrown. */ std::string nextToken() { if (hasMoreTokens()) return *(_tokIter++); else throw ParseException("DefTokeniser: no more tokens"); } /** * Returns the next token without incrementing the internal * iterator. Use this if you want to take a look at what is coming * next without actually changing the tokeniser's state. */ std::string peek() const { if (hasMoreTokens()) { return *_tokIter; } else { throw ParseException("DefTokeniser: no more tokens"); } } }; /** * Specialisation of DefTokeniser to work with std::istream objects. This is * needed because an std::istream does not provide begin() and end() methods * to get an iterator, but needs a separate istream_iterator<> to be constructed * for it. */ template<> class BasicDefTokeniser : public DefTokeniser { // Istream iterator type typedef std::istream_iterator CharStreamIterator; // Internal Boost tokenizer and its iterator typedef boost::tokenizer CharTokeniser; CharTokeniser _tok; CharTokeniser::iterator _tokIter; private: // Helper function to set noskipws on the input stream. static std::istream& setNoskipws(std::istream& is) { is >> std::noskipws; return is; } public: /** * Construct a DefTokeniser with the given input stream, and optionally * a list of separators. * * @param str * The std::istream to tokenise. This is a non-const parameter, since tokens * will be extracted from the stream. * * @param delims * The list of characters to use as delimiters. * * @param keptDelims * String of characters to treat as delimiters but return as tokens in their * own right. */ BasicDefTokeniser(std::istream& str, const char* delims = WHITESPACE, const char* keptDelims = "{}()") : _tok(CharStreamIterator(setNoskipws(str)), // start iterator CharStreamIterator(), // end (null) iterator DefTokeniserFunc(delims, keptDelims)), _tokIter(_tok.begin()) { } /** * Test if this StringTokeniser has more tokens to return. * * @returns * true if there are further tokens, false otherwise */ bool hasMoreTokens() const { return _tokIter != _tok.end(); } /** * Return the next token in the sequence. This function consumes * the returned token and advances the internal state to the following * token. * * @returns * std::string containing the next token in the sequence. * * @pre * hasMoreTokens() must be true, otherwise an exception will be thrown. */ std::string nextToken() { if (hasMoreTokens()) return *(_tokIter++); else throw ParseException("DefTokeniser: no more tokens"); } /** * Returns the next token without incrementing the internal * iterator. Use this if you want to take a look at what is coming * next without actually changing the tokeniser's state. */ std::string peek() const { if (hasMoreTokens()) { return *_tokIter; } else { throw ParseException("DefTokeniser: no more tokens"); } } }; } // namespace parser #endif /*DEFTOKENISER_H_*/ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/parser/ParseException.h������������������������������������������������������0000664�0000000�0000000�00000000562�12454246557�0021247�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef PARSEEXCEPTION_H_ #define PARSEEXCEPTION_H_ #include #include namespace parser { /** Exception raised by parser classes when an unrecoverable error occurs. */ class ParseException : public std::runtime_error { public: ParseException(const std::string& what) : std::runtime_error(what) {} }; } #endif /*PARSEEXCEPTION_H_*/ ����������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/parser/Tokeniser.h�����������������������������������������������������������0000664�0000000�0000000�00000010257�12454246557�0020263�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef TOKENISER_H_ #define TOKENISER_H_ #include #include #include "ParseException.h" namespace parser { /** * greebo: Abstract type of a StringTokeniser, which splits a given * input string into pieces. It must provide a basic set of methods * to retrieve the tokens one by one. */ class StringTokeniser { public: /** * Destructor */ virtual ~StringTokeniser() {} /** Test if this StringTokeniser has more tokens to return. * * @returns * true if there are further tokens, false otherwise */ virtual bool hasMoreTokens() = 0; /** Return the next token in the sequence. This function consumes * the returned token and advances the internal state to the following * token. * * @returns * std::string containing the next token in the sequence. * * @pre * hasMoreTokens() must be true, otherwise an exception will be thrown. */ virtual std::string nextToken() = 0; /** Assert that the next token in the sequence must be equal to the provided * value. A ParseException is thrown if the assert fails. * * @param val * The expected value of the token. */ virtual void assertNextToken(const std::string& val) = 0; /** Skip the next n tokens. This method provides a convenient way to dispose * of a number of tokens without returning them. * * @param n * The number of tokens to consume. */ virtual void skipTokens(unsigned int n) = 0; }; /** Base class of a tokeniser wrapping around a boost::tokeniser * * Standard delimiters are initialised to whitespace: " \t\n\v\r" */ class BasicStringTokeniser : public StringTokeniser { // Internal Boost tokenizer and its iterator typedef boost::char_separator CharSeparator; typedef boost::tokenizer CharTokeniser; CharSeparator _separator; CharTokeniser _tok; CharTokeniser::iterator _tokIter; public: /** Construct a Tokeniser with the given input string, and optionally * a list of separators. * * @param str * The string to tokenise. * * @param delims * The list of characters to use as delimiters. * * @param keptDelims * The list of delimiters to keep */ BasicStringTokeniser(const std::string& str, const char* delimiters = " \t\n\v\r") : _separator(delimiters), _tok(str, _separator), _tokIter(_tok.begin()) {} /** Test if this StringTokeniser has more tokens to return. * * @returns * true if there are further tokens, false otherwise */ bool hasMoreTokens() { return _tokIter != _tok.end(); } /** Return the next token in the sequence. This function consumes * the returned token and advances the internal state to the following * token. * * @returns * std::string containing the next token in the sequence. * * @pre * hasMoreTokens() must be true, otherwise an exception will be thrown. */ std::string nextToken() { if (hasMoreTokens()) return *(_tokIter++); else throw ParseException("Tokeniser: no more tokens"); } /** Assert that the next token in the sequence must be equal to the provided * value. A ParseException is thrown if the assert fails. * * @param val * The expected value of the token. */ void assertNextToken(const std::string& val) { const std::string tok = nextToken(); if (tok != val) throw ParseException("Tokeniser: Assertion failed: Required \"" + val + "\", found \"" + tok + "\""); } /** Skip the next n tokens. This method provides a convenient way to dispose * of a number of tokens without returning them. * * @param n * The number of tokens to consume. */ void skipTokens(unsigned int n) { for (unsigned int i = 0; i < n; i++) { if (hasMoreTokens()) { _tokIter++; } else { throw ParseException("Tokeniser: no more tokens"); } } } }; // class BasicStringTokeniser } // namespace parser #endif /* TOKENISER_H_ */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel.h������������������������������������������������������������������0000664�0000000�0000000�00000032141�12454246557�0016773�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #ifndef PICOMODEL_H #define PICOMODEL_H #ifdef __cplusplus extern "C" { #endif #include /* version */ #define PICOMODEL_VERSION "0.8.20" /* constants */ #define PICO_GROW_SHADERS 16 #define PICO_GROW_SURFACES 16 #define PICO_GROW_VERTEXES 1024 #define PICO_GROW_INDEXES 1024 #define PICO_GROW_ARRAYS 8 #define PICO_GROW_FACES 256 #define PICO_MAX_SPECIAL 8 #define PICO_MAX_DEFAULT_EXTS 4 /* max default extensions per module */ /* types */ typedef unsigned char picoByte_t; typedef double picoVec_t; typedef double picoVec2_t[ 2 ]; typedef double picoVec3_t[ 3 ]; typedef double picoVec4_t[ 4 ]; typedef picoByte_t picoColor_t[ 4 ]; typedef int picoIndex_t; typedef enum { PICO_BAD, PICO_TRIANGLES, PICO_PATCH } picoSurfaceType_t; typedef enum { PICO_NORMAL, PICO_VERBOSE, PICO_WARNING, PICO_ERROR, PICO_FATAL } picoPrintLevel_t; typedef struct picoSurface_s picoSurface_t; typedef struct picoShader_s picoShader_t; typedef struct picoModel_s picoModel_t; typedef struct picoModule_s picoModule_t; struct picoSurface_s { void *data; picoModel_t *model; /* owner model */ picoSurfaceType_t type; char *name; /* sea: surface name */ picoShader_t *shader; /* ydnar: changed to ptr */ int numVertexes, maxVertexes; picoVec3_t *xyz; picoVec3_t *normal; picoIndex_t *smoothingGroup; int numSTArrays, maxSTArrays; picoVec2_t **st; int numColorArrays, maxColorArrays; picoColor_t **color; int numIndexes, maxIndexes; picoIndex_t *index; int numFaceNormals, maxFaceNormals; picoVec3_t *faceNormal; int special[ PICO_MAX_SPECIAL ]; }; /* seaw0lf */ struct picoShader_s { picoModel_t *model; /* owner model */ char *name; /* shader name */ char *mapName; /* shader file name (name of diffuse texturemap) */ picoColor_t ambientColor; /* ambient color of mesh (rgba) */ picoColor_t diffuseColor; /* diffuse color of mesh (rgba) */ picoColor_t specularColor; /* specular color of mesh (rgba) */ float transparency; /* transparency (0..1; 1 = 100% transparent) */ float shininess; /* shininess (0..128; 128 = 100% shiny) */ }; struct picoModel_s { void *data; char *name; /* model name */ char *fileName; /* sea: model file name */ int frameNum; /* sea: renamed to frameNum */ int numFrames; /* sea: number of frames */ picoVec3_t mins; picoVec3_t maxs; int numShaders, maxShaders; picoShader_t **shader; int numSurfaces, maxSurfaces; picoSurface_t **surface; const picoModule_t *module; /* sea */ }; /* seaw0lf */ /* return codes used by the validation callbacks; pmv is short */ /* for 'pico module validation'. everything >PICO_PMV_OK means */ /* that there was an error. */ enum { PICO_PMV_OK, /* file valid */ PICO_PMV_ERROR, /* file not valid */ PICO_PMV_ERROR_IDENT, /* unknown file magic (aka ident) */ PICO_PMV_ERROR_VERSION, /* unsupported file version */ PICO_PMV_ERROR_SIZE, /* file size error */ PICO_PMV_ERROR_MEMORY, /* out of memory error */ }; /* convenience (makes it easy to add new params to the callbacks) */ #define PM_PARAMS_CANLOAD \ char *fileName, const void *buffer, int bufSize #define PM_PARAMS_LOAD \ char *fileName, int frameNum, const void *buffer, int bufSize #define PM_PARAMS_CANSAVE \ void #define PM_PARAMS_SAVE \ char *fileName, picoModel_t *model /* pico file format module structure */ struct picoModule_s { char *version; /* internal module version (e.g. '1.5-b2') */ char *displayName; /* string used to display in guis, etc. */ char *authorName; /* author name (eg. 'My Real Name') */ char *copyright; /* copyright year and holder (eg. '2002 My Company') */ char *defaultExts[ PICO_MAX_DEFAULT_EXTS ]; /* default file extensions used by this file type */ int (*canload)( PM_PARAMS_CANLOAD ); /* checks whether module can load given file (returns PMVR_*) */ picoModel_t *(*load)( PM_PARAMS_LOAD ); /* parses model file data */ int (*cansave)( PM_PARAMS_CANSAVE ); /* checks whether module can save (returns 1 or 0 and might spit out a message) */ int (*save)( PM_PARAMS_SAVE ); /* saves a pico model in module's native model format */ }; /* general functions */ int PicoInit( void ); void PicoShutdown( void ); int PicoError( void ); void PicoSetMallocFunc( void *(*func)( size_t ) ); void PicoSetFreeFunc( void (*func)( void* ) ); void PicoSetLoadFileFunc( void (*func)( char*, unsigned char**, int* ) ); void PicoSetFreeFileFunc( void (*func)( void* ) ); void PicoSetPrintFunc( void (*func)( int, const char* ) ); const picoModule_t **PicoModuleList( int *numModules ); picoModel_t *PicoLoadModel( char *name, int frameNum ); typedef size_t (*PicoInputStreamReadFunc)(void* inputStream, unsigned char* buffer, size_t length); picoModel_t* PicoModuleLoadModelStream( const picoModule_t* module, void* inputStream, PicoInputStreamReadFunc inputStreamRead, size_t streamLength, int frameNum ); /* model functions */ picoModel_t *PicoNewModel( void ); void PicoFreeModel( picoModel_t *model ); int PicoAdjustModel( picoModel_t *model, int numShaders, int numSurfaces ); /* shader functions */ picoShader_t *PicoNewShader( picoModel_t *model ); void PicoFreeShader( picoShader_t *shader ); picoShader_t *PicoFindShader( picoModel_t *model, char *name, int caseSensitive ); /* surface functions */ picoSurface_t *PicoNewSurface( picoModel_t *model ); void PicoFreeSurface( picoSurface_t *surface ); picoSurface_t *PicoFindSurface( picoModel_t *model, char *name, int caseSensitive ); int PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, int numColorArrays, int numIndexes, int numFaceNormals ); /* setter functions */ void PicoSetModelName( picoModel_t *model, char *name ); void PicoSetModelFileName( picoModel_t *model, char *fileName ); void PicoSetModelFrameNum( picoModel_t *model, int frameNum ); void PicoSetModelNumFrames( picoModel_t *model, int numFrames ); void PicoSetModelData( picoModel_t *model, void *data ); void PicoSetShaderName( picoShader_t *shader, char *name ); void PicoSetShaderMapName( picoShader_t *shader, char *mapName ); void PicoSetShaderAmbientColor( picoShader_t *shader, picoColor_t color ); void PicoSetShaderDiffuseColor( picoShader_t *shader, picoColor_t color ); void PicoSetShaderSpecularColor( picoShader_t *shader, picoColor_t color ); void PicoSetShaderTransparency( picoShader_t *shader, float value ); void PicoSetShaderShininess( picoShader_t *shader, float value ); void PicoSetSurfaceData( picoSurface_t *surface, void *data ); void PicoSetSurfaceType( picoSurface_t *surface, picoSurfaceType_t type ); void PicoSetSurfaceName( picoSurface_t *surface, char *name ); void PicoSetSurfaceShader( picoSurface_t *surface, picoShader_t *shader ); void PicoSetSurfaceXYZ( picoSurface_t *surface, int num, picoVec3_t xyz ); void PicoSetSurfaceNormal( picoSurface_t *surface, int num, picoVec3_t normal ); void PicoSetSurfaceST( picoSurface_t *surface, int array, int num, picoVec2_t st ); void PicoSetSurfaceColor( picoSurface_t *surface, int array, int num, picoColor_t color ); void PicoSetSurfaceIndex( picoSurface_t *surface, int num, picoIndex_t index ); void PicoSetSurfaceIndexes( picoSurface_t *surface, int num, picoIndex_t *index, int count ); void PicoSetFaceNormal( picoSurface_t *surface, int num, picoVec3_t normal ); void PicoSetSurfaceSpecial( picoSurface_t *surface, int num, int special ); void PicoSetSurfaceSmoothingGroup( picoSurface_t *surface, int num, picoIndex_t smoothingGroup ); /* getter functions */ char *PicoGetModelName( picoModel_t *model ); char *PicoGetModelFileName( picoModel_t *model ); int PicoGetModelFrameNum( picoModel_t *model ); int PicoGetModelNumFrames( picoModel_t *model ); void *PicoGetModelData( picoModel_t *model ); int PicoGetModelNumShaders( picoModel_t *model ); picoShader_t *PicoGetModelShader( picoModel_t *model, int num ); /* sea */ int PicoGetModelNumSurfaces( picoModel_t *model ); picoSurface_t *PicoGetModelSurface( picoModel_t *model, int num ); int PicoGetModelTotalVertexes( picoModel_t *model ); int PicoGetModelTotalIndexes( picoModel_t *model ); char *PicoGetShaderName( picoShader_t *shader ); char *PicoGetShaderMapName( picoShader_t *shader ); picoByte_t *PicoGetShaderAmbientColor( picoShader_t *shader ); picoByte_t *PicoGetShaderDiffuseColor( picoShader_t *shader ); picoByte_t *PicoGetShaderSpecularColor( picoShader_t *shader ); float PicoGetShaderTransparency( picoShader_t *shader ); float PicoGetShaderShininess( picoShader_t *shader ); void *PicoGetSurfaceData( picoSurface_t *surface ); char *PicoGetSurfaceName( picoSurface_t *surface ); /* sea */ picoSurfaceType_t PicoGetSurfaceType( picoSurface_t *surface ); char *PicoGetSurfaceName( picoSurface_t *surface ); picoShader_t *PicoGetSurfaceShader( picoSurface_t *surface ); /* sea */ int PicoGetSurfaceNumVertexes( picoSurface_t *surface ); picoVec_t *PicoGetSurfaceXYZ( picoSurface_t *surface, int num ); picoVec_t *PicoGetSurfaceNormal( picoSurface_t *surface, int num ); picoVec_t *PicoGetSurfaceST( picoSurface_t *surface, int array, int num ); picoByte_t *PicoGetSurfaceColor( picoSurface_t *surface, int array, int num ); int PicoGetSurfaceNumIndexes( picoSurface_t *surface ); picoIndex_t PicoGetSurfaceIndex( picoSurface_t *surface, int num ); picoIndex_t *PicoGetSurfaceIndexes( picoSurface_t *surface, int num ); picoVec_t *PicoGetFaceNormal( picoSurface_t *surface, int num ); int PicoGetSurfaceSpecial( picoSurface_t *surface, int num ); /* hashtable related functions */ typedef struct picoVertexCombinationData_s { picoVec3_t xyz, normal; picoVec2_t st; picoColor_t color; } picoVertexCombinationData_t; typedef struct picoVertexCombinationHash_s { picoVertexCombinationData_t vcd; picoIndex_t index; void *data; struct picoVertexCombinationHash_s *next; } picoVertexCombinationHash_t; int PicoGetHashTableSize( void ); unsigned int PicoVertexCoordGenerateHash( picoVec3_t xyz ); picoVertexCombinationHash_t **PicoNewVertexCombinationHashTable( void ); void PicoFreeVertexCombinationHashTable( picoVertexCombinationHash_t **hashTable ); picoVertexCombinationHash_t *PicoFindVertexCombinationInHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color ); picoVertexCombinationHash_t *PicoAddVertexCombinationToHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color, picoIndex_t index ); /* specialized functions */ int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t normal, int numSTs, picoVec2_t *st, int numColors, picoColor_t *color, picoIndex_t smoothingGroup ); void PicoFixSurfaceNormals( picoSurface_t *surface ); int PicoRemapModel( picoModel_t *model, char *remapFile ); void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** normals, int numSTs, picoVec2_t **st, int numColors, picoColor_t **colors, picoShader_t* shader, picoIndex_t* smoothingGroup); /* end marker */ #ifdef __cplusplus } #endif #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/�������������������������������������������������������������������0000775�0000000�0000000�00000000000�12454246557�0016621�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/Makefile.am��������������������������������������������������������0000664�0000000�0000000�00000002034�12454246557�0020654�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs AM_CFLAGS = -fPIC pkglib_LTLIBRARIES = libpicomodel.la libpicomodel_la_LDFLAGS = -release @PACKAGE_VERSION@ -lm libpicomodel_la_SOURCES = picointernal.c \ lwo/vecmath.c \ lwo/clip.c \ lwo/surface.c \ lwo/pntspols.c \ lwo/list.c \ lwo/envelope.c \ lwo/vmap.c \ lwo/lwio.c \ lwo/lwo2.c \ lwo/lwob.c \ pm_mdc.c \ pm_terrain.c \ pm_3ds.c \ pm_md3.c \ picomodel.c \ pm_ms3d.c \ pm_obj.c \ pm_lwo.c \ pm_fm.c \ pm_md2.c \ pm_ase.c \ picomodules.c ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/Makefile.in��������������������������������������������������������0000664�0000000�0000000�00000064556�12454246557�0020706�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libs/picomodel DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkglibdir)" LTLIBRARIES = $(pkglib_LTLIBRARIES) libpicomodel_la_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_libpicomodel_la_OBJECTS = picointernal.lo lwo/vecmath.lo \ lwo/clip.lo lwo/surface.lo lwo/pntspols.lo lwo/list.lo \ lwo/envelope.lo lwo/vmap.lo lwo/lwio.lo lwo/lwo2.lo \ lwo/lwob.lo pm_mdc.lo pm_terrain.lo pm_3ds.lo pm_md3.lo \ picomodel.lo pm_ms3d.lo pm_obj.lo pm_lwo.lo pm_fm.lo pm_md2.lo \ pm_ase.lo picomodules.lo libpicomodel_la_OBJECTS = $(am_libpicomodel_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libpicomodel_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libpicomodel_la_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libpicomodel_la_SOURCES) DIST_SOURCES = $(libpicomodel_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs AM_CFLAGS = -fPIC pkglib_LTLIBRARIES = libpicomodel.la libpicomodel_la_LDFLAGS = -release @PACKAGE_VERSION@ -lm libpicomodel_la_SOURCES = picointernal.c \ lwo/vecmath.c \ lwo/clip.c \ lwo/surface.c \ lwo/pntspols.c \ lwo/list.c \ lwo/envelope.c \ lwo/vmap.c \ lwo/lwio.c \ lwo/lwo2.c \ lwo/lwob.c \ pm_mdc.c \ pm_terrain.c \ pm_3ds.c \ pm_md3.c \ picomodel.c \ pm_ms3d.c \ pm_obj.c \ pm_lwo.c \ pm_fm.c \ pm_md2.c \ pm_ase.c \ picomodules.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/picomodel/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/picomodel/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ } uninstall-pkglibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ done clean-pkglibLTLIBRARIES: -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) @list='$(pkglib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } lwo/$(am__dirstamp): @$(MKDIR_P) lwo @: > lwo/$(am__dirstamp) lwo/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) lwo/$(DEPDIR) @: > lwo/$(DEPDIR)/$(am__dirstamp) lwo/vecmath.lo: lwo/$(am__dirstamp) lwo/$(DEPDIR)/$(am__dirstamp) lwo/clip.lo: lwo/$(am__dirstamp) lwo/$(DEPDIR)/$(am__dirstamp) lwo/surface.lo: lwo/$(am__dirstamp) lwo/$(DEPDIR)/$(am__dirstamp) lwo/pntspols.lo: lwo/$(am__dirstamp) lwo/$(DEPDIR)/$(am__dirstamp) lwo/list.lo: lwo/$(am__dirstamp) lwo/$(DEPDIR)/$(am__dirstamp) lwo/envelope.lo: lwo/$(am__dirstamp) lwo/$(DEPDIR)/$(am__dirstamp) lwo/vmap.lo: lwo/$(am__dirstamp) lwo/$(DEPDIR)/$(am__dirstamp) lwo/lwio.lo: lwo/$(am__dirstamp) lwo/$(DEPDIR)/$(am__dirstamp) lwo/lwo2.lo: lwo/$(am__dirstamp) lwo/$(DEPDIR)/$(am__dirstamp) lwo/lwob.lo: lwo/$(am__dirstamp) lwo/$(DEPDIR)/$(am__dirstamp) libpicomodel.la: $(libpicomodel_la_OBJECTS) $(libpicomodel_la_DEPENDENCIES) $(EXTRA_libpicomodel_la_DEPENDENCIES) $(AM_V_CCLD)$(libpicomodel_la_LINK) -rpath $(pkglibdir) $(libpicomodel_la_OBJECTS) $(libpicomodel_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f lwo/*.$(OBJEXT) -rm -f lwo/*.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/picointernal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/picomodel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/picomodules.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pm_3ds.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pm_ase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pm_fm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pm_lwo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pm_md2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pm_md3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pm_mdc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pm_ms3d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pm_obj.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pm_terrain.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@lwo/$(DEPDIR)/clip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@lwo/$(DEPDIR)/envelope.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@lwo/$(DEPDIR)/list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@lwo/$(DEPDIR)/lwio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@lwo/$(DEPDIR)/lwo2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@lwo/$(DEPDIR)/lwob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@lwo/$(DEPDIR)/pntspols.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@lwo/$(DEPDIR)/surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@lwo/$(DEPDIR)/vecmath.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@lwo/$(DEPDIR)/vmap.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf lwo/.libs lwo/_libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pkglibdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f lwo/$(DEPDIR)/$(am__dirstamp) -rm -f lwo/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) lwo/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-pkglibLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) lwo/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkglibLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkglibLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkglibLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ��������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/���������������������������������������������������������������0000775�0000000�0000000�00000000000�12454246557�0017422�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/clip.c���������������������������������������������������������0000664�0000000�0000000�00000014743�12454246557�0020526�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ====================================================================== clip.c Functions for LWO2 image references. Ernie Wright 17 Sep 00 ====================================================================== */ #include "../picointernal.h" #include "lwo2.h" /* ====================================================================== lwFreeClip() Free memory used by an lwClip. ====================================================================== */ void lwFreeClip( lwClip *clip ) { if ( clip ) { lwListFree( clip->ifilter, (void *) lwFreePlugin ); lwListFree( clip->pfilter, (void *) lwFreePlugin ); switch ( clip->type ) { case ID_STIL: _pico_free( clip->source.still.name); break; case ID_ISEQ: _pico_free( clip->source.seq.prefix ); _pico_free( clip->source.seq.suffix ); break; case ID_ANIM: _pico_free( clip->source.anim.name ); _pico_free( clip->source.anim.server ); _pico_free( clip->source.anim.data ); break; case ID_XREF: _pico_free( clip->source.xref.string ); break; case ID_STCC: _pico_free( clip->source.cycle.name ); break; default: break; } _pico_free( clip ); } } /* ====================================================================== lwGetClip() Read image references from a CLIP chunk in an LWO2 file. ====================================================================== */ lwClip *lwGetClip( picoMemStream_t *fp, int cksize ) { lwClip *clip; lwPlugin *filt; unsigned int id; unsigned short sz; int pos, rlen; /* allocate the Clip structure */ clip = _pico_calloc( 1, sizeof( lwClip )); if ( !clip ) goto Fail; clip->contrast.val = 1.0f; clip->brightness.val = 1.0f; clip->saturation.val = 1.0f; clip->gamma.val = 1.0f; /* remember where we started */ set_flen( 0 ); pos = _pico_memstream_tell( fp ); /* index */ clip->index = getI4( fp ); /* first subchunk header */ clip->type = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) goto Fail; sz += sz & 1; set_flen( 0 ); switch ( clip->type ) { case ID_STIL: clip->source.still.name = getS0( fp ); break; case ID_ISEQ: clip->source.seq.digits = getU1( fp ); clip->source.seq.flags = getU1( fp ); clip->source.seq.offset = getI2( fp ); getU2( fp ); /* not sure what this is yet */ clip->source.seq.start = getI2( fp ); clip->source.seq.end = getI2( fp ); clip->source.seq.prefix = getS0( fp ); clip->source.seq.suffix = getS0( fp ); break; case ID_ANIM: clip->source.anim.name = getS0( fp ); clip->source.anim.server = getS0( fp ); rlen = get_flen(); clip->source.anim.data = getbytes( fp, sz - rlen ); break; case ID_XREF: clip->source.xref.index = getI4( fp ); clip->source.xref.string = getS0( fp ); break; case ID_STCC: clip->source.cycle.lo = getI2( fp ); clip->source.cycle.hi = getI2( fp ); clip->source.cycle.name = getS0( fp ); break; default: break; } /* error while reading current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) goto Fail; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the CLIP chunk? */ rlen = _pico_memstream_tell( fp ) - pos; if ( cksize < rlen ) goto Fail; if ( cksize == rlen ) return clip; /* process subchunks as they're encountered */ id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) goto Fail; while ( 1 ) { sz += sz & 1; set_flen( 0 ); switch ( id ) { case ID_TIME: clip->start_time = getF4( fp ); clip->duration = getF4( fp ); clip->frame_rate = getF4( fp ); break; case ID_CONT: clip->contrast.val = getF4( fp ); clip->contrast.eindex = getVX( fp ); break; case ID_BRIT: clip->brightness.val = getF4( fp ); clip->brightness.eindex = getVX( fp ); break; case ID_SATR: clip->saturation.val = getF4( fp ); clip->saturation.eindex = getVX( fp ); break; case ID_HUE: clip->hue.val = getF4( fp ); clip->hue.eindex = getVX( fp ); break; case ID_GAMM: clip->gamma.val = getF4( fp ); clip->gamma.eindex = getVX( fp ); break; case ID_NEGA: clip->negative = getU2( fp ); break; case ID_IFLT: case ID_PFLT: filt = _pico_calloc( 1, sizeof( lwPlugin )); if ( !filt ) goto Fail; filt->name = getS0( fp ); filt->flags = getU2( fp ); rlen = get_flen(); filt->data = getbytes( fp, sz - rlen ); if ( id == ID_IFLT ) { lwListAdd( (void *) &clip->ifilter, filt ); clip->nifilters++; } else { lwListAdd( (void *) &clip->pfilter, filt ); clip->npfilters++; } break; default: break; } /* error while reading current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) goto Fail; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the CLIP chunk? */ rlen = _pico_memstream_tell( fp ) - pos; if ( cksize < rlen ) goto Fail; if ( cksize == rlen ) break; /* get the next chunk header */ set_flen( 0 ); id = getU4( fp ); sz = getU2( fp ); if ( 6 != get_flen() ) goto Fail; } return clip; Fail: lwFreeClip( clip ); return NULL; } /* ====================================================================== lwFindClip() Returns an lwClip pointer, given a clip index. ====================================================================== */ lwClip *lwFindClip( lwClip *list, int index ) { lwClip *clip; clip = list; while ( clip ) { if ( clip->index == index ) break; clip = clip->next; } return clip; } �����������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/envelope.c�����������������������������������������������������0000664�0000000�0000000�00000035154�12454246557�0021413�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ====================================================================== envelope.c Envelope functions for an LWO2 reader. Ernie Wright 16 Nov 00 ====================================================================== */ #include "../picointernal.h" #include "lwo2.h" /* ====================================================================== lwFreeEnvelope() Free the memory used by an lwEnvelope. ====================================================================== */ void lwFreeEnvelope( lwEnvelope *env ) { if ( env ) { if ( env->name ) _pico_free( env->name ); lwListFree( env->key, _pico_free ); lwListFree( env->cfilter, (void *) lwFreePlugin ); _pico_free( env ); } } static int compare_keys( lwKey *k1, lwKey *k2 ) { return k1->time > k2->time ? 1 : k1->time < k2->time ? -1 : 0; } /* ====================================================================== lwGetEnvelope() Read an ENVL chunk from an LWO2 file. ====================================================================== */ lwEnvelope *lwGetEnvelope( picoMemStream_t *fp, int cksize ) { lwEnvelope *env; lwKey *key; lwPlugin *plug; unsigned int id; unsigned short sz; float f[ 4 ]; int i, nparams, pos, rlen; key = NULL; /* allocate the Envelope structure */ env = _pico_calloc( 1, sizeof( lwEnvelope )); if ( !env ) goto Fail; /* remember where we started */ set_flen( 0 ); pos = _pico_memstream_tell( fp ); /* index */ env->index = getVX( fp ); /* first subchunk header */ id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) goto Fail; /* process subchunks as they're encountered */ while ( 1 ) { sz += sz & 1; set_flen( 0 ); switch ( id ) { case ID_TYPE: env->type = getU2( fp ); break; case ID_NAME: env->name = getS0( fp ); break; case ID_PRE: env->behavior[ 0 ] = getU2( fp ); break; case ID_POST: env->behavior[ 1 ] = getU2( fp ); break; case ID_KEY: key = _pico_calloc( 1, sizeof( lwKey )); if ( !key ) goto Fail; key->time = getF4( fp ); key->value = getF4( fp ); lwListInsert( (void **) &env->key, key, (void *) compare_keys ); env->nkeys++; break; case ID_SPAN: if ( !key ) goto Fail; key->shape = getU4( fp ); nparams = ( sz - 4 ) / 4; if ( nparams > 4 ) nparams = 4; for ( i = 0; i < nparams; i++ ) f[ i ] = getF4( fp ); switch ( key->shape ) { case ID_TCB: key->tension = f[ 0 ]; key->continuity = f[ 1 ]; key->bias = f[ 2 ]; break; case ID_BEZI: case ID_HERM: case ID_BEZ2: for ( i = 0; i < nparams; i++ ) key->param[ i ] = f[ i ]; break; } break; case ID_CHAN: plug = _pico_calloc( 1, sizeof( lwPlugin )); if ( !plug ) goto Fail; plug->name = getS0( fp ); plug->flags = getU2( fp ); plug->data = getbytes( fp, sz - get_flen() ); lwListAdd( (void *) &env->cfilter, plug ); env->ncfilters++; break; default: break; } /* error while reading current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) goto Fail; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the ENVL chunk? */ rlen = _pico_memstream_tell( fp ) - pos; if ( cksize < rlen ) goto Fail; if ( cksize == rlen ) break; /* get the next subchunk header */ set_flen( 0 ); id = getU4( fp ); sz = getU2( fp ); if ( 6 != get_flen() ) goto Fail; } return env; Fail: lwFreeEnvelope( env ); return NULL; } /* ====================================================================== lwFindEnvelope() Returns an lwEnvelope pointer, given an envelope index. ====================================================================== */ lwEnvelope *lwFindEnvelope( lwEnvelope *list, int index ) { lwEnvelope *env; env = list; while ( env ) { if ( env->index == index ) break; env = env->next; } return env; } /* ====================================================================== range() Given the value v of a periodic function, returns the equivalent value v2 in the principal interval [lo, hi]. If i isn't NULL, it receives the number of wavelengths between v and v2. v2 = v - i * (hi - lo) For example, range( 3 pi, 0, 2 pi, i ) returns pi, with i = 1. ====================================================================== */ static float range( float v, float lo, float hi, int *i ) { float v2, r = hi - lo; if ( r == 0.0 ) { if ( i ) *i = 0; return lo; } v2 = lo + v - r * ( float ) floor(( double ) v / r ); if ( i ) *i = -( int )(( v2 - v ) / r + ( v2 > v ? 0.5 : -0.5 )); return v2; } /* ====================================================================== hermite() Calculate the Hermite coefficients. ====================================================================== */ static void hermite( float t, float *h1, float *h2, float *h3, float *h4 ) { float t2, t3; t2 = t * t; t3 = t * t2; *h2 = 3.0f * t2 - t3 - t3; *h1 = 1.0f - *h2; *h4 = t3 - t2; *h3 = *h4 - t2 + t; } /* ====================================================================== bezier() Interpolate the value of a 1D Bezier curve. ====================================================================== */ static float bezier( float x0, float x1, float x2, float x3, float t ) { float a, b, c, t2, t3; t2 = t * t; t3 = t2 * t; c = 3.0f * ( x1 - x0 ); b = 3.0f * ( x2 - x1 ) - c; a = x3 - x0 - c - b; return a * t3 + b * t2 + c * t + x0; } /* ====================================================================== bez2_time() Find the t for which bezier() returns the input time. The handle endpoints of a BEZ2 curve represent the control points, and these have (time, value) coordinates, so time is used as both a coordinate and a parameter for this curve type. ====================================================================== */ static float bez2_time( float x0, float x1, float x2, float x3, float time, float *t0, float *t1 ) { float v, t; t = *t0 + ( *t1 - *t0 ) * 0.5f; v = bezier( x0, x1, x2, x3, t ); if ( fabs( time - v ) > .0001f ) { if ( v > time ) *t1 = t; else *t0 = t; return bez2_time( x0, x1, x2, x3, time, t0, t1 ); } else return t; } /* ====================================================================== bez2() Interpolate the value of a BEZ2 curve. ====================================================================== */ static float bez2( lwKey *key0, lwKey *key1, float time ) { float x, y, t, t0 = 0.0f, t1 = 1.0f; if ( key0->shape == ID_BEZ2 ) x = key0->time + key0->param[ 2 ]; else x = key0->time + ( key1->time - key0->time ) / 3.0f; t = bez2_time( key0->time, x, key1->time + key1->param[ 0 ], key1->time, time, &t0, &t1 ); if ( key0->shape == ID_BEZ2 ) y = key0->value + key0->param[ 3 ]; else y = key0->value + key0->param[ 1 ] / 3.0f; return bezier( key0->value, y, key1->param[ 1 ] + key1->value, key1->value, t ); } /* ====================================================================== outgoing() Return the outgoing tangent to the curve at key0. The value returned for the BEZ2 case is used when extrapolating a linear pre behavior and when interpolating a non-BEZ2 span. ====================================================================== */ static float outgoing( lwKey *key0, lwKey *key1 ) { float a, b, d, t, out; switch ( key0->shape ) { case ID_TCB: a = ( 1.0f - key0->tension ) * ( 1.0f + key0->continuity ) * ( 1.0f + key0->bias ); b = ( 1.0f - key0->tension ) * ( 1.0f - key0->continuity ) * ( 1.0f - key0->bias ); d = key1->value - key0->value; if ( key0->prev ) { t = ( key1->time - key0->time ) / ( key1->time - key0->prev->time ); out = t * ( a * ( key0->value - key0->prev->value ) + b * d ); } else out = b * d; break; case ID_LINE: d = key1->value - key0->value; if ( key0->prev ) { t = ( key1->time - key0->time ) / ( key1->time - key0->prev->time ); out = t * ( key0->value - key0->prev->value + d ); } else out = d; break; case ID_BEZI: case ID_HERM: out = key0->param[ 1 ]; if ( key0->prev ) out *= ( key1->time - key0->time ) / ( key1->time - key0->prev->time ); break; case ID_BEZ2: out = key0->param[ 3 ] * ( key1->time - key0->time ); if ( fabs( key0->param[ 2 ] ) > 1e-5f ) out /= key0->param[ 2 ]; else out *= 1e5f; break; case ID_STEP: default: out = 0.0f; break; } return out; } /* ====================================================================== incoming() Return the incoming tangent to the curve at key1. The value returned for the BEZ2 case is used when extrapolating a linear post behavior. ====================================================================== */ static float incoming( lwKey *key0, lwKey *key1 ) { float a, b, d, t, in; switch ( key1->shape ) { case ID_LINE: d = key1->value - key0->value; if ( key1->next ) { t = ( key1->time - key0->time ) / ( key1->next->time - key0->time ); in = t * ( key1->next->value - key1->value + d ); } else in = d; break; case ID_TCB: a = ( 1.0f - key1->tension ) * ( 1.0f - key1->continuity ) * ( 1.0f + key1->bias ); b = ( 1.0f - key1->tension ) * ( 1.0f + key1->continuity ) * ( 1.0f - key1->bias ); d = key1->value - key0->value; if ( key1->next ) { t = ( key1->time - key0->time ) / ( key1->next->time - key0->time ); in = t * ( b * ( key1->next->value - key1->value ) + a * d ); } else in = a * d; break; case ID_BEZI: case ID_HERM: in = key1->param[ 0 ]; if ( key1->next ) in *= ( key1->time - key0->time ) / ( key1->next->time - key0->time ); break; return in; case ID_BEZ2: in = key1->param[ 1 ] * ( key1->time - key0->time ); if ( fabs( key1->param[ 0 ] ) > 1e-5f ) in /= key1->param[ 0 ]; else in *= 1e5f; break; case ID_STEP: default: in = 0.0f; break; } return in; } /* ====================================================================== evalEnvelope() Given a list of keys and a time, returns the interpolated value of the envelope at that time. ====================================================================== */ float evalEnvelope( lwEnvelope *env, float time ) { lwKey *key0, *key1, *skey, *ekey; float t, h1, h2, h3, h4, in, out, offset = 0.0f; int noff; /* if there's no key, the value is 0 */ if ( env->nkeys == 0 ) return 0.0f; /* if there's only one key, the value is constant */ if ( env->nkeys == 1 ) return env->key->value; /* find the first and last keys */ skey = ekey = env->key; while ( ekey->next ) ekey = ekey->next; /* use pre-behavior if time is before first key time */ if ( time < skey->time ) { switch ( env->behavior[ 0 ] ) { case BEH_RESET: return 0.0f; case BEH_CONSTANT: return skey->value; case BEH_REPEAT: time = range( time, skey->time, ekey->time, NULL ); break; case BEH_OSCILLATE: time = range( time, skey->time, ekey->time, &noff ); if ( noff % 2 ) time = ekey->time - skey->time - time; break; case BEH_OFFSET: time = range( time, skey->time, ekey->time, &noff ); offset = noff * ( ekey->value - skey->value ); break; case BEH_LINEAR: out = outgoing( skey, skey->next ) / ( skey->next->time - skey->time ); return out * ( time - skey->time ) + skey->value; } } /* use post-behavior if time is after last key time */ else if ( time > ekey->time ) { switch ( env->behavior[ 1 ] ) { case BEH_RESET: return 0.0f; case BEH_CONSTANT: return ekey->value; case BEH_REPEAT: time = range( time, skey->time, ekey->time, NULL ); break; case BEH_OSCILLATE: time = range( time, skey->time, ekey->time, &noff ); if ( noff % 2 ) time = ekey->time - skey->time - time; break; case BEH_OFFSET: time = range( time, skey->time, ekey->time, &noff ); offset = noff * ( ekey->value - skey->value ); break; case BEH_LINEAR: in = incoming( ekey->prev, ekey ) / ( ekey->time - ekey->prev->time ); return in * ( time - ekey->time ) + ekey->value; } } /* get the endpoints of the interval being evaluated */ key0 = env->key; while ( time > key0->next->time ) key0 = key0->next; key1 = key0->next; /* check for singularities first */ if ( time == key0->time ) return key0->value + offset; else if ( time == key1->time ) return key1->value + offset; /* get interval length, time in [0, 1] */ t = ( time - key0->time ) / ( key1->time - key0->time ); /* interpolate */ switch ( key1->shape ) { case ID_TCB: case ID_BEZI: case ID_HERM: out = outgoing( key0, key1 ); in = incoming( key0, key1 ); hermite( t, &h1, &h2, &h3, &h4 ); return h1 * key0->value + h2 * key1->value + h3 * out + h4 * in + offset; case ID_BEZ2: return bez2( key0, key1, time ) + offset; case ID_LINE: return key0->value + t * ( key1->value - key0->value ) + offset; case ID_STEP: return key0->value + offset; default: return offset; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/list.c���������������������������������������������������������0000664�0000000�0000000�00000004001�12454246557�0020534�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ====================================================================== list.c Generic linked list operations. Ernie Wright 17 Sep 00 ====================================================================== */ #include "../picointernal.h" #include "lwo2.h" /* ====================================================================== lwListFree() Free the items in a list. ====================================================================== */ void lwListFree( void *list, void ( *freeNode )( void * )) { lwNode *node, *next; node = ( lwNode * ) list; while ( node ) { next = node->next; freeNode( node ); node = next; } } /* ====================================================================== lwListAdd() Append a node to a list. ====================================================================== */ void lwListAdd( void **list, void *node ) { lwNode *head, *tail; head = *(( lwNode ** ) list ); if ( !head ) { *list = node; return; } while ( head ) { tail = head; head = head->next; } tail->next = ( lwNode * ) node; (( lwNode * ) node )->prev = tail; } /* ====================================================================== lwListInsert() Insert a node into a list in sorted order. ====================================================================== */ void lwListInsert( void **vlist, void *vitem, int ( *compare )( void *, void * )) { lwNode **list, *item, *node, *prev; if ( !*vlist ) { *vlist = vitem; return; } list = ( lwNode ** ) vlist; item = ( lwNode * ) vitem; node = *list; prev = NULL; while ( node ) { if ( 0 < compare( node, item )) break; prev = node; node = node->next; } if ( !prev ) { *list = item; node->prev = item; item->next = node; } else if ( !node ) { prev->next = item; item->prev = prev; } else { item->next = node; item->prev = prev; prev->next = item; node->prev = item; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/lwio.c���������������������������������������������������������0000664�0000000�0000000�00000017152�12454246557�0020546�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ====================================================================== lwio.c Functions for reading basic LWO2 data types. Ernie Wright 17 Sep 00 ====================================================================== */ #include "../picointernal.h" #include "lwo2.h" /* ====================================================================== flen This accumulates a count of the number of bytes read. Callers can set it at the beginning of a sequence of reads and then retrieve it to get the number of bytes actually read. If one of the I/O functions fails, flen is set to an error code, after which the I/O functions ignore read requests until flen is reset. ====================================================================== */ #define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */ #define FLEN_ERROR INT_MIN static int flen; void set_flen( int i ) { flen = i; } int get_flen( void ) { return flen; } #ifndef __BIG_ENDIAN__ /* ===================================================================== revbytes() Reverses byte order in place. INPUTS bp bytes to reverse elsize size of the underlying data type elcount number of elements to swap RESULTS Reverses the byte order in each of elcount elements. This only needs to be defined on little-endian platforms, most notably Windows. lwo2.h replaces this with a #define on big-endian platforms. ===================================================================== */ void revbytes( void *bp, int elsize, int elcount ) { register unsigned char *p, *q; p = ( unsigned char * ) bp; if ( elsize == 2 ) { q = p + 1; while ( elcount-- ) { *p ^= *q; *q ^= *p; *p ^= *q; p += 2; q += 2; } return; } while ( elcount-- ) { q = p + elsize - 1; while ( p < q ) { *p ^= *q; *q ^= *p; *p ^= *q; ++p; --q; } p += elsize >> 1; } } #endif void *getbytes( picoMemStream_t *fp, int size ) { void *data; if ( flen == FLEN_ERROR ) return NULL; if ( size < 0 ) { flen = FLEN_ERROR; return NULL; } data = _pico_alloc( size ); if ( !data ) { flen = FLEN_ERROR; return NULL; } if ( 1 != _pico_memstream_read( fp, data, size )) { flen = FLEN_ERROR; _pico_free( data ); return NULL; } flen += size; return data; } void skipbytes( picoMemStream_t *fp, int n ) { if ( flen == FLEN_ERROR ) return; if ( _pico_memstream_seek( fp, n, PICO_SEEK_CUR )) flen = FLEN_ERROR; else flen += n; } int getI1( picoMemStream_t *fp ) { int i; if ( flen == FLEN_ERROR ) return 0; i = _pico_memstream_getc( fp ); if ( i < 0 ) { flen = FLEN_ERROR; return 0; } if ( i > 127 ) i -= 256; flen += 1; return i; } short getI2( picoMemStream_t *fp ) { short i; if ( flen == FLEN_ERROR ) return 0; if ( 1 != _pico_memstream_read( fp, &i, 2 )) { flen = FLEN_ERROR; return 0; } revbytes( &i, 2, 1 ); flen += 2; return i; } int getI4( picoMemStream_t *fp ) { int i; if ( flen == FLEN_ERROR ) return 0; if ( 1 != _pico_memstream_read( fp, &i, 4 )) { flen = FLEN_ERROR; return 0; } revbytes( &i, 4, 1 ); flen += 4; return i; } unsigned char getU1( picoMemStream_t *fp ) { int i; if ( flen == FLEN_ERROR ) return 0; i = _pico_memstream_getc( fp ); if ( i < 0 ) { flen = FLEN_ERROR; return 0; } flen += 1; return i; } unsigned short getU2( picoMemStream_t *fp ) { unsigned short i; if ( flen == FLEN_ERROR ) return 0; if ( 1 != _pico_memstream_read( fp, &i, 2 )) { flen = FLEN_ERROR; return 0; } revbytes( &i, 2, 1 ); flen += 2; return i; } unsigned int getU4( picoMemStream_t *fp ) { unsigned int i; if ( flen == FLEN_ERROR ) return 0; if ( 1 != _pico_memstream_read( fp, &i, 4 )) { flen = FLEN_ERROR; return 0; } revbytes( &i, 4, 1 ); flen += 4; return i; } int getVX( picoMemStream_t *fp ) { int i, c; if ( flen == FLEN_ERROR ) return 0; c = _pico_memstream_getc( fp ); if ( c != 0xFF ) { i = c << 8; c = _pico_memstream_getc( fp ); i |= c; flen += 2; } else { c = _pico_memstream_getc( fp ); i = c << 16; c = _pico_memstream_getc( fp ); i |= c << 8; c = _pico_memstream_getc( fp ); i |= c; flen += 4; } if ( _pico_memstream_error( fp )) { flen = FLEN_ERROR; return 0; } return i; } float getF4( picoMemStream_t *fp ) { float f; if ( flen == FLEN_ERROR ) return 0.0f; if ( 1 != _pico_memstream_read( fp, &f, 4 )) { flen = FLEN_ERROR; return 0.0f; } revbytes( &f, 4, 1 ); flen += 4; return f; } char *getS0( picoMemStream_t *fp ) { char *s; int i, c, len, pos; if ( flen == FLEN_ERROR ) return NULL; pos = _pico_memstream_tell( fp ); for ( i = 1; ; i++ ) { c = _pico_memstream_getc( fp ); if ( c <= 0 ) break; } if ( c < 0 ) { flen = FLEN_ERROR; return NULL; } if ( i == 1 ) { if ( _pico_memstream_seek( fp, pos + 2, PICO_SEEK_SET )) flen = FLEN_ERROR; else flen += 2; return NULL; } len = i + ( i & 1 ); s = _pico_alloc( len ); if ( !s ) { flen = FLEN_ERROR; return NULL; } if ( _pico_memstream_seek( fp, pos, PICO_SEEK_SET )) { flen = FLEN_ERROR; return NULL; } if ( 1 != _pico_memstream_read( fp, s, len )) { flen = FLEN_ERROR; return NULL; } flen += len; return s; } int sgetI1( unsigned char **bp ) { int i; if ( flen == FLEN_ERROR ) return 0; i = **bp; if ( i > 127 ) i -= 256; flen += 1; (*bp)++; return i; } short sgetI2( unsigned char **bp ) { short i; if ( flen == FLEN_ERROR ) return 0; memcpy( &i, *bp, 2 ); revbytes( &i, 2, 1 ); flen += 2; *bp += 2; return i; } int sgetI4( unsigned char **bp ) { int i; if ( flen == FLEN_ERROR ) return 0; memcpy( &i, *bp, 4 ); revbytes( &i, 4, 1 ); flen += 4; *bp += 4; return i; } unsigned char sgetU1( unsigned char **bp ) { unsigned char c; if ( flen == FLEN_ERROR ) return 0; c = **bp; flen += 1; (*bp)++; return c; } unsigned short sgetU2( unsigned char **bp ) { unsigned char *buf = *bp; unsigned short i; if ( flen == FLEN_ERROR ) return 0; i = ( buf[ 0 ] << 8 ) | buf[ 1 ]; flen += 2; *bp += 2; return i; } unsigned int sgetU4( unsigned char **bp ) { unsigned int i; if ( flen == FLEN_ERROR ) return 0; memcpy( &i, *bp, 4 ); revbytes( &i, 4, 1 ); flen += 4; *bp += 4; return i; } int sgetVX( unsigned char **bp ) { unsigned char *buf = *bp; int i; if ( flen == FLEN_ERROR ) return 0; if ( buf[ 0 ] != 0xFF ) { i = buf[ 0 ] << 8 | buf[ 1 ]; flen += 2; *bp += 2; } else { i = ( buf[ 1 ] << 16 ) | ( buf[ 2 ] << 8 ) | buf[ 3 ]; flen += 4; *bp += 4; } return i; } float sgetF4( unsigned char **bp ) { float f; if ( flen == FLEN_ERROR ) return 0.0f; memcpy( &f, *bp, 4 ); revbytes( &f, 4, 1 ); flen += 4; *bp += 4; return f; } char *sgetS0( unsigned char **bp ) { char *s; unsigned char *buf = *bp; int len; if ( flen == FLEN_ERROR ) return NULL; len = strlen( (char*)buf ) + 1; if ( len == 1 ) { flen += 2; *bp += 2; return NULL; } len += len & 1; s = _pico_alloc( len ); if ( !s ) { flen = FLEN_ERROR; return NULL; } memcpy( s, buf, len ); flen += len; *bp += len; return s; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/lwo2.c���������������������������������������������������������0000664�0000000�0000000�00000020305�12454246557�0020451�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ====================================================================== lwo2.c The entry point for loading LightWave object files. Ernie Wright 17 Sep 00 ====================================================================== */ #include "../picointernal.h" #include "lwo2.h" /* disable warnings */ #ifdef WIN32 #pragma warning( disable:4018 ) /* signed/unsigned mismatch */ #endif /* ====================================================================== lwFreeLayer() Free memory used by an lwLayer. ====================================================================== */ void lwFreeLayer( lwLayer *layer ) { if ( layer ) { if ( layer->name ) _pico_free( layer->name ); lwFreePoints( &layer->point ); lwFreePolygons( &layer->polygon ); lwListFree( layer->vmap, (void *) lwFreeVMap ); _pico_free( layer ); } } /* ====================================================================== lwFreeObject() Free memory used by an lwObject. ====================================================================== */ void lwFreeObject( lwObject *object ) { if ( object ) { lwListFree( object->layer, (void *) lwFreeLayer ); lwListFree( object->env, (void *) lwFreeEnvelope ); lwListFree( object->clip, (void *) lwFreeClip ); lwListFree( object->surf, (void *) lwFreeSurface ); lwFreeTags( &object->taglist ); _pico_free( object ); } } /* ====================================================================== lwGetObject() Returns the contents of a LightWave object, given its filename, or NULL if the file couldn't be loaded. On failure, failID and failpos can be used to diagnose the cause. 1. If the file isn't an LWO2 or an LWOB, failpos will contain 12 and failID will be unchanged. 2. If an error occurs while reading, failID will contain the most recently read IFF chunk ID, and failpos will contain the value returned by _pico_memstream_tell() at the time of the failure. 3. If the file couldn't be opened, or an error occurs while reading the first 12 bytes, both failID and failpos will be unchanged. If you don't need this information, failID and failpos can be NULL. ====================================================================== */ lwObject *lwGetObject( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos ) { lwObject *object; lwLayer *layer; lwNode *node; unsigned int id, formsize, type, cksize; int i, rlen; /* open the file */ if ( !fp ) return NULL; /* read the first 12 bytes */ set_flen( 0 ); id = getU4( fp ); formsize = getU4( fp ); type = getU4( fp ); if ( 12 != get_flen() ) { return NULL; } /* is this a LW object? */ if ( id != ID_FORM ) { if ( failpos ) *failpos = 12; return NULL; } if ( type != ID_LWO2 ) { if ( type == ID_LWOB ) return lwGetObject5( filename, fp, failID, failpos ); else { if ( failpos ) *failpos = 12; return NULL; } } /* allocate an object and a default layer */ object = _pico_calloc( 1, sizeof( lwObject )); if ( !object ) goto Fail; layer = _pico_calloc( 1, sizeof( lwLayer )); if ( !layer ) goto Fail; object->layer = layer; /* get the first chunk header */ id = getU4( fp ); cksize = getU4( fp ); if ( 0 > get_flen() ) goto Fail; /* process chunks as they're encountered */ while ( 1 ) { cksize += cksize & 1; switch ( id ) { case ID_LAYR: if ( object->nlayers > 0 ) { layer = _pico_calloc( 1, sizeof( lwLayer )); if ( !layer ) goto Fail; lwListAdd( (void **) &object->layer, layer ); } object->nlayers++; set_flen( 0 ); layer->index = getU2( fp ); layer->flags = getU2( fp ); layer->pivot[ 0 ] = getF4( fp ); layer->pivot[ 1 ] = getF4( fp ); layer->pivot[ 2 ] = getF4( fp ); layer->name = getS0( fp ); rlen = get_flen(); if ( rlen < 0 || rlen > cksize ) goto Fail; if ( rlen <= cksize - 2 ) layer->parent = getU2( fp ); rlen = get_flen(); if ( rlen < cksize ) _pico_memstream_seek( fp, cksize - rlen, PICO_SEEK_CUR ); break; case ID_PNTS: if ( !lwGetPoints( fp, cksize, &layer->point )) goto Fail; break; case ID_POLS: if ( !lwGetPolygons( fp, cksize, &layer->polygon, layer->point.offset )) goto Fail; break; case ID_VMAP: case ID_VMAD: node = ( lwNode * ) lwGetVMap( fp, cksize, layer->point.offset, layer->polygon.offset, id == ID_VMAD ); if ( !node ) goto Fail; lwListAdd( (void **) &layer->vmap, node ); layer->nvmaps++; break; case ID_PTAG: if ( !lwGetPolygonTags( fp, cksize, &object->taglist, &layer->polygon )) goto Fail; break; case ID_BBOX: set_flen( 0 ); for ( i = 0; i < 6; i++ ) layer->bbox[ i ] = getF4( fp ); rlen = get_flen(); if ( rlen < 0 || rlen > cksize ) goto Fail; if ( rlen < cksize ) _pico_memstream_seek( fp, cksize - rlen, PICO_SEEK_CUR ); break; case ID_TAGS: if ( !lwGetTags( fp, cksize, &object->taglist )) goto Fail; break; case ID_ENVL: node = ( lwNode * ) lwGetEnvelope( fp, cksize ); if ( !node ) goto Fail; lwListAdd( (void **) &object->env, node ); object->nenvs++; break; case ID_CLIP: node = ( lwNode * ) lwGetClip( fp, cksize ); if ( !node ) goto Fail; lwListAdd( (void **) &object->clip, node ); object->nclips++; break; case ID_SURF: node = ( lwNode * ) lwGetSurface( fp, cksize ); if ( !node ) goto Fail; lwListAdd( (void **) &object->surf, node ); object->nsurfs++; break; case ID_DESC: case ID_TEXT: case ID_ICON: default: _pico_memstream_seek( fp, cksize, PICO_SEEK_CUR ); break; } /* end of the file? */ if ( formsize <= _pico_memstream_tell( fp ) - 8 ) break; /* get the next chunk header */ set_flen( 0 ); id = getU4( fp ); cksize = getU4( fp ); if ( 8 != get_flen() ) goto Fail; } if ( object->nlayers == 0 ) object->nlayers = 1; layer = object->layer; while ( layer ) { lwGetBoundingBox( &layer->point, layer->bbox ); lwGetPolyNormals( &layer->point, &layer->polygon ); if ( !lwGetPointPolygons( &layer->point, &layer->polygon )) goto Fail; if ( !lwResolvePolySurfaces( &layer->polygon, &object->taglist, &object->surf, &object->nsurfs )) goto Fail; lwGetVertNormals( &layer->point, &layer->polygon ); if ( !lwGetPointVMaps( &layer->point, layer->vmap )) goto Fail; if ( !lwGetPolyVMaps( &layer->polygon, layer->vmap )) goto Fail; layer = layer->next; } return object; Fail: if ( failID ) *failID = id; if ( fp ) { if ( failpos ) *failpos = _pico_memstream_tell( fp ); } lwFreeObject( object ); return NULL; } int lwValidateObject( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos ) { unsigned int id, formsize, type; /* open the file */ if ( !fp ) return PICO_PMV_ERROR_MEMORY; /* read the first 12 bytes */ set_flen( 0 ); id = getU4( fp ); formsize = getU4( fp ); type = getU4( fp ); if ( 12 != get_flen() ) { return PICO_PMV_ERROR_SIZE; } /* is this a LW object? */ if ( id != ID_FORM ) { if ( failpos ) *failpos = 12; return PICO_PMV_ERROR_SIZE; } if ( type != ID_LWO2 ) { if ( type == ID_LWOB ) return lwValidateObject5( filename, fp, failID, failpos ); else { if ( failpos ) *failpos = 12; return PICO_PMV_ERROR_IDENT; } } return PICO_PMV_OK; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/lwo2.h���������������������������������������������������������0000664�0000000�0000000�00000045410�12454246557�0020462�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ====================================================================== lwo2.h Definitions and typedefs for LWO2 files. Ernie Wright 17 Sep 00 ====================================================================== */ #ifndef LWO2_H #define LWO2_H /* chunk and subchunk IDs */ #define LWID_(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d)) #define ID_FORM LWID_('F','O','R','M') #define ID_LWO2 LWID_('L','W','O','2') #define ID_LWOB LWID_('L','W','O','B') /* top-level chunks */ #define ID_LAYR LWID_('L','A','Y','R') #define ID_TAGS LWID_('T','A','G','S') #define ID_PNTS LWID_('P','N','T','S') #define ID_BBOX LWID_('B','B','O','X') #define ID_VMAP LWID_('V','M','A','P') #define ID_VMAD LWID_('V','M','A','D') #define ID_POLS LWID_('P','O','L','S') #define ID_PTAG LWID_('P','T','A','G') #define ID_ENVL LWID_('E','N','V','L') #define ID_CLIP LWID_('C','L','I','P') #define ID_SURF LWID_('S','U','R','F') #define ID_DESC LWID_('D','E','S','C') #define ID_TEXT LWID_('T','E','X','T') #define ID_ICON LWID_('I','C','O','N') /* polygon types */ #define ID_FACE LWID_('F','A','C','E') #define ID_CURV LWID_('C','U','R','V') #define ID_PTCH LWID_('P','T','C','H') #define ID_MBAL LWID_('M','B','A','L') #define ID_BONE LWID_('B','O','N','E') /* polygon tags */ #define ID_SURF LWID_('S','U','R','F') #define ID_PART LWID_('P','A','R','T') #define ID_SMGP LWID_('S','M','G','P') /* envelopes */ #define ID_PRE LWID_('P','R','E',' ') #define ID_POST LWID_('P','O','S','T') #define ID_KEY LWID_('K','E','Y',' ') #define ID_SPAN LWID_('S','P','A','N') #define ID_TCB LWID_('T','C','B',' ') #define ID_HERM LWID_('H','E','R','M') #define ID_BEZI LWID_('B','E','Z','I') #define ID_BEZ2 LWID_('B','E','Z','2') #define ID_LINE LWID_('L','I','N','E') #define ID_STEP LWID_('S','T','E','P') /* clips */ #define ID_STIL LWID_('S','T','I','L') #define ID_ISEQ LWID_('I','S','E','Q') #define ID_ANIM LWID_('A','N','I','M') #define ID_XREF LWID_('X','R','E','F') #define ID_STCC LWID_('S','T','C','C') #define ID_TIME LWID_('T','I','M','E') #define ID_CONT LWID_('C','O','N','T') #define ID_BRIT LWID_('B','R','I','T') #define ID_SATR LWID_('S','A','T','R') #define ID_HUE LWID_('H','U','E',' ') #define ID_GAMM LWID_('G','A','M','M') #define ID_NEGA LWID_('N','E','G','A') #define ID_IFLT LWID_('I','F','L','T') #define ID_PFLT LWID_('P','F','L','T') /* surfaces */ #define ID_COLR LWID_('C','O','L','R') #define ID_LUMI LWID_('L','U','M','I') #define ID_DIFF LWID_('D','I','F','F') #define ID_SPEC LWID_('S','P','E','C') #define ID_GLOS LWID_('G','L','O','S') #define ID_REFL LWID_('R','E','F','L') #define ID_RFOP LWID_('R','F','O','P') #define ID_RIMG LWID_('R','I','M','G') #define ID_RSAN LWID_('R','S','A','N') #define ID_TRAN LWID_('T','R','A','N') #define ID_TROP LWID_('T','R','O','P') #define ID_TIMG LWID_('T','I','M','G') #define ID_RIND LWID_('R','I','N','D') #define ID_TRNL LWID_('T','R','N','L') #define ID_BUMP LWID_('B','U','M','P') #define ID_SMAN LWID_('S','M','A','N') #define ID_SIDE LWID_('S','I','D','E') #define ID_CLRH LWID_('C','L','R','H') #define ID_CLRF LWID_('C','L','R','F') #define ID_ADTR LWID_('A','D','T','R') #define ID_SHRP LWID_('S','H','R','P') #define ID_LINE LWID_('L','I','N','E') #define ID_LSIZ LWID_('L','S','I','Z') #define ID_ALPH LWID_('A','L','P','H') #define ID_AVAL LWID_('A','V','A','L') #define ID_GVAL LWID_('G','V','A','L') #define ID_BLOK LWID_('B','L','O','K') /* texture layer */ #define ID_TYPE LWID_('T','Y','P','E') #define ID_CHAN LWID_('C','H','A','N') #define ID_NAME LWID_('N','A','M','E') #define ID_ENAB LWID_('E','N','A','B') #define ID_OPAC LWID_('O','P','A','C') #define ID_FLAG LWID_('F','L','A','G') #define ID_PROJ LWID_('P','R','O','J') #define ID_STCK LWID_('S','T','C','K') #define ID_TAMP LWID_('T','A','M','P') /* texture coordinates */ #define ID_TMAP LWID_('T','M','A','P') #define ID_AXIS LWID_('A','X','I','S') #define ID_CNTR LWID_('C','N','T','R') #define ID_SIZE LWID_('S','I','Z','E') #define ID_ROTA LWID_('R','O','T','A') #define ID_OREF LWID_('O','R','E','F') #define ID_FALL LWID_('F','A','L','L') #define ID_CSYS LWID_('C','S','Y','S') /* image map */ #define ID_IMAP LWID_('I','M','A','P') #define ID_IMAG LWID_('I','M','A','G') #define ID_WRAP LWID_('W','R','A','P') #define ID_WRPW LWID_('W','R','P','W') #define ID_WRPH LWID_('W','R','P','H') #define ID_VMAP LWID_('V','M','A','P') #define ID_AAST LWID_('A','A','S','T') #define ID_PIXB LWID_('P','I','X','B') /* procedural */ #define ID_PROC LWID_('P','R','O','C') #define ID_COLR LWID_('C','O','L','R') #define ID_VALU LWID_('V','A','L','U') #define ID_FUNC LWID_('F','U','N','C') #define ID_FTPS LWID_('F','T','P','S') #define ID_ITPS LWID_('I','T','P','S') #define ID_ETPS LWID_('E','T','P','S') /* gradient */ #define ID_GRAD LWID_('G','R','A','D') #define ID_GRST LWID_('G','R','S','T') #define ID_GREN LWID_('G','R','E','N') #define ID_PNAM LWID_('P','N','A','M') #define ID_INAM LWID_('I','N','A','M') #define ID_GRPT LWID_('G','R','P','T') #define ID_FKEY LWID_('F','K','E','Y') #define ID_IKEY LWID_('I','K','E','Y') /* shader */ #define ID_SHDR LWID_('S','H','D','R') #define ID_DATA LWID_('D','A','T','A') /* generic linked list */ typedef struct st_lwNode { struct st_lwNode *next, *prev; void *data; } lwNode; /* plug-in reference */ typedef struct st_lwPlugin { struct st_lwPlugin *next, *prev; char *ord; char *name; int flags; void *data; } lwPlugin; /* envelopes */ typedef struct st_lwKey { struct st_lwKey *next, *prev; float value; float time; unsigned int shape; /* ID_TCB, ID_BEZ2, etc. */ float tension; float continuity; float bias; float param[ 4 ]; } lwKey; typedef struct st_lwEnvelope { struct st_lwEnvelope *next, *prev; int index; int type; char *name; lwKey *key; /* linked list of keys */ int nkeys; int behavior[ 2 ]; /* pre and post (extrapolation) */ lwPlugin *cfilter; /* linked list of channel filters */ int ncfilters; } lwEnvelope; #define BEH_RESET 0 #define BEH_CONSTANT 1 #define BEH_REPEAT 2 #define BEH_OSCILLATE 3 #define BEH_OFFSET 4 #define BEH_LINEAR 5 /* values that can be enveloped */ typedef struct st_lwEParam { float val; int eindex; } lwEParam; typedef struct st_lwVParam { float val[ 3 ]; int eindex; } lwVParam; /* clips */ typedef struct st_lwClipStill { char *name; } lwClipStill; typedef struct st_lwClipSeq { char *prefix; /* filename before sequence digits */ char *suffix; /* after digits, e.g. extensions */ int digits; int flags; int offset; int start; int end; } lwClipSeq; typedef struct st_lwClipAnim { char *name; char *server; /* anim loader plug-in */ void *data; } lwClipAnim; typedef struct st_lwClipXRef { char *string; int index; struct st_lwClip *clip; } lwClipXRef; typedef struct st_lwClipCycle { char *name; int lo; int hi; } lwClipCycle; typedef struct st_lwClip { struct st_lwClip *next, *prev; int index; unsigned int type; /* ID_STIL, ID_ISEQ, etc. */ union { lwClipStill still; lwClipSeq seq; lwClipAnim anim; lwClipXRef xref; lwClipCycle cycle; } source; float start_time; float duration; float frame_rate; lwEParam contrast; lwEParam brightness; lwEParam saturation; lwEParam hue; lwEParam gamma; int negative; lwPlugin *ifilter; /* linked list of image filters */ int nifilters; lwPlugin *pfilter; /* linked list of pixel filters */ int npfilters; } lwClip; /* textures */ typedef struct st_lwTMap { lwVParam size; lwVParam center; lwVParam rotate; lwVParam falloff; int fall_type; char *ref_object; int coord_sys; } lwTMap; typedef struct st_lwImageMap { int cindex; int projection; char *vmap_name; int axis; int wrapw_type; int wraph_type; lwEParam wrapw; lwEParam wraph; float aa_strength; int aas_flags; int pblend; lwEParam stck; lwEParam amplitude; } lwImageMap; #define PROJ_PLANAR 0 #define PROJ_CYLINDRICAL 1 #define PROJ_SPHERICAL 2 #define PROJ_CUBIC 3 #define PROJ_FRONT 4 #define WRAP_NONE 0 #define WRAP_EDGE 1 #define WRAP_REPEAT 2 #define WRAP_MIRROR 3 typedef struct st_lwProcedural { int axis; float value[ 3 ]; char *name; void *data; } lwProcedural; typedef struct st_lwGradKey { struct st_lwGradKey *next, *prev; float value; float rgba[ 4 ]; } lwGradKey; typedef struct st_lwGradient { char *paramname; char *itemname; float start; float end; int repeat; lwGradKey *key; /* array of gradient keys */ short *ikey; /* array of interpolation codes */ } lwGradient; typedef struct st_lwTexture { struct st_lwTexture *next, *prev; char *ord; unsigned int type; unsigned int chan; lwEParam opacity; short opac_type; short enabled; short negative; short axis; union { lwImageMap imap; lwProcedural proc; lwGradient grad; } param; lwTMap tmap; } lwTexture; /* values that can be textured */ typedef struct st_lwTParam { float val; int eindex; lwTexture *tex; /* linked list of texture layers */ } lwTParam; typedef struct st_lwCParam { float rgb[ 3 ]; int eindex; lwTexture *tex; /* linked list of texture layers */ } lwCParam; /* surfaces */ typedef struct st_lwGlow { short enabled; short type; lwEParam intensity; lwEParam size; } Glow; typedef struct st_lwRMap { lwTParam val; int options; int cindex; float seam_angle; } lwRMap; typedef struct st_lwLine { short enabled; unsigned short flags; lwEParam size; } lwLine; typedef struct st_lwSurface { struct st_lwSurface *next, *prev; char *name; char *srcname; lwCParam color; lwTParam luminosity; lwTParam diffuse; lwTParam specularity; lwTParam glossiness; lwRMap reflection; lwRMap transparency; lwTParam eta; lwTParam translucency; lwTParam bump; float smooth; int sideflags; float alpha; int alpha_mode; lwEParam color_hilite; lwEParam color_filter; lwEParam add_trans; lwEParam dif_sharp; lwEParam glow; lwLine line; lwPlugin *shader; /* linked list of shaders */ int nshaders; } lwSurface; /* vertex maps */ typedef struct st_lwVMap { struct st_lwVMap *next, *prev; char *name; unsigned int type; int dim; int nverts; int perpoly; int *vindex; /* array of point indexes */ int *pindex; /* array of polygon indexes */ float **val; } lwVMap; typedef struct st_lwVMapPt { lwVMap *vmap; int index; /* vindex or pindex element */ } lwVMapPt; /* points and polygons */ typedef struct st_lwPoint { float pos[ 3 ]; int npols; /* number of polygons sharing the point */ int *pol; /* array of polygon indexes */ int nvmaps; lwVMapPt *vm; /* array of vmap references */ } lwPoint; typedef struct st_lwPolVert { int index; /* index into the point array */ float norm[ 3 ]; int nvmaps; lwVMapPt *vm; /* array of vmap references */ } lwPolVert; typedef struct st_lwPolygon { lwSurface *surf; int part; /* part index */ int smoothgrp; /* smoothing group */ int flags; unsigned int type; float norm[ 3 ]; int nverts; lwPolVert *v; /* array of vertex records */ } lwPolygon; typedef struct st_lwPointList { int count; int offset; /* only used during reading */ lwPoint *pt; /* array of points */ } lwPointList; typedef struct st_lwPolygonList { int count; int offset; /* only used during reading */ int vcount; /* total number of vertices */ int voffset; /* only used during reading */ lwPolygon *pol; /* array of polygons */ } lwPolygonList; /* geometry layers */ typedef struct st_lwLayer { struct st_lwLayer *next, *prev; char *name; int index; int parent; int flags; float pivot[ 3 ]; float bbox[ 6 ]; lwPointList point; lwPolygonList polygon; int nvmaps; lwVMap *vmap; /* linked list of vmaps */ } lwLayer; /* tag strings */ typedef struct st_lwTagList { int count; int offset; /* only used during reading */ char **tag; /* array of strings */ } lwTagList; /* an object */ typedef struct st_lwObject { lwLayer *layer; /* linked list of layers */ lwEnvelope *env; /* linked list of envelopes */ lwClip *clip; /* linked list of clips */ lwSurface *surf; /* linked list of surfaces */ lwTagList taglist; int nlayers; int nenvs; int nclips; int nsurfs; } lwObject; /* lwo2.c */ void lwFreeLayer( lwLayer *layer ); void lwFreeObject( lwObject *object ); lwObject *lwGetObject( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos ); int lwValidateObject( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos ); /* pntspols.c */ void lwFreePoints( lwPointList *point ); void lwFreePolygons( lwPolygonList *plist ); int lwGetPoints( picoMemStream_t *fp, int cksize, lwPointList *point ); void lwGetBoundingBox( lwPointList *point, float bbox[] ); int lwAllocPolygons( lwPolygonList *plist, int npols, int nverts ); int lwGetPolygons( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset ); void lwGetPolyNormals( lwPointList *point, lwPolygonList *polygon ); int lwGetPointPolygons( lwPointList *point, lwPolygonList *polygon ); int lwResolvePolySurfaces( lwPolygonList *polygon, lwTagList *tlist, lwSurface **surf, int *nsurfs ); void lwGetVertNormals( lwPointList *point, lwPolygonList *polygon ); void lwFreeTags( lwTagList *tlist ); int lwGetTags( picoMemStream_t *fp, int cksize, lwTagList *tlist ); int lwGetPolygonTags( picoMemStream_t *fp, int cksize, lwTagList *tlist, lwPolygonList *plist ); /* vmap.c */ void lwFreeVMap( lwVMap *vmap ); lwVMap *lwGetVMap( picoMemStream_t *fp, int cksize, int ptoffset, int poloffset, int perpoly ); int lwGetPointVMaps( lwPointList *point, lwVMap *vmap ); int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap ); /* clip.c */ void lwFreeClip( lwClip *clip ); lwClip *lwGetClip( picoMemStream_t *fp, int cksize ); lwClip *lwFindClip( lwClip *list, int index ); /* envelope.c */ void lwFreeEnvelope( lwEnvelope *env ); lwEnvelope *lwGetEnvelope( picoMemStream_t *fp, int cksize ); lwEnvelope *lwFindEnvelope( lwEnvelope *list, int index ); float lwEvalEnvelope( lwEnvelope *env, float time ); /* surface.c */ void lwFreePlugin( lwPlugin *p ); void lwFreeTexture( lwTexture *t ); void lwFreeSurface( lwSurface *surf ); int lwGetTHeader( picoMemStream_t *fp, int hsz, lwTexture *tex ); int lwGetTMap( picoMemStream_t *fp, int tmapsz, lwTMap *tmap ); int lwGetImageMap( picoMemStream_t *fp, int rsz, lwTexture *tex ); int lwGetProcedural( picoMemStream_t *fp, int rsz, lwTexture *tex ); int lwGetGradient( picoMemStream_t *fp, int rsz, lwTexture *tex ); lwTexture *lwGetTexture( picoMemStream_t *fp, int bloksz, unsigned int type ); lwPlugin *lwGetShader( picoMemStream_t *fp, int bloksz ); lwSurface *lwGetSurface( picoMemStream_t *fp, int cksize ); lwSurface *lwDefaultSurface( void ); /* lwob.c */ lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj ); int lwGetPolygons5( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset ); lwObject *lwGetObject5( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos ); int lwValidateObject5( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos ); /* list.c */ void lwListFree( void *list, void ( *freeNode )( void * )); void lwListAdd( void **list, void *node ); void lwListInsert( void **vlist, void *vitem, int ( *compare )( void *, void * )); /* vecmath.c */ float dot( float a[], float b[] ); void cross( float a[], float b[], float c[] ); void normalize( float v[] ); #define vecangle( a, b ) ( float ) acos( dot( a, b )) /* lwio.c */ void set_flen( int i ); int get_flen( void ); void *getbytes( picoMemStream_t *fp, int size ); void skipbytes( picoMemStream_t *fp, int n ); int getI1( picoMemStream_t *fp ); short getI2( picoMemStream_t *fp ); int getI4( picoMemStream_t *fp ); unsigned char getU1( picoMemStream_t *fp ); unsigned short getU2( picoMemStream_t *fp ); unsigned int getU4( picoMemStream_t *fp ); int getVX( picoMemStream_t *fp ); float getF4( picoMemStream_t *fp ); char *getS0( picoMemStream_t *fp ); int sgetI1( unsigned char **bp ); short sgetI2( unsigned char **bp ); int sgetI4( unsigned char **bp ); unsigned char sgetU1( unsigned char **bp ); unsigned short sgetU2( unsigned char **bp ); unsigned int sgetU4( unsigned char **bp ); int sgetVX( unsigned char **bp ); float sgetF4( unsigned char **bp ); char *sgetS0( unsigned char **bp ); #ifndef __BIG_ENDIAN__ void revbytes( void *bp, int elsize, int elcount ); #else #define revbytes( b, s, c ) #endif #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/lwob.c���������������������������������������������������������0000664�0000000�0000000�00000044362�12454246557�0020542�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ====================================================================== lwob.c Functions for an LWOB reader. LWOB is the LightWave object format for versions of LW prior to 6.0. Ernie Wright 17 Sep 00 ====================================================================== */ #include "../picointernal.h" #include "lwo2.h" /* disable warnings */ #ifdef WIN32 #pragma warning( disable:4018 ) /* signed/unsigned mismatch */ #endif /* IDs specific to LWOB */ #define ID_SRFS LWID_('S','R','F','S') #define ID_FLAG LWID_('F','L','A','G') #define ID_VLUM LWID_('V','L','U','M') #define ID_VDIF LWID_('V','D','I','F') #define ID_VSPC LWID_('V','S','P','C') #define ID_RFLT LWID_('R','F','L','T') #define ID_BTEX LWID_('B','T','E','X') #define ID_CTEX LWID_('C','T','E','X') #define ID_DTEX LWID_('D','T','E','X') #define ID_LTEX LWID_('L','T','E','X') #define ID_RTEX LWID_('R','T','E','X') #define ID_STEX LWID_('S','T','E','X') #define ID_TTEX LWID_('T','T','E','X') #define ID_TFLG LWID_('T','F','L','G') #define ID_TSIZ LWID_('T','S','I','Z') #define ID_TCTR LWID_('T','C','T','R') #define ID_TFAL LWID_('T','F','A','L') #define ID_TVEL LWID_('T','V','E','L') #define ID_TCLR LWID_('T','C','L','R') #define ID_TVAL LWID_('T','V','A','L') #define ID_TAMP LWID_('T','A','M','P') #define ID_TIMG LWID_('T','I','M','G') #define ID_TAAS LWID_('T','A','A','S') #define ID_TREF LWID_('T','R','E','F') #define ID_TOPC LWID_('T','O','P','C') #define ID_SDAT LWID_('S','D','A','T') #define ID_TFP0 LWID_('T','F','P','0') #define ID_TFP1 LWID_('T','F','P','1') /* ====================================================================== add_clip() Add a clip to the clip list. Used to store the contents of an RIMG or TIMG surface subchunk. ====================================================================== */ static int add_clip( char *s, lwClip **clist, int *nclips ) { lwClip *clip; char *p; clip = _pico_calloc( 1, sizeof( lwClip )); if ( !clip ) return 0; clip->contrast.val = 1.0f; clip->brightness.val = 1.0f; clip->saturation.val = 1.0f; clip->gamma.val = 1.0f; if ( (p = strstr( s, "(sequence)" ))) { p[ -1 ] = 0; clip->type = ID_ISEQ; clip->source.seq.prefix = s; clip->source.seq.digits = 3; } else { clip->type = ID_STIL; clip->source.still.name = s; } (*nclips)++; clip->index = *nclips; lwListAdd( (void *) clist, clip ); return clip->index; } /* ====================================================================== add_tvel() Add a triple of envelopes to simulate the old texture velocity parameters. ====================================================================== */ static int add_tvel( float pos[], float vel[], lwEnvelope **elist, int *nenvs ) { lwEnvelope *env; lwKey *key0, *key1; int i; for ( i = 0; i < 3; i++ ) { env = _pico_calloc( 1, sizeof( lwEnvelope )); key0 = _pico_calloc( 1, sizeof( lwKey )); key1 = _pico_calloc( 1, sizeof( lwKey )); if ( !env || !key0 || !key1 ) return 0; key0->next = key1; key0->value = pos[ i ]; key0->time = 0.0f; key1->prev = key0; key1->value = pos[ i ] + vel[ i ] * 30.0f; key1->time = 1.0f; key0->shape = key1->shape = ID_LINE; env->index = *nenvs + i + 1; env->type = 0x0301 + i; env->name = _pico_alloc( 11 ); if ( env->name ) { strcpy( env->name, "Position.X" ); env->name[ 9 ] += i; } env->key = key0; env->nkeys = 2; env->behavior[ 0 ] = BEH_LINEAR; env->behavior[ 1 ] = BEH_LINEAR; lwListAdd( (void *) elist, env ); } *nenvs += 3; return env->index - 2; } /* ====================================================================== get_texture() Create a new texture for BTEX, CTEX, etc. subchunks. ====================================================================== */ static lwTexture *get_texture( char *s ) { lwTexture *tex; tex = _pico_calloc( 1, sizeof( lwTexture )); if ( !tex ) return NULL; tex->tmap.size.val[ 0 ] = tex->tmap.size.val[ 1 ] = tex->tmap.size.val[ 2 ] = 1.0f; tex->opacity.val = 1.0f; tex->enabled = 1; if ( strstr( s, "Image Map" )) { tex->type = ID_IMAP; if ( strstr( s, "Planar" )) tex->param.imap.projection = 0; else if ( strstr( s, "Cylindrical" )) tex->param.imap.projection = 1; else if ( strstr( s, "Spherical" )) tex->param.imap.projection = 2; else if ( strstr( s, "Cubic" )) tex->param.imap.projection = 3; else if ( strstr( s, "Front" )) tex->param.imap.projection = 4; tex->param.imap.aa_strength = 1.0f; tex->param.imap.amplitude.val = 1.0f; _pico_free( s ); } else { tex->type = ID_PROC; tex->param.proc.name = s; } return tex; } /* ====================================================================== lwGetSurface5() Read an lwSurface from an LWOB file. ====================================================================== */ lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj ) { lwSurface *surf; lwTexture *tex; lwPlugin *shdr; char *s; float v[ 3 ]; unsigned int id, flags; unsigned short sz; int pos, rlen, i; tex = NULL; shdr = NULL; /* allocate the Surface structure */ surf = _pico_calloc( 1, sizeof( lwSurface )); if ( !surf ) goto Fail; /* non-zero defaults */ surf->color.rgb[ 0 ] = 0.78431f; surf->color.rgb[ 1 ] = 0.78431f; surf->color.rgb[ 2 ] = 0.78431f; surf->diffuse.val = 1.0f; surf->glossiness.val = 0.4f; surf->bump.val = 1.0f; surf->eta.val = 1.0f; surf->sideflags = 1; /* remember where we started */ set_flen( 0 ); pos = _pico_memstream_tell( fp ); /* name */ surf->name = getS0( fp ); /* first subchunk header */ id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) goto Fail; /* process subchunks as they're encountered */ while ( 1 ) { sz += sz & 1; set_flen( 0 ); switch ( id ) { case ID_COLR: surf->color.rgb[ 0 ] = getU1( fp ) / 255.0f; surf->color.rgb[ 1 ] = getU1( fp ) / 255.0f; surf->color.rgb[ 2 ] = getU1( fp ) / 255.0f; break; case ID_FLAG: flags = getU2( fp ); if ( flags & 4 ) surf->smooth = 1.56207f; if ( flags & 8 ) surf->color_hilite.val = 1.0f; if ( flags & 16 ) surf->color_filter.val = 1.0f; if ( flags & 128 ) surf->dif_sharp.val = 0.5f; if ( flags & 256 ) surf->sideflags = 3; if ( flags & 512 ) surf->add_trans.val = 1.0f; break; case ID_LUMI: surf->luminosity.val = getI2( fp ) / 256.0f; break; case ID_VLUM: surf->luminosity.val = getF4( fp ); break; case ID_DIFF: surf->diffuse.val = getI2( fp ) / 256.0f; break; case ID_VDIF: surf->diffuse.val = getF4( fp ); break; case ID_SPEC: surf->specularity.val = getI2( fp ) / 256.0f; break; case ID_VSPC: surf->specularity.val = getF4( fp ); break; case ID_GLOS: surf->glossiness.val = ( float ) log( getU2( fp )) / 20.7944f; break; case ID_SMAN: surf->smooth = getF4( fp ); break; case ID_REFL: surf->reflection.val.val = getI2( fp ) / 256.0f; break; case ID_RFLT: surf->reflection.options = getU2( fp ); break; case ID_RIMG: s = getS0( fp ); surf->reflection.cindex = add_clip( s, &obj->clip, &obj->nclips ); surf->reflection.options = 3; break; case ID_RSAN: surf->reflection.seam_angle = getF4( fp ); break; case ID_TRAN: surf->transparency.val.val = getI2( fp ) / 256.0f; break; case ID_RIND: surf->eta.val = getF4( fp ); break; case ID_BTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->bump.tex, tex ); break; case ID_CTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->color.tex, tex ); break; case ID_DTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->diffuse.tex, tex ); break; case ID_LTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->luminosity.tex, tex ); break; case ID_RTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->reflection.val.tex, tex ); break; case ID_STEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->specularity.tex, tex ); break; case ID_TTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->transparency.val.tex, tex ); break; case ID_TFLG: flags = getU2( fp ); i = 0; // greebo: initialise to fix compiler warnings if ( flags & 1 ) i = 0; if ( flags & 2 ) i = 1; if ( flags & 4 ) i = 2; tex->axis = i; if ( tex->type == ID_IMAP ) tex->param.imap.axis = i; else tex->param.proc.axis = i; if ( flags & 8 ) tex->tmap.coord_sys = 1; if ( flags & 16 ) tex->negative = 1; if ( flags & 32 ) tex->param.imap.pblend = 1; if ( flags & 64 ) { tex->param.imap.aa_strength = 1.0f; tex->param.imap.aas_flags = 1; } break; case ID_TSIZ: for ( i = 0; i < 3; i++ ) tex->tmap.size.val[ i ] = getF4( fp ); break; case ID_TCTR: for ( i = 0; i < 3; i++ ) tex->tmap.center.val[ i ] = getF4( fp ); break; case ID_TFAL: for ( i = 0; i < 3; i++ ) tex->tmap.falloff.val[ i ] = getF4( fp ); break; case ID_TVEL: for ( i = 0; i < 3; i++ ) v[ i ] = getF4( fp ); tex->tmap.center.eindex = add_tvel( tex->tmap.center.val, v, &obj->env, &obj->nenvs ); break; case ID_TCLR: if ( tex->type == ID_PROC ) for ( i = 0; i < 3; i++ ) tex->param.proc.value[ i ] = getU1( fp ) / 255.0f; break; case ID_TVAL: tex->param.proc.value[ 0 ] = getI2( fp ) / 256.0f; break; case ID_TAMP: if ( tex->type == ID_IMAP ) tex->param.imap.amplitude.val = getF4( fp ); break; case ID_TIMG: s = getS0( fp ); tex->param.imap.cindex = add_clip( s, &obj->clip, &obj->nclips ); break; case ID_TAAS: tex->param.imap.aa_strength = getF4( fp ); tex->param.imap.aas_flags = 1; break; case ID_TREF: tex->tmap.ref_object = getbytes( fp, sz ); break; case ID_TOPC: tex->opacity.val = getF4( fp ); break; case ID_TFP0: if ( tex->type == ID_IMAP ) tex->param.imap.wrapw.val = getF4( fp ); break; case ID_TFP1: if ( tex->type == ID_IMAP ) tex->param.imap.wraph.val = getF4( fp ); break; case ID_SHDR: shdr = _pico_calloc( 1, sizeof( lwPlugin )); if ( !shdr ) goto Fail; shdr->name = getbytes( fp, sz ); lwListAdd( (void *) &surf->shader, shdr ); surf->nshaders++; break; case ID_SDAT: shdr->data = getbytes( fp, sz ); break; default: break; } /* error while reading current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) goto Fail; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the SURF chunk? */ if ( cksize <= _pico_memstream_tell( fp ) - pos ) break; /* get the next subchunk header */ set_flen( 0 ); id = getU4( fp ); sz = getU2( fp ); if ( 6 != get_flen() ) goto Fail; } return surf; Fail: if ( surf ) lwFreeSurface( surf ); return NULL; } /* ====================================================================== lwGetPolygons5() Read polygon records from a POLS chunk in an LWOB file. The polygons are added to the array in the lwPolygonList. ====================================================================== */ int lwGetPolygons5( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset ) { lwPolygon *pp; lwPolVert *pv; unsigned char *buf, *bp; int i, j, nv, nverts, npols; if ( cksize == 0 ) return 1; /* read the whole chunk */ set_flen( 0 ); buf = getbytes( fp, cksize ); if ( !buf ) goto Fail; /* count the polygons and vertices */ nverts = 0; npols = 0; bp = buf; while ( bp < buf + cksize ) { nv = sgetU2( &bp ); nverts += nv; npols++; bp += 2 * nv; i = sgetI2( &bp ); if ( i < 0 ) bp += 2; /* detail polygons */ } if ( !lwAllocPolygons( plist, npols, nverts )) goto Fail; /* fill in the new polygons */ bp = buf; pp = plist->pol + plist->offset; pv = plist->pol[ 0 ].v + plist->voffset; for ( i = 0; i < npols; i++ ) { nv = sgetU2( &bp ); pp->nverts = nv; pp->type = ID_FACE; if ( !pp->v ) pp->v = pv; for ( j = 0; j < nv; j++ ) pv[ j ].index = sgetU2( &bp ) + ptoffset; j = sgetI2( &bp ); if ( j < 0 ) { j = -j; bp += 2; } j -= 1; pp->surf = ( lwSurface * ) j; pp++; pv += nv; } _pico_free( buf ); return 1; Fail: if ( buf ) _pico_free( buf ); lwFreePolygons( plist ); return 0; } /* ====================================================================== getLWObject5() Returns the contents of an LWOB, given its filename, or NULL if the file couldn't be loaded. On failure, failID and failpos can be used to diagnose the cause. 1. If the file isn't an LWOB, failpos will contain 12 and failID will be unchanged. 2. If an error occurs while reading an LWOB, failID will contain the most recently read IFF chunk ID, and failpos will contain the value returned by _pico_memstream_tell() at the time of the failure. 3. If the file couldn't be opened, or an error occurs while reading the first 12 bytes, both failID and failpos will be unchanged. If you don't need this information, failID and failpos can be NULL. ====================================================================== */ lwObject *lwGetObject5( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos ) { lwObject *object; lwLayer *layer; lwNode *node; unsigned int id, formsize, type, cksize; /* open the file */ if ( !fp ) return NULL; /* read the first 12 bytes */ set_flen( 0 ); id = getU4( fp ); formsize = getU4( fp ); type = getU4( fp ); if ( 12 != get_flen() ) { return NULL; } /* LWOB? */ if ( id != ID_FORM || type != ID_LWOB ) { if ( failpos ) *failpos = 12; return NULL; } /* allocate an object and a default layer */ object = _pico_calloc( 1, sizeof( lwObject )); if ( !object ) goto Fail; layer = _pico_calloc( 1, sizeof( lwLayer )); if ( !layer ) goto Fail; object->layer = layer; object->nlayers = 1; /* get the first chunk header */ id = getU4( fp ); cksize = getU4( fp ); if ( 0 > get_flen() ) goto Fail; /* process chunks as they're encountered */ while ( 1 ) { cksize += cksize & 1; switch ( id ) { case ID_PNTS: if ( !lwGetPoints( fp, cksize, &layer->point )) goto Fail; break; case ID_POLS: if ( !lwGetPolygons5( fp, cksize, &layer->polygon, layer->point.offset )) goto Fail; break; case ID_SRFS: if ( !lwGetTags( fp, cksize, &object->taglist )) goto Fail; break; case ID_SURF: node = ( lwNode * ) lwGetSurface5( fp, cksize, object ); if ( !node ) goto Fail; lwListAdd( (void *) &object->surf, node ); object->nsurfs++; break; default: _pico_memstream_seek( fp, cksize, PICO_SEEK_CUR ); break; } /* end of the file? */ if ( formsize <= _pico_memstream_tell( fp ) - 8 ) break; /* get the next chunk header */ set_flen( 0 ); id = getU4( fp ); cksize = getU4( fp ); if ( 8 != get_flen() ) goto Fail; } lwGetBoundingBox( &layer->point, layer->bbox ); lwGetPolyNormals( &layer->point, &layer->polygon ); if ( !lwGetPointPolygons( &layer->point, &layer->polygon )) goto Fail; if ( !lwResolvePolySurfaces( &layer->polygon, &object->taglist, &object->surf, &object->nsurfs )) goto Fail; lwGetVertNormals( &layer->point, &layer->polygon ); return object; Fail: if ( failID ) *failID = id; if ( fp ) { if ( failpos ) *failpos = _pico_memstream_tell( fp ); } lwFreeObject( object ); return NULL; } int lwValidateObject5( char *filename, picoMemStream_t *fp, unsigned int *failID, int *failpos ) { unsigned int id, formsize, type; /* open the file */ if ( !fp ) return PICO_PMV_ERROR_MEMORY; /* read the first 12 bytes */ set_flen( 0 ); id = getU4( fp ); formsize = getU4( fp ); type = getU4( fp ); if ( 12 != get_flen() ) { return PICO_PMV_ERROR_SIZE; } /* LWOB? */ if ( id != ID_FORM || type != ID_LWOB ) { if ( failpos ) *failpos = 12; return PICO_PMV_ERROR_IDENT; } return PICO_PMV_OK; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/pntspols.c�����������������������������������������������������0000664�0000000�0000000�00000034340�12454246557�0021454�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ====================================================================== pntspols.c Point and polygon functions for an LWO2 reader. Ernie Wright 17 Sep 00 ====================================================================== */ #include "../picointernal.h" #include "lwo2.h" /* ====================================================================== lwFreePoints() Free the memory used by an lwPointList. ====================================================================== */ void lwFreePoints( lwPointList *point ) { int i; if ( point ) { if ( point->pt ) { for ( i = 0; i < point->count; i++ ) { if ( point->pt[ i ].pol ) _pico_free( point->pt[ i ].pol ); if ( point->pt[ i ].vm ) _pico_free( point->pt[ i ].vm ); } _pico_free( point->pt ); } memset( point, 0, sizeof( lwPointList )); } } /* ====================================================================== lwFreePolygons() Free the memory used by an lwPolygonList. ====================================================================== */ void lwFreePolygons( lwPolygonList *plist ) { int i, j; if ( plist ) { if ( plist->pol ) { for ( i = 0; i < plist->count; i++ ) { if ( plist->pol[ i ].v ) { for ( j = 0; j < plist->pol[ i ].nverts; j++ ) if ( plist->pol[ i ].v[ j ].vm ) _pico_free( plist->pol[ i ].v[ j ].vm ); } } if ( plist->pol[ 0 ].v ) _pico_free( plist->pol[ 0 ].v ); _pico_free( plist->pol ); } memset( plist, 0, sizeof( lwPolygonList )); } } /* ====================================================================== lwGetPoints() Read point records from a PNTS chunk in an LWO2 file. The points are added to the array in the lwPointList. ====================================================================== */ int lwGetPoints( picoMemStream_t *fp, int cksize, lwPointList *point ) { float *f; int np, i, j; if ( cksize == 1 ) return 1; /* extend the point array to hold the new points */ np = cksize / 12; point->offset = point->count; point->count += np; if ( !_pico_realloc( (void *) &point->pt, (point->count - np) * sizeof( lwPoint ), point->count * sizeof( lwPoint )) ) return 0; memset( &point->pt[ point->offset ], 0, np * sizeof( lwPoint )); /* read the whole chunk */ f = ( float * ) getbytes( fp, cksize ); if ( !f ) return 0; revbytes( f, 4, np * 3 ); /* assign position values */ for ( i = 0, j = 0; i < np; i++, j += 3 ) { point->pt[ i ].pos[ 0 ] = f[ j ]; point->pt[ i ].pos[ 1 ] = f[ j + 1 ]; point->pt[ i ].pos[ 2 ] = f[ j + 2 ]; } _pico_free( f ); return 1; } /* ====================================================================== lwGetBoundingBox() Calculate the bounding box for a point list, but only if the bounding box hasn't already been initialized. ====================================================================== */ void lwGetBoundingBox( lwPointList *point, float bbox[] ) { int i, j; if ( point->count == 0 ) return; for ( i = 0; i < 6; i++ ) if ( bbox[ i ] != 0.0f ) return; bbox[ 0 ] = bbox[ 1 ] = bbox[ 2 ] = 1e20f; bbox[ 3 ] = bbox[ 4 ] = bbox[ 5 ] = -1e20f; for ( i = 0; i < point->count; i++ ) { for ( j = 0; j < 3; j++ ) { if ( bbox[ j ] > point->pt[ i ].pos[ j ] ) bbox[ j ] = point->pt[ i ].pos[ j ]; if ( bbox[ j + 3 ] < point->pt[ i ].pos[ j ] ) bbox[ j + 3 ] = point->pt[ i ].pos[ j ]; } } } /* ====================================================================== lwAllocPolygons() Allocate or extend the polygon arrays to hold new records. ====================================================================== */ int lwAllocPolygons( lwPolygonList *plist, int npols, int nverts ) { int i; plist->offset = plist->count; plist->count += npols; if ( !_pico_realloc( (void *) &plist->pol, (plist->count - npols) * sizeof( lwPolygon ), plist->count * sizeof( lwPolygon )) ) return 0; memset( plist->pol + plist->offset, 0, npols * sizeof( lwPolygon )); plist->voffset = plist->vcount; plist->vcount += nverts; if ( !_pico_realloc( (void *) &plist->pol[ 0 ].v, (plist->vcount - nverts) * sizeof( lwPolVert ), plist->vcount * sizeof( lwPolVert )) ) return 0; memset( plist->pol[ 0 ].v + plist->voffset, 0, nverts * sizeof( lwPolVert )); /* fix up the old vertex pointers */ for ( i = 1; i < plist->offset; i++ ) plist->pol[ i ].v = plist->pol[ i - 1 ].v + plist->pol[ i - 1 ].nverts; return 1; } /* ====================================================================== lwGetPolygons() Read polygon records from a POLS chunk in an LWO2 file. The polygons are added to the array in the lwPolygonList. ====================================================================== */ int lwGetPolygons( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset ) { lwPolygon *pp; lwPolVert *pv; unsigned char *buf, *bp; int i, j, flags, nv, nverts, npols; unsigned int type; if ( cksize == 0 ) return 1; /* read the whole chunk */ set_flen( 0 ); type = getU4( fp ); buf = getbytes( fp, cksize - 4 ); if ( cksize != get_flen() ) goto Fail; /* count the polygons and vertices */ nverts = 0; npols = 0; bp = buf; while ( bp < buf + cksize - 4 ) { nv = sgetU2( &bp ); nv &= 0x03FF; nverts += nv; npols++; for ( i = 0; i < nv; i++ ) j = sgetVX( &bp ); } if ( !lwAllocPolygons( plist, npols, nverts )) goto Fail; /* fill in the new polygons */ bp = buf; pp = plist->pol + plist->offset; pv = plist->pol[ 0 ].v + plist->voffset; for ( i = 0; i < npols; i++ ) { nv = sgetU2( &bp ); flags = nv & 0xFC00; nv &= 0x03FF; pp->nverts = nv; pp->flags = flags; pp->type = type; if ( !pp->v ) pp->v = pv; for ( j = 0; j < nv; j++ ) pp->v[ j ].index = sgetVX( &bp ) + ptoffset; pp++; pv += nv; } _pico_free( buf ); return 1; Fail: if ( buf ) _pico_free( buf ); lwFreePolygons( plist ); return 0; } /* ====================================================================== lwGetPolyNormals() Calculate the polygon normals. By convention, LW's polygon normals are found as the cross product of the first and last edges. It's undefined for one- and two-point polygons. ====================================================================== */ void lwGetPolyNormals( lwPointList *point, lwPolygonList *polygon ) { int i, j; float p1[ 3 ], p2[ 3 ], pn[ 3 ], v1[ 3 ], v2[ 3 ]; for ( i = 0; i < polygon->count; i++ ) { if ( polygon->pol[ i ].nverts < 3 ) continue; for ( j = 0; j < 3; j++ ) { p1[ j ] = point->pt[ polygon->pol[ i ].v[ 0 ].index ].pos[ j ]; p2[ j ] = point->pt[ polygon->pol[ i ].v[ 1 ].index ].pos[ j ]; pn[ j ] = point->pt[ polygon->pol[ i ].v[ polygon->pol[ i ].nverts - 1 ].index ].pos[ j ]; } for ( j = 0; j < 3; j++ ) { v1[ j ] = p2[ j ] - p1[ j ]; v2[ j ] = pn[ j ] - p1[ j ]; } cross( v1, v2, polygon->pol[ i ].norm ); normalize( polygon->pol[ i ].norm ); } } /* ====================================================================== lwGetPointPolygons() For each point, fill in the indexes of the polygons that share the point. Returns 0 if any of the memory allocations fail, otherwise returns 1. ====================================================================== */ int lwGetPointPolygons( lwPointList *point, lwPolygonList *polygon ) { int i, j, k; /* count the number of polygons per point */ for ( i = 0; i < polygon->count; i++ ) for ( j = 0; j < polygon->pol[ i ].nverts; j++ ) ++point->pt[ polygon->pol[ i ].v[ j ].index ].npols; /* alloc per-point polygon arrays */ for ( i = 0; i < point->count; i++ ) { if ( point->pt[ i ].npols == 0 ) continue; point->pt[ i ].pol = _pico_calloc( point->pt[ i ].npols, sizeof( int )); if ( !point->pt[ i ].pol ) return 0; point->pt[ i ].npols = 0; } /* fill in polygon array for each point */ for ( i = 0; i < polygon->count; i++ ) { for ( j = 0; j < polygon->pol[ i ].nverts; j++ ) { k = polygon->pol[ i ].v[ j ].index; point->pt[ k ].pol[ point->pt[ k ].npols ] = i; ++point->pt[ k ].npols; } } return 1; } /* ====================================================================== lwResolvePolySurfaces() Convert tag indexes into actual lwSurface pointers. If any polygons point to tags for which no corresponding surface can be found, a default surface is created. ====================================================================== */ int lwResolvePolySurfaces( lwPolygonList *polygon, lwTagList *tlist, lwSurface **surf, int *nsurfs ) { lwSurface **s, *st; int i, index; if ( tlist->count == 0 ) return 1; s = _pico_calloc( tlist->count, sizeof( lwSurface * )); if ( !s ) return 0; for ( i = 0; i < tlist->count; i++ ) { st = *surf; while ( st ) { if ( !strcmp( st->name, tlist->tag[ i ] )) { s[ i ] = st; break; } st = st->next; } } for ( i = 0; i < polygon->count; i++ ) { index = ( int ) polygon->pol[ i ].surf; if ( index < 0 || index > tlist->count ) return 0; if ( !s[ index ] ) { s[ index ] = lwDefaultSurface(); if ( !s[ index ] ) return 0; s[ index ]->name = _pico_alloc( strlen( tlist->tag[ index ] ) + 1 ); if ( !s[ index ]->name ) return 0; strcpy( s[ index ]->name, tlist->tag[ index ] ); lwListAdd( (void *) surf, s[ index ] ); *nsurfs = *nsurfs + 1; } polygon->pol[ i ].surf = s[ index ]; } _pico_free( s ); return 1; } /* ====================================================================== lwGetVertNormals() Calculate the vertex normals. For each polygon vertex, sum the normals of the polygons that share the point. If the normals of the current and adjacent polygons form an angle greater than the max smoothing angle for the current polygon's surface, the normal of the adjacent polygon is excluded from the sum. It's also excluded if the polygons aren't in the same smoothing group. Assumes that lwGetPointPolygons(), lwGetPolyNormals() and lwResolvePolySurfaces() have already been called. ====================================================================== */ void lwGetVertNormals( lwPointList *point, lwPolygonList *polygon ) { int j, k, n, g, h, p; float a; for ( j = 0; j < polygon->count; j++ ) { for ( n = 0; n < polygon->pol[ j ].nverts; n++ ) { for ( k = 0; k < 3; k++ ) polygon->pol[ j ].v[ n ].norm[ k ] = polygon->pol[ j ].norm[ k ]; if ( polygon->pol[ j ].surf->smooth <= 0 ) continue; p = polygon->pol[ j ].v[ n ].index; for ( g = 0; g < point->pt[ p ].npols; g++ ) { h = point->pt[ p ].pol[ g ]; if ( h == j ) continue; if ( polygon->pol[ j ].smoothgrp != polygon->pol[ h ].smoothgrp ) continue; a = vecangle( polygon->pol[ j ].norm, polygon->pol[ h ].norm ); if ( a > polygon->pol[ j ].surf->smooth ) continue; for ( k = 0; k < 3; k++ ) polygon->pol[ j ].v[ n ].norm[ k ] += polygon->pol[ h ].norm[ k ]; } normalize( polygon->pol[ j ].v[ n ].norm ); } } } /* ====================================================================== lwFreeTags() Free memory used by an lwTagList. ====================================================================== */ void lwFreeTags( lwTagList *tlist ) { int i; if ( tlist ) { if ( tlist->tag ) { for ( i = 0; i < tlist->count; i++ ) if ( tlist->tag[ i ] ) _pico_free( tlist->tag[ i ] ); _pico_free( tlist->tag ); } memset( tlist, 0, sizeof( lwTagList )); } } /* ====================================================================== lwGetTags() Read tag strings from a TAGS chunk in an LWO2 file. The tags are added to the lwTagList array. ====================================================================== */ int lwGetTags( picoMemStream_t *fp, int cksize, lwTagList *tlist ) { char *buf, *bp; int i, len, ntags; if ( cksize == 0 ) return 1; /* read the whole chunk */ set_flen( 0 ); buf = getbytes( fp, cksize ); if ( !buf ) return 0; /* count the strings */ ntags = 0; bp = buf; while ( bp < buf + cksize ) { len = strlen( bp ) + 1; len += len & 1; bp += len; ++ntags; } /* expand the string array to hold the new tags */ tlist->offset = tlist->count; tlist->count += ntags; if ( !_pico_realloc( (void *) &tlist->tag, (tlist->count - ntags) * sizeof( char * ), tlist->count * sizeof( char * )) ) goto Fail; memset( &tlist->tag[ tlist->offset ], 0, ntags * sizeof( char * )); /* copy the new tags to the tag array */ bp = buf; for ( i = 0; i < ntags; i++ ) tlist->tag[ i + tlist->offset ] = sgetS0( (unsigned char **) &bp ); _pico_free( buf ); return 1; Fail: if ( buf ) _pico_free( buf ); return 0; } /* ====================================================================== lwGetPolygonTags() Read polygon tags from a PTAG chunk in an LWO2 file. ====================================================================== */ int lwGetPolygonTags( picoMemStream_t *fp, int cksize, lwTagList *tlist, lwPolygonList *plist ) { unsigned int type; int rlen = 0, i, j; set_flen( 0 ); type = getU4( fp ); rlen = get_flen(); if ( rlen < 0 ) return 0; if ( type != ID_SURF && type != ID_PART && type != ID_SMGP ) { _pico_memstream_seek( fp, cksize - 4, PICO_SEEK_CUR ); return 1; } while ( rlen < cksize ) { i = getVX( fp ) + plist->offset; j = getVX( fp ) + tlist->offset; rlen = get_flen(); if ( rlen < 0 || rlen > cksize ) return 0; switch ( type ) { case ID_SURF: plist->pol[ i ].surf = ( lwSurface * ) j; break; case ID_PART: plist->pol[ i ].part = j; break; case ID_SMGP: plist->pol[ i ].smoothgrp = j; break; } } return 1; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/surface.c������������������������������������������������������0000664�0000000�0000000�00000062020�12454246557�0021216�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ====================================================================== surface.c Surface functions for an LWO2 reader. Ernie Wright 17 Sep 00 ====================================================================== */ #include "../picointernal.h" #include "lwo2.h" /* ====================================================================== lwFreePlugin() Free the memory used by an lwPlugin. ====================================================================== */ void lwFreePlugin( lwPlugin *p ) { if ( p ) { if ( p->ord ) _pico_free( p->ord ); if ( p->name ) _pico_free( p->name ); if ( p->data ) _pico_free( p->data ); _pico_free( p ); } } /* ====================================================================== lwFreeTexture() Free the memory used by an lwTexture. ====================================================================== */ void lwFreeTexture( lwTexture *t ) { if ( t ) { if ( t->ord ) _pico_free( t->ord ); switch ( t->type ) { case ID_IMAP: if ( t->param.imap.vmap_name ) _pico_free( t->param.imap.vmap_name ); if ( t->tmap.ref_object ) _pico_free( t->tmap.ref_object ); break; case ID_PROC: if ( t->param.proc.name ) _pico_free( t->param.proc.name ); if ( t->param.proc.data ) _pico_free( t->param.proc.data ); break; case ID_GRAD: if ( t->param.grad.key ) _pico_free( t->param.grad.key ); if ( t->param.grad.ikey ) _pico_free( t->param.grad.ikey ); break; } _pico_free( t ); } } /* ====================================================================== lwFreeSurface() Free the memory used by an lwSurface. ====================================================================== */ void lwFreeSurface( lwSurface *surf ) { if ( surf ) { if ( surf->name ) _pico_free( surf->name ); if ( surf->srcname ) _pico_free( surf->srcname ); lwListFree( surf->shader, (void *) lwFreePlugin ); lwListFree( surf->color.tex, (void *) lwFreeTexture ); lwListFree( surf->luminosity.tex, (void *) lwFreeTexture ); lwListFree( surf->diffuse.tex, (void *) lwFreeTexture ); lwListFree( surf->specularity.tex, (void *) lwFreeTexture ); lwListFree( surf->glossiness.tex, (void *) lwFreeTexture ); lwListFree( surf->reflection.val.tex, (void *) lwFreeTexture ); lwListFree( surf->transparency.val.tex, (void *) lwFreeTexture ); lwListFree( surf->eta.tex, (void *) lwFreeTexture ); lwListFree( surf->translucency.tex, (void *) lwFreeTexture ); lwListFree( surf->bump.tex, (void *) lwFreeTexture ); _pico_free( surf ); } } /* ====================================================================== lwGetTHeader() Read a texture map header from a SURF.BLOK in an LWO2 file. This is the first subchunk in a BLOK, and its contents are common to all three texture types. ====================================================================== */ int lwGetTHeader( picoMemStream_t *fp, int hsz, lwTexture *tex ) { unsigned int id; unsigned short sz; int pos, rlen; /* remember where we started */ set_flen( 0 ); pos = _pico_memstream_tell( fp ); /* ordinal string */ tex->ord = getS0( fp ); /* first subchunk header */ id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) return 0; /* process subchunks as they're encountered */ while ( 1 ) { sz += sz & 1; set_flen( 0 ); switch ( id ) { case ID_CHAN: tex->chan = getU4( fp ); break; case ID_OPAC: tex->opac_type = getU2( fp ); tex->opacity.val = getF4( fp ); tex->opacity.eindex = getVX( fp ); break; case ID_ENAB: tex->enabled = getU2( fp ); break; case ID_NEGA: tex->negative = getU2( fp ); break; case ID_AXIS: tex->axis = getU2( fp ); break; default: break; } /* error while reading current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) return 0; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the texture header subchunk? */ if ( hsz <= _pico_memstream_tell( fp ) - pos ) break; /* get the next subchunk header */ set_flen( 0 ); id = getU4( fp ); sz = getU2( fp ); if ( 6 != get_flen() ) return 0; } set_flen( _pico_memstream_tell( fp ) - pos ); return 1; } /* ====================================================================== lwGetTMap() Read a texture map from a SURF.BLOK in an LWO2 file. The TMAP defines the mapping from texture to world or object coordinates. ====================================================================== */ int lwGetTMap( picoMemStream_t *fp, int tmapsz, lwTMap *tmap ) { unsigned int id; unsigned short sz; int rlen, pos, i; pos = _pico_memstream_tell( fp ); id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) return 0; while ( 1 ) { sz += sz & 1; set_flen( 0 ); switch ( id ) { case ID_SIZE: for ( i = 0; i < 3; i++ ) tmap->size.val[ i ] = getF4( fp ); tmap->size.eindex = getVX( fp ); break; case ID_CNTR: for ( i = 0; i < 3; i++ ) tmap->center.val[ i ] = getF4( fp ); tmap->center.eindex = getVX( fp ); break; case ID_ROTA: for ( i = 0; i < 3; i++ ) tmap->rotate.val[ i ] = getF4( fp ); tmap->rotate.eindex = getVX( fp ); break; case ID_FALL: tmap->fall_type = getU2( fp ); for ( i = 0; i < 3; i++ ) tmap->falloff.val[ i ] = getF4( fp ); tmap->falloff.eindex = getVX( fp ); break; case ID_OREF: tmap->ref_object = getS0( fp ); break; case ID_CSYS: tmap->coord_sys = getU2( fp ); break; default: break; } /* error while reading the current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) return 0; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the TMAP subchunk? */ if ( tmapsz <= _pico_memstream_tell( fp ) - pos ) break; /* get the next subchunk header */ set_flen( 0 ); id = getU4( fp ); sz = getU2( fp ); if ( 6 != get_flen() ) return 0; } set_flen( _pico_memstream_tell( fp ) - pos ); return 1; } /* ====================================================================== lwGetImageMap() Read an lwImageMap from a SURF.BLOK in an LWO2 file. ====================================================================== */ int lwGetImageMap( picoMemStream_t *fp, int rsz, lwTexture *tex ) { unsigned int id; unsigned short sz; int rlen, pos; pos = _pico_memstream_tell( fp ); id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) return 0; while ( 1 ) { sz += sz & 1; set_flen( 0 ); switch ( id ) { case ID_TMAP: if ( !lwGetTMap( fp, sz, &tex->tmap )) return 0; break; case ID_PROJ: tex->param.imap.projection = getU2( fp ); break; case ID_VMAP: tex->param.imap.vmap_name = getS0( fp ); break; case ID_AXIS: tex->param.imap.axis = getU2( fp ); break; case ID_IMAG: tex->param.imap.cindex = getVX( fp ); break; case ID_WRAP: tex->param.imap.wrapw_type = getU2( fp ); tex->param.imap.wraph_type = getU2( fp ); break; case ID_WRPW: tex->param.imap.wrapw.val = getF4( fp ); tex->param.imap.wrapw.eindex = getVX( fp ); break; case ID_WRPH: tex->param.imap.wraph.val = getF4( fp ); tex->param.imap.wraph.eindex = getVX( fp ); break; case ID_AAST: tex->param.imap.aas_flags = getU2( fp ); tex->param.imap.aa_strength = getF4( fp ); break; case ID_PIXB: tex->param.imap.pblend = getU2( fp ); break; case ID_STCK: tex->param.imap.stck.val = getF4( fp ); tex->param.imap.stck.eindex = getVX( fp ); break; case ID_TAMP: tex->param.imap.amplitude.val = getF4( fp ); tex->param.imap.amplitude.eindex = getVX( fp ); break; default: break; } /* error while reading the current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) return 0; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the image map? */ if ( rsz <= _pico_memstream_tell( fp ) - pos ) break; /* get the next subchunk header */ set_flen( 0 ); id = getU4( fp ); sz = getU2( fp ); if ( 6 != get_flen() ) return 0; } set_flen( _pico_memstream_tell( fp ) - pos ); return 1; } /* ====================================================================== lwGetProcedural() Read an lwProcedural from a SURF.BLOK in an LWO2 file. ====================================================================== */ int lwGetProcedural( picoMemStream_t *fp, int rsz, lwTexture *tex ) { unsigned int id; unsigned short sz; int rlen, pos; pos = _pico_memstream_tell( fp ); id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) return 0; while ( 1 ) { sz += sz & 1; set_flen( 0 ); switch ( id ) { case ID_TMAP: if ( !lwGetTMap( fp, sz, &tex->tmap )) return 0; break; case ID_AXIS: tex->param.proc.axis = getU2( fp ); break; case ID_VALU: tex->param.proc.value[ 0 ] = getF4( fp ); if ( sz >= 8 ) tex->param.proc.value[ 1 ] = getF4( fp ); if ( sz >= 12 ) tex->param.proc.value[ 2 ] = getF4( fp ); break; case ID_FUNC: tex->param.proc.name = getS0( fp ); rlen = get_flen(); tex->param.proc.data = getbytes( fp, sz - rlen ); break; default: break; } /* error while reading the current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) return 0; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the procedural block? */ if ( rsz <= _pico_memstream_tell( fp ) - pos ) break; /* get the next subchunk header */ set_flen( 0 ); id = getU4( fp ); sz = getU2( fp ); if ( 6 != get_flen() ) return 0; } set_flen( _pico_memstream_tell( fp ) - pos ); return 1; } /* ====================================================================== lwGetGradient() Read an lwGradient from a SURF.BLOK in an LWO2 file. ====================================================================== */ int lwGetGradient( picoMemStream_t *fp, int rsz, lwTexture *tex ) { unsigned int id; unsigned short sz; int rlen, pos, i, j, nkeys; pos = _pico_memstream_tell( fp ); id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) return 0; while ( 1 ) { sz += sz & 1; set_flen( 0 ); switch ( id ) { case ID_TMAP: if ( !lwGetTMap( fp, sz, &tex->tmap )) return 0; break; case ID_PNAM: tex->param.grad.paramname = getS0( fp ); break; case ID_INAM: tex->param.grad.itemname = getS0( fp ); break; case ID_GRST: tex->param.grad.start = getF4( fp ); break; case ID_GREN: tex->param.grad.end = getF4( fp ); break; case ID_GRPT: tex->param.grad.repeat = getU2( fp ); break; case ID_FKEY: nkeys = sz / sizeof( lwGradKey ); tex->param.grad.key = _pico_calloc( nkeys, sizeof( lwGradKey )); if ( !tex->param.grad.key ) return 0; for ( i = 0; i < nkeys; i++ ) { tex->param.grad.key[ i ].value = getF4( fp ); for ( j = 0; j < 4; j++ ) tex->param.grad.key[ i ].rgba[ j ] = getF4( fp ); } break; case ID_IKEY: nkeys = sz / 2; tex->param.grad.ikey = _pico_calloc( nkeys, sizeof( short )); if ( !tex->param.grad.ikey ) return 0; for ( i = 0; i < nkeys; i++ ) tex->param.grad.ikey[ i ] = getU2( fp ); break; default: break; } /* error while reading the current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) return 0; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the gradient? */ if ( rsz <= _pico_memstream_tell( fp ) - pos ) break; /* get the next subchunk header */ set_flen( 0 ); id = getU4( fp ); sz = getU2( fp ); if ( 6 != get_flen() ) return 0; } set_flen( _pico_memstream_tell( fp ) - pos ); return 1; } /* ====================================================================== lwGetTexture() Read an lwTexture from a SURF.BLOK in an LWO2 file. ====================================================================== */ lwTexture *lwGetTexture( picoMemStream_t *fp, int bloksz, unsigned int type ) { lwTexture *tex; unsigned short sz; int ok; tex = _pico_calloc( 1, sizeof( lwTexture )); if ( !tex ) return NULL; tex->type = type; tex->tmap.size.val[ 0 ] = tex->tmap.size.val[ 1 ] = tex->tmap.size.val[ 2 ] = 1.0f; tex->opacity.val = 1.0f; tex->enabled = 1; sz = getU2( fp ); if ( !lwGetTHeader( fp, sz, tex )) { _pico_free( tex ); return NULL; } sz = bloksz - sz - 6; switch ( type ) { case ID_IMAP: ok = lwGetImageMap( fp, sz, tex ); break; case ID_PROC: ok = lwGetProcedural( fp, sz, tex ); break; case ID_GRAD: ok = lwGetGradient( fp, sz, tex ); break; default: ok = !_pico_memstream_seek( fp, sz, PICO_SEEK_CUR ); } if ( !ok ) { lwFreeTexture( tex ); return NULL; } set_flen( bloksz ); return tex; } /* ====================================================================== lwGetShader() Read a shader record from a SURF.BLOK in an LWO2 file. ====================================================================== */ lwPlugin *lwGetShader( picoMemStream_t *fp, int bloksz ) { lwPlugin *shdr; unsigned int id; unsigned short sz; int hsz, rlen, pos; shdr = _pico_calloc( 1, sizeof( lwPlugin )); if ( !shdr ) return NULL; pos = _pico_memstream_tell( fp ); set_flen( 0 ); hsz = getU2( fp ); shdr->ord = getS0( fp ); id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) goto Fail; while ( hsz > 0 ) { sz += sz & 1; hsz -= sz; if ( id == ID_ENAB ) { shdr->flags = getU2( fp ); break; } else { _pico_memstream_seek( fp, sz, PICO_SEEK_CUR ); id = getU4( fp ); sz = getU2( fp ); } } id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) goto Fail; while ( 1 ) { sz += sz & 1; set_flen( 0 ); switch ( id ) { case ID_FUNC: shdr->name = getS0( fp ); rlen = get_flen(); shdr->data = getbytes( fp, sz - rlen ); break; default: break; } /* error while reading the current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) goto Fail; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the shader block? */ if ( bloksz <= _pico_memstream_tell( fp ) - pos ) break; /* get the next subchunk header */ set_flen( 0 ); id = getU4( fp ); sz = getU2( fp ); if ( 6 != get_flen() ) goto Fail; } set_flen( _pico_memstream_tell( fp ) - pos ); return shdr; Fail: lwFreePlugin( shdr ); return NULL; } /* ====================================================================== compare_textures() compare_shaders() Callbacks for the lwListInsert() function, which is called to add textures to surface channels and shaders to surfaces. ====================================================================== */ static int compare_textures( lwTexture *a, lwTexture *b ) { if (a->ord != NULL && b->ord != NULL) { return strcmp( a->ord, b->ord ); } else if (a->ord != NULL) { return 1; } else if (b->ord != NULL) { return -1; } else { // Both strings are NULL return 0; } } static int compare_shaders( lwPlugin *a, lwPlugin *b ) { if (a->ord != NULL && b->ord != NULL) { return strcmp( a->ord, b->ord ); } else if (a->ord != NULL) { return 1; } else if (b->ord != NULL) { return -1; } else { // Both strings are NULL return 0; } } /* ====================================================================== add_texture() Finds the surface channel (lwTParam or lwCParam) to which a texture is applied, then calls lwListInsert(). ====================================================================== */ static int add_texture( lwSurface *surf, lwTexture *tex ) { lwTexture **list; switch ( tex->chan ) { case ID_COLR: list = &surf->color.tex; break; case ID_LUMI: list = &surf->luminosity.tex; break; case ID_DIFF: list = &surf->diffuse.tex; break; case ID_SPEC: list = &surf->specularity.tex; break; case ID_GLOS: list = &surf->glossiness.tex; break; case ID_REFL: list = &surf->reflection.val.tex; break; case ID_TRAN: list = &surf->transparency.val.tex; break; case ID_RIND: list = &surf->eta.tex; break; case ID_TRNL: list = &surf->translucency.tex; break; case ID_BUMP: list = &surf->bump.tex; break; default: return 0; } lwListInsert( (void **) list, tex, ( void *) compare_textures ); return 1; } /* ====================================================================== lwDefaultSurface() Allocate and initialize a surface. ====================================================================== */ lwSurface *lwDefaultSurface( void ) { lwSurface *surf; surf = _pico_calloc( 1, sizeof( lwSurface )); if ( !surf ) return NULL; surf->color.rgb[ 0 ] = 0.78431f; surf->color.rgb[ 1 ] = 0.78431f; surf->color.rgb[ 2 ] = 0.78431f; surf->diffuse.val = 1.0f; surf->glossiness.val = 0.4f; surf->bump.val = 1.0f; surf->eta.val = 1.0f; surf->sideflags = 1; return surf; } /* ====================================================================== lwGetSurface() Read an lwSurface from an LWO2 file. ====================================================================== */ lwSurface *lwGetSurface( picoMemStream_t *fp, int cksize ) { lwSurface *surf; lwTexture *tex; lwPlugin *shdr; unsigned int id, type; unsigned short sz; int pos, rlen; /* allocate the Surface structure */ surf = _pico_calloc( 1, sizeof( lwSurface )); if ( !surf ) goto Fail; /* non-zero defaults */ surf->color.rgb[ 0 ] = 0.78431f; surf->color.rgb[ 1 ] = 0.78431f; surf->color.rgb[ 2 ] = 0.78431f; surf->diffuse.val = 1.0f; surf->glossiness.val = 0.4f; surf->bump.val = 1.0f; surf->eta.val = 1.0f; surf->sideflags = 1; /* remember where we started */ set_flen( 0 ); pos = _pico_memstream_tell( fp ); /* names */ surf->name = getS0( fp ); surf->srcname = getS0( fp ); /* first subchunk header */ id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) goto Fail; /* process subchunks as they're encountered */ while ( 1 ) { sz += sz & 1; set_flen( 0 ); switch ( id ) { case ID_COLR: surf->color.rgb[ 0 ] = getF4( fp ); surf->color.rgb[ 1 ] = getF4( fp ); surf->color.rgb[ 2 ] = getF4( fp ); surf->color.eindex = getVX( fp ); break; case ID_LUMI: surf->luminosity.val = getF4( fp ); surf->luminosity.eindex = getVX( fp ); break; case ID_DIFF: surf->diffuse.val = getF4( fp ); surf->diffuse.eindex = getVX( fp ); break; case ID_SPEC: surf->specularity.val = getF4( fp ); surf->specularity.eindex = getVX( fp ); break; case ID_GLOS: surf->glossiness.val = getF4( fp ); surf->glossiness.eindex = getVX( fp ); break; case ID_REFL: surf->reflection.val.val = getF4( fp ); surf->reflection.val.eindex = getVX( fp ); break; case ID_RFOP: surf->reflection.options = getU2( fp ); break; case ID_RIMG: surf->reflection.cindex = getVX( fp ); break; case ID_RSAN: surf->reflection.seam_angle = getF4( fp ); break; case ID_TRAN: surf->transparency.val.val = getF4( fp ); surf->transparency.val.eindex = getVX( fp ); break; case ID_TROP: surf->transparency.options = getU2( fp ); break; case ID_TIMG: surf->transparency.cindex = getVX( fp ); break; case ID_RIND: surf->eta.val = getF4( fp ); surf->eta.eindex = getVX( fp ); break; case ID_TRNL: surf->translucency.val = getF4( fp ); surf->translucency.eindex = getVX( fp ); break; case ID_BUMP: surf->bump.val = getF4( fp ); surf->bump.eindex = getVX( fp ); break; case ID_SMAN: surf->smooth = getF4( fp ); break; case ID_SIDE: surf->sideflags = getU2( fp ); break; case ID_CLRH: surf->color_hilite.val = getF4( fp ); surf->color_hilite.eindex = getVX( fp ); break; case ID_CLRF: surf->color_filter.val = getF4( fp ); surf->color_filter.eindex = getVX( fp ); break; case ID_ADTR: surf->add_trans.val = getF4( fp ); surf->add_trans.eindex = getVX( fp ); break; case ID_SHRP: surf->dif_sharp.val = getF4( fp ); surf->dif_sharp.eindex = getVX( fp ); break; case ID_GVAL: surf->glow.val = getF4( fp ); surf->glow.eindex = getVX( fp ); break; case ID_LINE: surf->line.enabled = 1; if ( sz >= 2 ) surf->line.flags = getU2( fp ); if ( sz >= 6 ) surf->line.size.val = getF4( fp ); if ( sz >= 8 ) surf->line.size.eindex = getVX( fp ); break; case ID_ALPH: surf->alpha_mode = getU2( fp ); surf->alpha = getF4( fp ); break; case ID_AVAL: surf->alpha = getF4( fp ); break; case ID_BLOK: type = getU4( fp ); switch ( type ) { case ID_IMAP: case ID_PROC: case ID_GRAD: tex = lwGetTexture( fp, sz - 4, type ); if ( !tex ) goto Fail; if ( !add_texture( surf, tex )) lwFreeTexture( tex ); set_flen( 4 + get_flen() ); break; case ID_SHDR: shdr = lwGetShader( fp, sz - 4 ); if ( !shdr ) goto Fail; lwListInsert( (void **) &surf->shader, shdr, (void *) compare_shaders ); ++surf->nshaders; set_flen( 4 + get_flen() ); break; } break; default: break; } /* error while reading current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) goto Fail; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the SURF chunk? */ if ( cksize <= _pico_memstream_tell( fp ) - pos ) break; /* get the next subchunk header */ set_flen( 0 ); id = getU4( fp ); sz = getU2( fp ); if ( 6 != get_flen() ) goto Fail; } return surf; Fail: if ( surf ) lwFreeSurface( surf ); return NULL; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/vecmath.c������������������������������������������������������0000664�0000000�0000000�00000001272�12454246557�0021217�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ====================================================================== vecmath.c Basic vector and matrix functions. Ernie Wright 17 Sep 00 ====================================================================== */ #include float dot( float a[], float b[] ) { return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ]; } void cross( float a[], float b[], float c[] ) { c[ 0 ] = a[ 1 ] * b[ 2 ] - a[ 2 ] * b[ 1 ]; c[ 1 ] = a[ 2 ] * b[ 0 ] - a[ 0 ] * b[ 2 ]; c[ 2 ] = a[ 0 ] * b[ 1 ] - a[ 1 ] * b[ 0 ]; } void normalize( float v[] ) { float r; r = ( float ) sqrt( dot( v, v )); if ( r > 0 ) { v[ 0 ] /= r; v[ 1 ] /= r; v[ 2 ] /= r; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/lwo/vmap.c���������������������������������������������������������0000664�0000000�0000000�00000013464�12454246557�0020541�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ====================================================================== vmap.c Vertex map functions for an LWO2 reader. Ernie Wright 17 Sep 00 ====================================================================== */ #include "../picointernal.h" #include "lwo2.h" /* ====================================================================== lwFreeVMap() Free memory used by an lwVMap. ====================================================================== */ void lwFreeVMap( lwVMap *vmap ) { if ( vmap ) { if ( vmap->name ) _pico_free( vmap->name ); if ( vmap->vindex ) _pico_free( vmap->vindex ); if ( vmap->pindex ) _pico_free( vmap->pindex ); if ( vmap->val ) { if ( vmap->val[ 0 ] ) _pico_free( vmap->val[ 0 ] ); _pico_free( vmap->val ); } _pico_free( vmap ); } } /* ====================================================================== lwGetVMap() Read an lwVMap from a VMAP or VMAD chunk in an LWO2. ====================================================================== */ lwVMap *lwGetVMap( picoMemStream_t *fp, int cksize, int ptoffset, int poloffset, int perpoly ) { unsigned char *buf, *bp; lwVMap *vmap; float *f; int i, j, npts, rlen; /* read the whole chunk */ set_flen( 0 ); buf = getbytes( fp, cksize ); if ( !buf ) return NULL; vmap = _pico_calloc( 1, sizeof( lwVMap )); if ( !vmap ) { _pico_free( buf ); return NULL; } /* initialize the vmap */ vmap->perpoly = perpoly; bp = buf; set_flen( 0 ); vmap->type = sgetU4( &bp ); vmap->dim = sgetU2( &bp ); vmap->name = sgetS0( &bp ); rlen = get_flen(); /* count the vmap records */ npts = 0; while ( bp < buf + cksize ) { i = sgetVX( &bp ); if ( perpoly ) i = sgetVX( &bp ); bp += vmap->dim * sizeof( float ); ++npts; } /* allocate the vmap */ vmap->nverts = npts; vmap->vindex = _pico_calloc( npts, sizeof( int )); if ( !vmap->vindex ) goto Fail; if ( perpoly ) { vmap->pindex = _pico_calloc( npts, sizeof( int )); if ( !vmap->pindex ) goto Fail; } if ( vmap->dim > 0 ) { vmap->val = _pico_calloc( npts, sizeof( float * )); if ( !vmap->val ) goto Fail; f = _pico_alloc( npts * vmap->dim * sizeof( float )); if ( !f ) goto Fail; for ( i = 0; i < npts; i++ ) vmap->val[ i ] = f + i * vmap->dim; } /* fill in the vmap values */ bp = buf + rlen; for ( i = 0; i < npts; i++ ) { vmap->vindex[ i ] = sgetVX( &bp ); if ( perpoly ) vmap->pindex[ i ] = sgetVX( &bp ); for ( j = 0; j < vmap->dim; j++ ) vmap->val[ i ][ j ] = sgetF4( &bp ); } _pico_free( buf ); return vmap; Fail: if ( buf ) _pico_free( buf ); lwFreeVMap( vmap ); return NULL; } /* ====================================================================== lwGetPointVMaps() Fill in the lwVMapPt structure for each point. ====================================================================== */ int lwGetPointVMaps( lwPointList *point, lwVMap *vmap ) { lwVMap *vm; int i, j, n; /* count the number of vmap values for each point */ vm = vmap; while ( vm ) { if ( !vm->perpoly ) for ( i = 0; i < vm->nverts; i++ ) ++point->pt[ vm->vindex[ i ]].nvmaps; vm = vm->next; } /* allocate vmap references for each mapped point */ for ( i = 0; i < point->count; i++ ) { if ( point->pt[ i ].nvmaps ) { point->pt[ i ].vm = _pico_calloc( point->pt[ i ].nvmaps, sizeof( lwVMapPt )); if ( !point->pt[ i ].vm ) return 0; point->pt[ i ].nvmaps = 0; } } /* fill in vmap references for each mapped point */ vm = vmap; while ( vm ) { if ( !vm->perpoly ) { for ( i = 0; i < vm->nverts; i++ ) { j = vm->vindex[ i ]; n = point->pt[ j ].nvmaps; point->pt[ j ].vm[ n ].vmap = vm; point->pt[ j ].vm[ n ].index = i; ++point->pt[ j ].nvmaps; } } vm = vm->next; } return 1; } /* ====================================================================== lwGetPolyVMaps() Fill in the lwVMapPt structure for each polygon vertex. ====================================================================== */ int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap ) { lwVMap *vm; lwPolVert *pv; int i, j; /* count the number of vmap values for each polygon vertex */ vm = vmap; while ( vm ) { if ( vm->perpoly ) { for ( i = 0; i < vm->nverts; i++ ) { for ( j = 0; j < polygon->pol[ vm->pindex[ i ]].nverts; j++ ) { pv = &polygon->pol[ vm->pindex[ i ]].v[ j ]; if ( vm->vindex[ i ] == pv->index ) { ++pv->nvmaps; break; } } } } vm = vm->next; } /* allocate vmap references for each mapped vertex */ for ( i = 0; i < polygon->count; i++ ) { for ( j = 0; j < polygon->pol[ i ].nverts; j++ ) { pv = &polygon->pol[ i ].v[ j ]; if ( pv->nvmaps ) { pv->vm = _pico_calloc( pv->nvmaps, sizeof( lwVMapPt )); if ( !pv->vm ) return 0; pv->nvmaps = 0; } } } /* fill in vmap references for each mapped point */ vm = vmap; while ( vm ) { if ( vm->perpoly ) { for ( i = 0; i < vm->nverts; i++ ) { for ( j = 0; j < polygon->pol[ vm->pindex[ i ]].nverts; j++ ) { pv = &polygon->pol[ vm->pindex[ i ]].v[ j ]; if ( vm->vindex[ i ] == pv->index ) { pv->vm[ pv->nvmaps ].vmap = vm; pv->vm[ pv->nvmaps ].index = i; ++pv->nvmaps; break; } } } } vm = vm->next; } return 1; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/picointernal.c�����������������������������������������������������0000664�0000000�0000000�00000066001�12454246557�0021457�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #define PICOINTERNAL_C /* todo: * - fix p->curLine for parser routines. increased twice */ /* dependencies */ #include #include #include "picointernal.h" /* function pointers */ void *(*_pico_ptr_malloc )( size_t ) = malloc; void (*_pico_ptr_free )( void* ) = free; void (*_pico_ptr_load_file )( char*, unsigned char**, int* ) = NULL; void (*_pico_ptr_free_file )( void* ) = NULL; void (*_pico_ptr_print )( int, const char* ) = NULL; typedef union { float f; char c[4]; } floatSwapUnion; /* _pico_alloc: * kludged memory allocation wrapper */ void *_pico_alloc( size_t size ) { void *ptr; /* some sanity checks */ if( size == 0 ) return NULL; if (_pico_ptr_malloc == NULL) return NULL; /* allocate memory */ ptr = _pico_ptr_malloc(size); if (ptr == NULL) return NULL; /* zero out allocated memory */ memset(ptr,0,size); /* return pointer to allocated memory */ return ptr; } /* _pico_calloc: * _pico_calloc wrapper */ void *_pico_calloc( size_t num, size_t size ) { void *ptr; /* some sanity checks */ if( num == 0 || size == 0 ) return NULL; if (_pico_ptr_malloc == NULL) return NULL; /* allocate memory */ ptr = _pico_ptr_malloc(num*size); if (ptr == NULL) return NULL; /* zero out allocated memory */ memset(ptr,0,num*size); /* return pointer to allocated memory */ return ptr; } /* _pico_realloc: * memory reallocation wrapper (note: only grows, * but never shrinks or frees) */ void *_pico_realloc( void **ptr, size_t oldSize, size_t newSize ) { void *ptr2; /* sanity checks */ if( ptr == NULL ) return NULL; if( newSize < oldSize ) return *ptr; if (_pico_ptr_malloc == NULL) return NULL; /* allocate new pointer */ ptr2 = _pico_alloc( newSize ); if( ptr2 == NULL ) return NULL; /* copy */ if( *ptr != NULL ) { memcpy( ptr2, *ptr, oldSize ); _pico_free( *ptr ); } /* fix up and return */ *ptr = ptr2; return *ptr; } /* _pico_clone_alloc: * handy function for quick string allocation/copy. it clones * the given string and returns a pointer to the new allocated * clone (which must be freed by caller of course) or returns * NULL on memory alloc or param errors. if 'size' is -1 the * length of the input string is used, otherwise 'size' is used * as custom clone size (the string is cropped to fit into mem * if needed). -sea */ char *_pico_clone_alloc( const char *str ) { char* cloned; /* sanity check */ if (str == NULL) return NULL; /* allocate memory */ cloned = _pico_alloc( strlen(str) + 1 ); if (cloned == NULL) return NULL; /* copy input string to cloned string */ strcpy( cloned, str ); /* return ptr to cloned string */ return cloned; } /* _pico_free: * wrapper around the free function pointer */ void _pico_free( void *ptr ) { /* sanity checks */ if( ptr == NULL ) return; if (_pico_ptr_free == NULL) return; /* free the allocated memory */ _pico_ptr_free( ptr ); } /* _pico_load_file: * wrapper around the loadfile function pointer */ void _pico_load_file( char *name, unsigned char **buffer, int *bufSize ) { /* sanity checks */ if( name == NULL ) { *bufSize = -1; return; } if (_pico_ptr_load_file == NULL) { *bufSize = -1; return; } /* do the actual call to read in the file; */ /* BUFFER IS ALLOCATED BY THE EXTERNAL LOADFILE FUNC */ _pico_ptr_load_file( name,buffer,bufSize ); } /* _pico_free_file: * wrapper around the file free function pointer */ void _pico_free_file( void *buffer ) { /* sanity checks */ if( buffer == NULL ) return; /* use default free */ if( _pico_ptr_free_file == NULL ) { free( buffer ); return; } /* free the allocated file */ _pico_ptr_free_file( buffer ); } /* _pico_printf: * wrapper around the print function pointer -sea */ void _pico_printf( int level, const char *format, ...) { char str[4096]; va_list argptr; /* sanity checks */ if( format == NULL ) return; if (_pico_ptr_print == NULL) return; /* format string */ va_start( argptr,format ); vsprintf( str,format,argptr ); va_end( argptr ); /* remove linefeeds */ if (str[ strlen(str)-1 ] == '\n') str[ strlen(str)-1 ] = '\0'; /* do the actual call */ _pico_ptr_print( level,str ); } /* _pico_first_token: * trims everything after the first whitespace-delimited token */ void _pico_first_token( char *str ) { if( !str || !*str ) return; while( *str && !isspace( *str ) ) str++; *str = '\0'; } /* _pico_strltrim: * left trims the given string -sea */ char *_pico_strltrim( char *str ) { char *str1 = str, *str2 = str; while (isspace(*str2)) str2++; if( str2 != str ) while( *str2 != '\0' ) /* fix: ydnar */ *str1++ = *str2++; return str; } /* _pico_strrtrim: * right trims the given string -sea */ char *_pico_strrtrim( char *str ) { if (str && *str) { char *str1 = str; int allspace = 1; while (*str1) { if (allspace && !isspace(*str1)) allspace = 0; str1++; } if (allspace) *str = '\0'; else { str1--; while ((isspace(*str1)) && (str1 >= str)) *str1-- = '\0'; } } return str; } /* _pico_strlwr: * pico internal string-to-lower routine. */ char *_pico_strlwr( char *str ) { char *cp; for (cp=str; *cp; ++cp) { if ('A' <= *cp && *cp <= 'Z') { *cp += ('a' - 'A'); } } return str; } /* _pico_strchcount: * counts how often the given char appears in str. -sea */ int _pico_strchcount( char *str, int ch ) { int count = 0; while (*str++) if (*str == ch) count++; return count; } void _pico_zero_bounds( picoVec3_t mins, picoVec3_t maxs ) { int i; for (i=0; i<3; i++) { mins[i] = +999999; maxs[i] = -999999; } } void _pico_expand_bounds( picoVec3_t p, picoVec3_t mins, picoVec3_t maxs ) { int i; for (i=0; i<3; i++) { float value = p[i]; if (value < mins[i]) mins[i] = value; if (value > maxs[i]) maxs[i] = value; } } void _pico_zero_vec( picoVec3_t vec ) { vec[ 0 ] = vec[ 1 ] = vec[ 2 ] = 0; } void _pico_zero_vec2( picoVec2_t vec ) { vec[ 0 ] = vec[ 1 ] = 0; } void _pico_zero_vec4( picoVec4_t vec ) { vec[ 0 ] = vec[ 1 ] = vec[ 2 ] = vec[ 3 ] = 0; } void _pico_set_vec( picoVec3_t v, double a, double b, double c ) { v[ 0 ] = a; v[ 1 ] = b; v[ 2 ] = c; } void _pico_set_vec4( picoVec4_t v, double a, double b, double c, double d ) { v[ 0 ] = a; v[ 1 ] = b; v[ 2 ] = c; v[ 3 ] = d; } void _pico_copy_vec( picoVec3_t src, picoVec3_t dest ) { dest[ 0 ] = src[ 0 ]; dest[ 1 ] = src[ 1 ]; dest[ 2 ] = src[ 2 ]; } void _pico_copy_vec2( picoVec2_t src, picoVec2_t dest ) { dest[ 0 ] = src[ 0 ]; dest[ 1 ] = src[ 1 ]; } void _pico_copy_vec4( picoVec4_t src, picoVec4_t dest ) { dest[ 0 ] = src[ 0 ]; dest[ 1 ] = src[ 1 ]; dest[ 2 ] = src[ 2 ]; dest[ 3 ] = src[ 3 ]; } /* ydnar */ picoVec_t _pico_normalize_vec( picoVec3_t vec ) { double len, ilen; len = sqrt( vec[ 0 ] * vec[ 0 ] + vec[ 1 ] * vec[ 1 ] + vec[ 2 ] * vec[ 2 ] ); if( len == 0.0 ) return 0.0; ilen = 1.0 / len; vec[ 0 ] *= (picoVec_t) ilen; vec[ 1 ] *= (picoVec_t) ilen; vec[ 2 ] *= (picoVec_t) ilen; return (picoVec_t) len; } void _pico_add_vec( picoVec3_t a, picoVec3_t b, picoVec3_t dest ) { dest[ 0 ] = a[ 0 ] + b[ 0 ]; dest[ 1 ] = a[ 1 ] + b[ 1 ]; dest[ 2 ] = a[ 2 ] + b[ 2 ]; } void _pico_subtract_vec( picoVec3_t a, picoVec3_t b, picoVec3_t dest ) { dest[ 0 ] = a[ 0 ] - b[ 0 ]; dest[ 1 ] = a[ 1 ] - b[ 1 ]; dest[ 2 ] = a[ 2 ] - b[ 2 ]; } void _pico_scale_vec( picoVec3_t v, float scale, picoVec3_t dest ) { dest[ 0 ] = v[ 0 ] * scale; dest[ 1 ] = v[ 1 ] * scale; dest[ 2 ] = v[ 2 ] * scale; } void _pico_scale_vec4( picoVec4_t v, float scale, picoVec4_t dest ) { dest[ 0 ] = v[ 0 ] * scale; dest[ 1 ] = v[ 1 ] * scale; dest[ 2 ] = v[ 2 ] * scale; dest[ 3 ] = v[ 3 ] * scale; } picoVec_t _pico_dot_vec( picoVec3_t a, picoVec3_t b ) { return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ]; } void _pico_cross_vec( picoVec3_t a, picoVec3_t b, picoVec3_t dest ) { dest[ 0 ] = a[ 1 ] * b[ 2 ] - a[ 2 ] * b[ 1 ]; dest[ 1 ] = a[ 2 ] * b[ 0 ] - a[ 0 ] * b[ 2 ]; dest[ 2 ] = a[ 0 ] * b[ 1 ] - a[ 1 ] * b[ 0 ]; } picoVec_t _pico_calc_plane( picoVec4_t plane, picoVec3_t a, picoVec3_t b, picoVec3_t c ) { picoVec3_t ba, ca; _pico_subtract_vec( b, a, ba ); _pico_subtract_vec( c, a, ca ); _pico_cross_vec( ca, ba, plane ); plane[ 3 ] = _pico_dot_vec( a, plane ); return _pico_normalize_vec( plane ); } /* separate from _pico_set_vec4 */ void _pico_set_color( picoColor_t c, int r, int g, int b, int a ) { c[ 0 ] = r; c[ 1 ] = g; c[ 2 ] = b; c[ 3 ] = a; } void _pico_copy_color( picoColor_t src, picoColor_t dest ) { dest[ 0 ] = src[ 0 ]; dest[ 1 ] = src[ 1 ]; dest[ 2 ] = src[ 2 ]; dest[ 3 ] = src[ 3 ]; } #ifdef __BIG_ENDIAN__ int _pico_big_long ( int src ) { return src; } short _pico_big_short( short src ) { return src; } float _pico_big_float( float src ) { return src; } int _pico_little_long( int src ) { return ((src & 0xFF000000) >> 24) | ((src & 0x00FF0000) >> 8) | ((src & 0x0000FF00) << 8) | ((src & 0x000000FF) << 24); } short _pico_little_short( short src ) { return ((src & 0xFF00) >> 8) | ((src & 0x00FF) << 8); } float _pico_little_float( float src ) { floatSwapUnion in,out; in.f = src; out.c[ 0 ] = in.c[ 3 ]; out.c[ 1 ] = in.c[ 2 ]; out.c[ 2 ] = in.c[ 1 ]; out.c[ 3 ] = in.c[ 0 ]; return out.f; } #else /*__BIG_ENDIAN__*/ int _pico_little_long ( int src ) { return src; } short _pico_little_short( short src ) { return src; } float _pico_little_float( float src ) { return src; } int _pico_big_long( int src ) { return ((src & 0xFF000000) >> 24) | ((src & 0x00FF0000) >> 8) | ((src & 0x0000FF00) << 8) | ((src & 0x000000FF) << 24); } short _pico_big_short( short src ) { return ((src & 0xFF00) >> 8) | ((src & 0x00FF) << 8); } float _pico_big_float( float src ) { floatSwapUnion in,out; in.f = src; out.c[ 0 ] = in.c[ 3 ]; out.c[ 1 ] = in.c[ 2 ]; out.c[ 2 ] = in.c[ 1 ]; out.c[ 3 ] = in.c[ 0 ]; return out.f; } #endif /*__BIG_ENDIAN__*/ /* _pico_stristr: * case-insensitive strstr. -sea */ char *_pico_stristr( char *str, const char *substr ) { const size_t sublen = strlen(substr); while (*str) { if (!_pico_strnicmp(str,substr,sublen)) break; str++; } if (!(*str)) str = NULL; return str; } /* _pico_unixify() changes dos \ style path separators to / */ void _pico_unixify( char *path ) { if( path == NULL ) return; while( *path ) { if( *path == '\\' ) *path = '/'; path++; } } /* _pico_nofname: * removes file name portion from given file path and converts * the directory separators to un*x style. returns 1 on success * or 0 when 'destSize' was exceeded. -sea */ int _pico_nofname( const char *path, char *dest, int destSize ) { int left = destSize; char *temp = dest; while ((*dest = *path) != '\0') { if (*dest == '/' || *dest == '\\') { temp = (dest + 1); *dest = '/'; } dest++; path++; if (--left < 1) { *temp = '\0'; return 0; } } *temp = '\0'; return 1; } /* _pico_nopath: * returns ptr to filename portion in given path or an empty * string otherwise. given 'path' is not altered. -sea */ const char *_pico_nopath( const char *path ) { const char *src; src = path + (strlen(path) - 1); if (path == NULL) return ""; if (!strchr(path,'/') && !strchr(path,'\\')) return (path); while ((src--) != path) { if (*src == '/' || *src == '\\') return (++src); } return ""; } /* _pico_setfext: * sets/changes the file extension for the given filename * or filepath's filename portion. the given 'path' *is* * altered. leave 'ext' empty to remove extension. -sea */ char *_pico_setfext( char *path, const char *ext ) { char *src; int remfext = 0; src = path + (strlen(path) - 1); if (ext == NULL) ext = ""; if (strlen(ext ) < 1) remfext = 1; if (strlen(path) < 1) return path; while ((src--) != path) { if (*src == '/' || *src == '\\') return path; if (*src == '.') { if (remfext) { *src = '\0'; return path; } *(++src) = '\0'; break; } } strcat(path,ext); return path; } /* _pico_getline: * extracts one line from the given buffer and stores it in dest. * returns -1 on error or the length of the line on success. i've * removed string trimming here. this can be done manually by the * calling func. */ int _pico_getline( char *buf, int bufsize, char *dest, int destsize ) { int pos; /* check output */ if (dest == NULL || destsize < 1) return -1; memset( dest,0,destsize ); /* check input */ if (buf == NULL || bufsize < 1) return -1; /* get next line */ for (pos=0; poscursor == NULL) return; /* skin white spaces */ while( 1 ) { /* sanity checks */ if (p->cursor < p->buffer || p->cursor >= p->max) { return; } /* break for chars other than white spaces */ if (*p->cursor > 0x20) break; if (*p->cursor == 0x00) return; /* a bit of linefeed handling */ if (*p->cursor == '\n') { *hasLFs = 1; p->curLine++; } /* go to next character */ p->cursor++; } } /* _pico_new_parser: * allocates a new ascii parser object. */ picoParser_t *_pico_new_parser( picoByte_t *buffer, int bufSize ) { picoParser_t *p; /* sanity check */ if( buffer == NULL || bufSize <= 0 ) return NULL; /* allocate reader */ p = _pico_alloc( sizeof(picoParser_t) ); if (p == NULL) return NULL; memset( p,0,sizeof(picoParser_t) ); /* allocate token space */ p->tokenSize = 0; p->tokenMax = 1024; p->token = _pico_alloc( p->tokenMax ); if( p->token == NULL ) { _pico_free( p ); return NULL; } /* setup */ p->buffer = (char*)buffer; p->cursor = (char*)buffer; p->bufSize = bufSize; p->max = p->buffer + bufSize; p->curLine = 1; /* sea: new */ /* return ptr to parser */ return p; } /* _pico_free_parser: * frees an existing pico parser object. */ void _pico_free_parser( picoParser_t *p ) { /* sanity check */ if (p == NULL) return; /* free the parser */ if (p->token != NULL) { _pico_free( p->token ); } _pico_free( p ); } /* _pico_parse_ex: * reads the next token from given pico parser object. if param * 'allowLFs' is 1 it will read beyond linefeeds and return 0 when * the EOF is reached. if 'allowLFs' is 0 it will return 0 when * the EOL is reached. if 'handleQuoted' is 1 the parser function * will handle "quoted" strings and return the data between the * quotes as token. returns 0 on end/error or 1 on success. -sea */ int _pico_parse_ex( picoParser_t *p, int allowLFs, int handleQuoted ) { int hasLFs = 0; char *old; /* sanity checks */ if( p == NULL || p->buffer == NULL || p->cursor < p->buffer || p->cursor >= p->max ) { return 0; } /* clear parser token */ p->tokenSize = 0; p->token[ 0 ] = '\0'; old = p->cursor; /* skip whitespaces */ while( p->cursor < p->max && *p->cursor <= 32 ) { if (*p->cursor == '\n') { p->curLine++; hasLFs++; } p->cursor++; } /* return if we're not allowed to go beyond lfs */ if ((hasLFs > 0) && !allowLFs) { p->cursor = old; return 0; } /* get next quoted string */ if (*p->cursor == '\"' && handleQuoted) { p->cursor++; while (p->cursor < p->max && *p->cursor) { if (*p->cursor == '\\') { if (*(p->cursor+1) == '"') { p->cursor++; } p->token[ p->tokenSize++ ] = *p->cursor++; continue; } else if (*p->cursor == '\"') { p->cursor++; break; } else if (*p->cursor == '\n') { p->curLine++; } p->token[ p->tokenSize++ ] = *p->cursor++; } /* terminate token */ p->token[ p->tokenSize ] = '\0'; return 1; } /* otherwise get next word */ while( p->cursor < p->max && *p->cursor > 32 ) { if (*p->cursor == '\n') { p->curLine++; } p->token[ p->tokenSize++ ] = *p->cursor++; } /* terminate token */ p->token[ p->tokenSize ] = '\0'; return 1; } /* _pico_parse_first: * reads the first token from the next line and returns * a pointer to it. returns NULL on EOL or EOF. -sea */ char *_pico_parse_first( picoParser_t *p ) { /* sanity check */ if (p == NULL) return NULL; /* try to read next token (with lfs & quots) */ if (!_pico_parse_ex( p,1,1 )) return NULL; /* return ptr to the token string */ return p->token; } /* _pico_parse: * reads the next token from the parser and returns a pointer * to it. quoted strings are handled as usual. returns NULL * on EOL or EOF. -sea */ char *_pico_parse( picoParser_t *p, int allowLFs ) { /* sanity check */ if (p == NULL) return NULL; /* try to read next token (with quots) */ if (!_pico_parse_ex( p,allowLFs,1 )) return NULL; /* return ptr to the token string */ return p->token; } /* _pico_parse_skip_rest: * skips the rest of the current line in parser. */ void _pico_parse_skip_rest( picoParser_t *p ) { while( _pico_parse_ex( p,0,0 ) ) ; } /* _pico_parse_skip_braced: * parses/skips over a braced section. returns 1 on success * or 0 on error (when there was no closing bracket and the * end of buffer was reached or when the opening bracket was * missing). */ int _pico_parse_skip_braced( picoParser_t *p ) { int firstToken = 1; int level; /* sanity check */ if (p == NULL) return 0; /* set the initial level for parsing */ level = 0; /* skip braced section */ while( 1 ) { /* read next token (lfs allowed) */ if (!_pico_parse_ex( p,1,1 )) { /* end of parser buffer reached */ return 0; } /* first token must be an opening bracket */ if (firstToken && p->token[0] != '{') { /* opening bracket missing */ return 0; } /* we only check this once */ firstToken = 0; /* update level */ if (p->token[1] == '\0') { if (p->token[0] == '{') level++; if (p->token[0] == '}') level--; } /* break if we're back at our starting level */ if (level == 0) break; } /* successfully skipped braced section */ return 1; } int _pico_parse_check( picoParser_t *p, int allowLFs, char *str ) { if (!_pico_parse_ex( p,allowLFs,1 )) return 0; if (!strcmp(p->token,str)) return 1; return 0; } int _pico_parse_checki( picoParser_t *p, int allowLFs, char *str ) { if (!_pico_parse_ex( p,allowLFs,1 )) return 0; if (!_pico_stricmp(p->token,str)) return 1; return 0; } int _pico_parse_int( picoParser_t *p, int *out ) { char *token; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* get token and turn it into an integer */ *out = 0; token = _pico_parse( p,0 ); if (token == NULL) return 0; *out = atoi( token ); /* success */ return 1; } int _pico_parse_int_def( picoParser_t *p, int *out, int def ) { char *token; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* get token and turn it into an integer */ *out = def; token = _pico_parse( p,0 ); if (token == NULL) return 0; *out = atoi( token ); /* success */ return 1; } int _pico_parse_float( picoParser_t *p, float *out ) { char *token; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* get token and turn it into a float */ *out = 0.0f; token = _pico_parse( p,0 ); if (token == NULL) return 0; *out = (float) atof( token ); /* success */ return 1; } int _pico_parse_float_def( picoParser_t *p, float *out, float def ) { char *token; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* get token and turn it into a float */ *out = def; token = _pico_parse( p,0 ); if (token == NULL) return 0; *out = (float) atof( token ); /* success */ return 1; } int _pico_parse_double( picoParser_t *p, double *out ) { char *token; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* get token and turn it into a double */ *out = 0; token = _pico_parse( p,0 ); if (token == NULL) return 0; *out = (double) strtod( token, NULL ); /* success */ return 1; } int _pico_parse_double_def( picoParser_t *p, double *out, double def ) { char *token; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* get token and turn it into a double */ *out = def; token = _pico_parse( p,0 ); if (token == NULL) return 0; *out = (double) strtod( token, NULL ); /* success */ return 1; } int _pico_parse_vec( picoParser_t *p, picoVec3_t out ) { char *token; int i; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* zero out outination vector */ _pico_zero_vec( out ); /* parse three vector components */ for (i=0; i<3; i++) { token = _pico_parse( p,0 ); if (token == NULL) { _pico_zero_vec( out ); return 0; } out[ i ] = (float) atof( token ); } /* success */ return 1; } int _pico_parse_vec_def( picoParser_t *p, picoVec3_t out, picoVec3_t def ) { char *token; int i; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* assign default vector value */ _pico_copy_vec( def,out ); /* parse three vector components */ for (i=0; i<3; i++) { token = _pico_parse( p,0 ); if (token == NULL) { _pico_copy_vec( def,out ); return 0; } out[ i ] = (float) atof( token ); } /* success */ return 1; } int _pico_parse_vec2( picoParser_t *p, picoVec2_t out ) { char *token; int i; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* zero out outination vector */ _pico_zero_vec2( out ); /* parse two vector components */ for (i=0; i<2; i++) { token = _pico_parse( p,0 ); if (token == NULL) { _pico_zero_vec2( out ); return 0; } out[ i ] = (float) atof( token ); } /* success */ return 1; } int _pico_parse_vec2_def( picoParser_t *p, picoVec2_t out, picoVec2_t def ) { char *token; int i; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* assign default vector value */ _pico_copy_vec2( def,out ); /* parse two vector components */ for (i=0; i<2; i++) { token = _pico_parse( p,0 ); if (token == NULL) { _pico_copy_vec2( def,out ); return 0; } out[ i ] = (float) atof( token ); } /* success */ return 1; } int _pico_parse_vec4( picoParser_t *p, picoVec4_t out ) { char *token; int i; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* zero out outination vector */ _pico_zero_vec4( out ); /* parse four vector components */ for (i=0; i<4; i++) { token = _pico_parse( p,0 ); if (token == NULL) { _pico_zero_vec4( out ); return 0; } out[ i ] = (float) atof( token ); } /* success */ return 1; } int _pico_parse_vec4_def( picoParser_t *p, picoVec4_t out, picoVec4_t def ) { char *token; int i; /* sanity checks */ if (p == NULL || out == NULL) return 0; /* assign default vector value */ _pico_copy_vec4( def,out ); /* parse four vector components */ for (i=0; i<4; i++) { token = _pico_parse( p,0 ); if (token == NULL) { _pico_copy_vec4( def,out ); return 0; } out[ i ] = (float) atof( token ); } /* success */ return 1; } /* _pico_new_memstream: * allocates a new memorystream object. */ picoMemStream_t *_pico_new_memstream( picoByte_t *buffer, int bufSize ) { picoMemStream_t *s; /* sanity check */ if( buffer == NULL || bufSize <= 0 ) return NULL; /* allocate stream */ s = _pico_alloc( sizeof(picoMemStream_t) ); if (s == NULL) return NULL; memset( s,0,sizeof(picoMemStream_t) ); /* setup */ s->buffer = buffer; s->curPos = buffer; s->bufSize = bufSize; s->flag = 0; /* return ptr to stream */ return s; } /* _pico_free_memstream: * frees an existing pico memorystream object. */ void _pico_free_memstream( picoMemStream_t *s ) { /* sanity check */ if (s == NULL) return; /* free the stream */ _pico_free( s ); } /* _pico_memstream_read: * reads data from a pico memorystream into a buffer. */ int _pico_memstream_read( picoMemStream_t *s, void *buffer, int len ) { int ret = 1; /* sanity checks */ if (s == NULL || buffer == NULL) return 0; if (s->curPos + len > s->buffer + s->bufSize) { s->flag |= PICO_IOEOF; len = s->buffer + s->bufSize - s->curPos; ret = 0; } /* read the data */ memcpy( buffer, s->curPos, len ); s->curPos += len; return ret; } /* _pico_memstream_read: * reads a character from a pico memorystream */ int _pico_memstream_getc( picoMemStream_t *s ) { int c = 0; /* sanity check */ if (s == NULL) return -1; /* read the character */ if (_pico_memstream_read( s, &c, 1) == 0) return -1; return c; } /* _pico_memstream_seek: * sets the current read position to a different location */ int _pico_memstream_seek( picoMemStream_t *s, long offset, int origin ) { int overflow; /* sanity check */ if (s == NULL) return -1; if (origin == PICO_SEEK_SET) { s->curPos = s->buffer + offset; overflow = s->curPos - ( s->buffer + s->bufSize ); if (overflow > 0) { s->curPos = s->buffer + s->bufSize; return offset - overflow; } return 0; } else if (origin == PICO_SEEK_CUR) { s->curPos += offset; overflow = s->curPos - ( s->buffer + s->bufSize ); if (overflow > 0) { s->curPos = s->buffer + s->bufSize; return offset - overflow; } return 0; } else if (origin == PICO_SEEK_END) { s->curPos = ( s->buffer + s->bufSize ) - offset; overflow = s->buffer - s->curPos; if (overflow > 0) { s->curPos = s->buffer; return offset - overflow; } return 0; } return -1; } /* _pico_memstream_tell: * returns the current read position in the pico memorystream */ long _pico_memstream_tell( picoMemStream_t *s ) { /* sanity check */ if (s == NULL) return -1; return s->curPos - s->buffer; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/picointernal.h�����������������������������������������������������0000664�0000000�0000000�00000016400�12454246557�0021462�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #ifndef PICOINTERNAL_H #define PICOINTERNAL_H #ifdef __cplusplus extern "C" { #endif /* dependencies */ #include #include #include #include #include #include #include "picomodel.h" /* os dependent replacements */ #if WIN32 || _WIN32 #define _pico_stricmp stricmp #define _pico_strnicmp strnicmp #else #define _pico_stricmp strcasecmp #define _pico_strnicmp strncasecmp #endif /* constants */ #define PICO_PI 3.14159265358979323846 #define PICO_SEEK_SET 0 #define PICO_SEEK_CUR 1 #define PICO_SEEK_END 2 #define PICO_IOEOF 1 #define PICO_IOERR 2 /* types */ typedef struct picoParser_s { char *buffer; int bufSize; char *token; int tokenSize; int tokenMax; char *cursor; char *max; int curLine; } picoParser_t; typedef struct picoMemStream_s { picoByte_t *buffer; int bufSize; picoByte_t *curPos; int flag; } picoMemStream_t; /* variables */ extern const picoModule_t *picoModules[]; extern void *(*_pico_ptr_malloc)( size_t ); extern void (*_pico_ptr_free)( void* ); extern void (*_pico_ptr_load_file)( char*, unsigned char**, int* ); extern void (*_pico_ptr_free_file)( void* ); extern void (*_pico_ptr_print)( int, const char* ); /* prototypes */ /* memory */ void *_pico_alloc( size_t size ); void *_pico_calloc( size_t num, size_t size ); void *_pico_realloc( void **ptr, size_t oldSize, size_t newSize ); char *_pico_clone_alloc( const char *str ); void _pico_free( void *ptr ); /* files */ void _pico_load_file( char *name, unsigned char **buffer, int *bufSize ); void _pico_free_file( void *buffer ); /* strings */ void _pico_first_token( char *str ); char *_pico_strltrim( char *str ); char *_pico_strrtrim( char *str ); int _pico_strchcount( char *str, int ch ); void _pico_printf( int level, const char *format, ... ); char *_pico_stristr( char *str, const char *substr ); void _pico_unixify( char *path ); int _pico_nofname( const char *path, char *dest, int destSize ); const char *_pico_nopath( const char *path ); char *_pico_setfext( char *path, const char *ext ); int _pico_getline( char *buf, int bufsize, char *dest, int destsize ); char *_pico_strlwr( char *str ); /* vectors */ void _pico_zero_bounds( picoVec3_t mins, picoVec3_t maxs ); void _pico_expand_bounds( picoVec3_t p, picoVec3_t mins, picoVec3_t maxs ); void _pico_zero_vec( picoVec3_t vec ); void _pico_zero_vec2( picoVec2_t vec ); void _pico_zero_vec4( picoVec4_t vec ); void _pico_set_vec( picoVec3_t v, double a, double b, double c ); void _pico_set_vec4( picoVec4_t v, double a, double b, double c, double d ); void _pico_set_color( picoColor_t c, int r, int g, int b, int a ); void _pico_copy_color( picoColor_t src, picoColor_t dest ); void _pico_copy_vec( picoVec3_t src, picoVec3_t dest ); void _pico_copy_vec2( picoVec2_t src, picoVec2_t dest ); picoVec_t _pico_normalize_vec( picoVec3_t vec ); void _pico_add_vec( picoVec3_t a, picoVec3_t b, picoVec3_t dest ); void _pico_subtract_vec( picoVec3_t a, picoVec3_t b, picoVec3_t dest ); picoVec_t _pico_dot_vec( picoVec3_t a, picoVec3_t b ); void _pico_cross_vec( picoVec3_t a, picoVec3_t b, picoVec3_t dest ); picoVec_t _pico_calc_plane( picoVec4_t plane, picoVec3_t a, picoVec3_t b, picoVec3_t c ); void _pico_scale_vec( picoVec3_t v, float scale, picoVec3_t dest ); void _pico_scale_vec4( picoVec4_t v, float scale, picoVec4_t dest ); /* endian */ int _pico_big_long( int src ); short _pico_big_short( short src ); float _pico_big_float( float src ); int _pico_little_long( int src ); short _pico_little_short( short src ); float _pico_little_float( float src ); /* pico ascii parser */ picoParser_t *_pico_new_parser( picoByte_t *buffer, int bufSize ); void _pico_free_parser( picoParser_t *p ); int _pico_parse_ex( picoParser_t *p, int allowLFs, int handleQuoted ); char *_pico_parse_first( picoParser_t *p ); char *_pico_parse( picoParser_t *p, int allowLFs ); void _pico_parse_skip_rest( picoParser_t *p ); int _pico_parse_skip_braced( picoParser_t *p ); int _pico_parse_check( picoParser_t *p, int allowLFs, char *str ); int _pico_parse_checki( picoParser_t *p, int allowLFs, char *str ); int _pico_parse_int( picoParser_t *p, int *out ); int _pico_parse_int_def( picoParser_t *p, int *out, int def ); int _pico_parse_float( picoParser_t *p, float *out ); int _pico_parse_float_def( picoParser_t *p, float *out, float def ); int _pico_parse_double( picoParser_t *p, double *out ); int _pico_parse_double_def( picoParser_t *p, double *out, double def ); int _pico_parse_vec( picoParser_t *p, picoVec3_t out); int _pico_parse_vec_def( picoParser_t *p, picoVec3_t out, picoVec3_t def); int _pico_parse_vec2( picoParser_t *p, picoVec2_t out ); int _pico_parse_vec2_def( picoParser_t *p, picoVec2_t out, picoVec2_t def ); int _pico_parse_vec4( picoParser_t *p, picoVec4_t out); int _pico_parse_vec4_def( picoParser_t *p, picoVec4_t out, picoVec4_t def); /* pico memory stream */ picoMemStream_t *_pico_new_memstream( picoByte_t *buffer, int bufSize ); void _pico_free_memstream( picoMemStream_t *s ); int _pico_memstream_read( picoMemStream_t *s, void *buffer, int len ); int _pico_memstream_getc( picoMemStream_t *s ); int _pico_memstream_seek( picoMemStream_t *s, long offset, int origin ); long _pico_memstream_tell( picoMemStream_t *s ); #define _pico_memstream_eof( _pico_memstream ) ((_pico_memstream)->flag & PICO_IOEOF) #define _pico_memstream_error( _pico_memstream ) ((_pico_memstream)->flag & PICO_IOERR) /* end marker */ #ifdef __cplusplus } #endif #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/picomodel.c��������������������������������������������������������0000664�0000000�0000000�00000150512�12454246557�0020744�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #define PICOMODEL_C /* dependencies */ #include "picointernal.h" /* PicoInit() initializes the picomodel library */ int PicoInit( void ) { /* successfully initialized -sea */ return 1; } /* PicoShutdown() shuts the pico model library down */ void PicoShutdown( void ) { /* do something interesting here in the future */ return; } /* PicoError() returns last picomodel error code (see PME_* defines) */ int PicoError( void ) { /* todo: do something here */ return 0; } /* PicoSetMallocFunc() sets the ptr to the malloc function */ void PicoSetMallocFunc( void *(*func)( size_t ) ) { if( func != NULL ) _pico_ptr_malloc = func; } /* PicoSetFreeFunc() sets the ptr to the free function */ void PicoSetFreeFunc( void (*func)( void* ) ) { if( func != NULL ) _pico_ptr_free = func; } /* PicoSetLoadFileFunc() sets the ptr to the file load function */ void PicoSetLoadFileFunc( void (*func)( char*, unsigned char**, int* ) ) { if( func != NULL ) _pico_ptr_load_file = func; } /* PicoSetFreeFileFunc() sets the ptr to the free function */ void PicoSetFreeFileFunc( void (*func)( void* ) ) { if( func != NULL ) _pico_ptr_free_file = func; } /* PicoSetPrintFunc() sets the ptr to the print function */ void PicoSetPrintFunc( void (*func)( int, const char* ) ) { if( func != NULL ) _pico_ptr_print = func; } picoModel_t *PicoModuleLoadModel( const picoModule_t* pm, char* fileName, picoByte_t* buffer, int bufSize, int frameNum ) { char *modelFileName, *remapFileName; /* see whether this module can load the model file or not */ if( pm->canload( fileName, buffer, bufSize ) == PICO_PMV_OK ) { /* use loader provided by module to read the model data */ picoModel_t* model = pm->load( fileName, frameNum, buffer, bufSize ); if( model == NULL ) { _pico_free_file( buffer ); return NULL; } /* assign pointer to file format module */ model->module = pm; /* get model file name */ modelFileName = PicoGetModelFileName( model ); /* apply model remappings from .remap */ if( strlen( modelFileName ) ) { /* alloc copy of model file name */ remapFileName = _pico_alloc( strlen( modelFileName ) + 20 ); if( remapFileName != NULL ) { /* copy model file name and change extension */ strcpy( remapFileName, modelFileName ); _pico_setfext( remapFileName, "remap" ); /* try to remap model; we don't handle the result */ PicoRemapModel( model, remapFileName ); /* free the remap file name string */ _pico_free( remapFileName ); } } return model; } return NULL; } /* PicoLoadModel() the meat and potatoes function */ picoModel_t *PicoLoadModel( char *fileName, int frameNum ) { const picoModule_t **modules, *pm; picoModel_t *model; picoByte_t *buffer; int bufSize; /* init */ model = NULL; /* make sure we've got a file name */ if( fileName == NULL ) { _pico_printf( PICO_ERROR, "PicoLoadModel: No filename given (fileName == NULL)" ); return NULL; } /* load file data (buffer is allocated by host app) */ _pico_load_file( fileName, &buffer, &bufSize ); if( bufSize < 0 ) { _pico_printf( PICO_ERROR, "PicoLoadModel: Failed loading model %s", fileName ); return NULL; } /* get ptr to list of supported modules */ modules = PicoModuleList( NULL ); /* run it through the various loader functions and try */ /* to find a loader that fits the given file data */ for( ; *modules != NULL; modules++ ) { /* get module */ pm = *modules; /* sanity check */ if( pm == NULL) break; /* module must be able to load */ if( pm->canload == NULL || pm->load == NULL ) continue; model = PicoModuleLoadModel(pm, fileName, buffer, bufSize, frameNum); if(model != NULL) { /* model was loaded, so break out of loop */ break; } } /* free memory used by file buffer */ if( buffer) _pico_free_file( buffer ); /* return */ return model; } picoModel_t *PicoModuleLoadModelStream( const picoModule_t* module, void* inputStream, PicoInputStreamReadFunc inputStreamRead, size_t streamLength, int frameNum ) { picoModel_t *model; picoByte_t *buffer; int bufSize; /* init */ model = NULL; if( inputStream == NULL ) { _pico_printf( PICO_ERROR, "PicoLoadModel: invalid input stream (inputStream == NULL)" ); return NULL; } if( inputStreamRead == NULL ) { _pico_printf( PICO_ERROR, "PicoLoadModel: invalid input stream (inputStreamRead == NULL)" ); return NULL; } buffer = _pico_alloc(streamLength + 1); bufSize = (int)inputStreamRead(inputStream, buffer, streamLength); buffer[bufSize] = '\0'; { // dummy filename char fileName[128]; fileName[0] = '.'; strncpy(fileName + 1, module->defaultExts[0], 126); fileName[127] = '\0'; model = PicoModuleLoadModel(module, fileName, buffer, bufSize, frameNum); } if(model != 0) { _pico_free(buffer); } /* return */ return model; } /* ---------------------------------------------------------------------------- models ---------------------------------------------------------------------------- */ /* PicoNewModel() creates a new pico model */ picoModel_t *PicoNewModel( void ) { picoModel_t *model; /* allocate */ model = _pico_alloc( sizeof(picoModel_t) ); if( model == NULL ) return NULL; /* clear */ memset( model,0,sizeof(picoModel_t) ); /* model set up */ _pico_zero_bounds( model->mins,model->maxs ); /* set initial frame count to 1 -sea */ model->numFrames = 1; /* return ptr to new model */ return model; } /* PicoFreeModel() frees a model and all associated data */ void PicoFreeModel( picoModel_t *model ) { int i; /* sanity check */ if( model == NULL ) return; /* free bits */ if( model->name ) _pico_free( model->name ); if( model->fileName ) _pico_free( model->fileName ); /* free shaders */ for( i = 0; i < model->numShaders; i++ ) PicoFreeShader( model->shader[ i ] ); free( model->shader ); /* free surfaces */ for( i = 0; i < model->numSurfaces; i++ ) PicoFreeSurface( model->surface[ i ] ); free( model->surface ); /* free the model */ _pico_free( model ); } /* PicoAdjustModel() adjusts a models's memory allocations to handle the requested sizes. will always grow, never shrink */ int PicoAdjustModel( picoModel_t *model, int numShaders, int numSurfaces ) { /* dummy check */ if( model == NULL ) return 0; /* bare minimums */ /* sea: null surface/shader fix (1s=>0s) */ if( numShaders < 0 ) numShaders = 0; if( numSurfaces < 0 ) numSurfaces = 0; /* additional shaders? */ while( numShaders > model->maxShaders ) { model->maxShaders += PICO_GROW_SHADERS; if( !_pico_realloc( (void *) &model->shader, model->numShaders * sizeof( *model->shader ), model->maxShaders * sizeof( *model->shader ) ) ) return 0; } /* set shader count to higher */ if( numShaders > model->numShaders ) model->numShaders = numShaders; /* additional surfaces? */ while( numSurfaces > model->maxSurfaces ) { model->maxSurfaces += PICO_GROW_SURFACES; if( !_pico_realloc( (void *) &model->surface, model->numSurfaces * sizeof( *model->surface ), model->maxSurfaces * sizeof( *model->surface ) ) ) return 0; } /* set shader count to higher */ if( numSurfaces > model->numSurfaces ) model->numSurfaces = numSurfaces; /* return ok */ return 1; } /* ---------------------------------------------------------------------------- shaders ---------------------------------------------------------------------------- */ /* PicoNewShader() creates a new pico shader and returns its index. -sea */ picoShader_t *PicoNewShader( picoModel_t *model ) { picoShader_t *shader; /* allocate and clear */ shader = _pico_alloc( sizeof(picoShader_t) ); if( shader == NULL ) return NULL; memset( shader, 0, sizeof(picoShader_t) ); /* attach it to the model */ if( model != NULL ) { /* adjust model */ if( !PicoAdjustModel( model, model->numShaders + 1, 0 ) ) { _pico_free( shader ); return NULL; } /* attach */ model->shader[ model->numShaders - 1 ] = shader; shader->model = model; } /* setup default shader colors */ _pico_set_color( shader->ambientColor,0,0,0,0 ); _pico_set_color( shader->diffuseColor,255,255,255,1 ); _pico_set_color( shader->specularColor,0,0,0,0 ); /* no need to do this, but i do it anyway */ shader->transparency = 0; shader->shininess = 0; /* return the newly created shader */ return shader; } /* PicoFreeShader() frees a shader and all associated data -sea */ void PicoFreeShader( picoShader_t *shader ) { /* dummy check */ if( shader == NULL ) return; /* free bits */ if( shader->name ) _pico_free( shader->name ); if( shader->mapName ) _pico_free( shader->mapName ); /* free the shader */ _pico_free( shader ); } /* PicoFindShader() finds a named shader in a model */ picoShader_t *PicoFindShader( picoModel_t *model, char *name, int caseSensitive ) { int i; /* sanity checks */ if( model == NULL || name == NULL ) /* sea: null name fix */ return NULL; /* walk list */ for( i = 0; i < model->numShaders; i++ ) { /* skip null shaders or shaders with null names */ if( model->shader[ i ] == NULL || model->shader[ i ]->name == NULL ) continue; /* compare the shader name with name we're looking for */ if( caseSensitive ) { if( !strcmp( name, model->shader[ i ]->name ) ) return model->shader[ i ]; } else if( !_pico_stricmp( name, model->shader[ i ]->name ) ) return model->shader[ i ]; } /* named shader not found */ return NULL; } /* ---------------------------------------------------------------------------- surfaces ---------------------------------------------------------------------------- */ /* PicoNewSurface() creates a new pico surface */ picoSurface_t *PicoNewSurface( picoModel_t *model ) { picoSurface_t *surface; char surfaceName[64]; /* allocate and clear */ surface = _pico_alloc( sizeof( *surface ) ); if( surface == NULL ) return NULL; memset( surface, 0, sizeof( *surface ) ); /* attach it to the model */ if( model != NULL ) { /* adjust model */ if( !PicoAdjustModel( model, 0, model->numSurfaces + 1 ) ) { _pico_free( surface ); return NULL; } /* attach */ model->surface[ model->numSurfaces - 1 ] = surface; surface->model = model; /* set default name */ sprintf( surfaceName, "Unnamed_%d", model->numSurfaces ); PicoSetSurfaceName( surface, surfaceName ); } /* return */ return surface; } /* PicoFreeSurface() frees a surface and all associated data */ void PicoFreeSurface( picoSurface_t *surface ) { int i; /* dummy check */ if( surface == NULL ) return; /* free bits */ _pico_free( surface->xyz ); _pico_free( surface->normal ); _pico_free( surface->smoothingGroup ); _pico_free( surface->index ); _pico_free( surface->faceNormal ); if( surface->name ) _pico_free( surface->name ); /* free arrays */ for( i = 0; i < surface->numSTArrays; i++ ) _pico_free( surface->st[ i ] ); free( surface->st ); for( i = 0; i < surface->numColorArrays; i++ ) _pico_free( surface->color[ i ] ); free( surface->color ); /* free the surface */ _pico_free( surface ); } /* PicoAdjustSurface() adjusts a surface's memory allocations to handle the requested sizes. will always grow, never shrink */ int PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, int numColorArrays, int numIndexes, int numFaceNormals ) { int i; /* dummy check */ if( surface == NULL ) return 0; /* bare minimums */ if( numVertexes < 1 ) numVertexes = 1; if( numSTArrays < 1 ) numSTArrays = 1; if( numColorArrays < 1 ) numColorArrays = 1; if( numIndexes < 1 ) numIndexes = 1; /* additional vertexes? */ while( numVertexes > surface->maxVertexes ) /* fix */ { surface->maxVertexes += PICO_GROW_VERTEXES; if( !_pico_realloc( (void *) &surface->xyz, surface->numVertexes * sizeof( *surface->xyz ), surface->maxVertexes * sizeof( *surface->xyz ) ) ) return 0; if( !_pico_realloc( (void *) &surface->normal, surface->numVertexes * sizeof( *surface->normal ), surface->maxVertexes * sizeof( *surface->normal ) ) ) return 0; if( !_pico_realloc( (void *) &surface->smoothingGroup, surface->numVertexes * sizeof( *surface->smoothingGroup ), surface->maxVertexes * sizeof( *surface->smoothingGroup ) ) ) return 0; for( i = 0; i < surface->numSTArrays; i++ ) if( !_pico_realloc( (void*) &surface->st[ i ], surface->numVertexes * sizeof( *surface->st[ i ] ), surface->maxVertexes * sizeof( *surface->st[ i ] ) ) ) return 0; for( i = 0; i < surface->numColorArrays; i++ ) if( !_pico_realloc( (void*) &surface->color[ i ], surface->numVertexes * sizeof( *surface->color[ i ] ), surface->maxVertexes * sizeof( *surface->color[ i ] ) ) ) return 0; } /* set vertex count to higher */ if( numVertexes > surface->numVertexes ) surface->numVertexes = numVertexes; /* additional st arrays? */ while( numSTArrays > surface->maxSTArrays ) /* fix */ { surface->maxSTArrays += PICO_GROW_ARRAYS; if( !_pico_realloc( (void*) &surface->st, surface->numSTArrays * sizeof( *surface->st ), surface->maxSTArrays * sizeof( *surface->st ) ) ) return 0; while( surface->numSTArrays < numSTArrays ) { surface->st[ surface->numSTArrays ] = _pico_alloc( surface->maxVertexes * sizeof( *surface->st[ 0 ] ) ); memset( surface->st[ surface->numSTArrays ], 0, surface->maxVertexes * sizeof( *surface->st[ 0 ] ) ); surface->numSTArrays++; } } /* additional color arrays? */ while( numColorArrays > surface->maxColorArrays ) /* fix */ { surface->maxColorArrays += PICO_GROW_ARRAYS; if( !_pico_realloc( (void*) &surface->color, surface->numColorArrays * sizeof( *surface->color ), surface->maxColorArrays * sizeof( *surface->color ) ) ) return 0; while( surface->numColorArrays < numColorArrays ) { surface->color[ surface->numColorArrays ] = _pico_alloc( surface->maxVertexes * sizeof( *surface->color[ 0 ] ) ); memset( surface->color[ surface->numColorArrays ], 0, surface->maxVertexes * sizeof( *surface->color[ 0 ] ) ); surface->numColorArrays++; } } /* additional indexes? */ while( numIndexes > surface->maxIndexes ) /* fix */ { surface->maxIndexes += PICO_GROW_INDEXES; if( !_pico_realloc( (void*) &surface->index, surface->numIndexes * sizeof( *surface->index ), surface->maxIndexes * sizeof( *surface->index ) ) ) return 0; } /* set index count to higher */ if( numIndexes > surface->numIndexes ) surface->numIndexes = numIndexes; /* additional face normals? */ while( numFaceNormals > surface->maxFaceNormals ) /* fix */ { surface->maxFaceNormals += PICO_GROW_FACES; if( !_pico_realloc( (void *) &surface->faceNormal, surface->numFaceNormals * sizeof( *surface->faceNormal ), surface->maxFaceNormals * sizeof( *surface->faceNormal ) ) ) return 0; } /* set face normal count to higher */ if( numFaceNormals > surface->numFaceNormals ) surface->numFaceNormals = numFaceNormals; /* return ok */ return 1; } /* PicoFindSurface: * Finds first matching named surface in a model. */ picoSurface_t *PicoFindSurface( picoModel_t *model, char *name, int caseSensitive ) { int i; /* sanity check */ if( model == NULL || name == NULL ) return NULL; /* walk list */ for( i = 0; i < model->numSurfaces; i++ ) { /* skip null surfaces or surfaces with null names */ if( model->surface[ i ] == NULL || model->surface[ i ]->name == NULL ) continue; /* compare the surface name with name we're looking for */ if (caseSensitive) { if( !strcmp(name,model->surface[ i ]->name) ) return model->surface[ i ]; } else { if( !_pico_stricmp(name,model->surface[ i ]->name) ) return model->surface[ i ]; } } /* named surface not found */ return NULL; } /*---------------------------------------------------------------------------- PicoSet*() Setter Functions ----------------------------------------------------------------------------*/ void PicoSetModelName( picoModel_t *model, char *name ) { if( model == NULL || name == NULL ) return; if( model->name != NULL ) _pico_free( model->name ); model->name = _pico_clone_alloc( name ); } void PicoSetModelFileName( picoModel_t *model, char *fileName ) { if( model == NULL || fileName == NULL ) return; if( model->fileName != NULL ) _pico_free( model->fileName ); model->fileName = _pico_clone_alloc( fileName ); } void PicoSetModelFrameNum( picoModel_t *model, int frameNum ) { if( model == NULL ) return; model->frameNum = frameNum; } void PicoSetModelNumFrames( picoModel_t *model, int numFrames ) { if( model == NULL ) return; model->numFrames = numFrames; } void PicoSetModelData( picoModel_t *model, void *data ) { if( model == NULL ) return; model->data = data; } void PicoSetShaderName( picoShader_t *shader, char *name ) { if( shader == NULL || name == NULL ) return; if( shader->name != NULL ) _pico_free( shader->name ); shader->name = _pico_clone_alloc( name ); } void PicoSetShaderMapName( picoShader_t *shader, char *mapName ) { if( shader == NULL || mapName == NULL ) return; if( shader->mapName != NULL ) _pico_free( shader->mapName ); shader->mapName = _pico_clone_alloc( mapName ); } void PicoSetShaderAmbientColor( picoShader_t *shader, picoColor_t color ) { if( shader == NULL || color == NULL ) return; shader->ambientColor[ 0 ] = color[ 0 ]; shader->ambientColor[ 1 ] = color[ 1 ]; shader->ambientColor[ 2 ] = color[ 2 ]; shader->ambientColor[ 3 ] = color[ 3 ]; } void PicoSetShaderDiffuseColor( picoShader_t *shader, picoColor_t color ) { if( shader == NULL || color == NULL ) return; shader->diffuseColor[ 0 ] = color[ 0 ]; shader->diffuseColor[ 1 ] = color[ 1 ]; shader->diffuseColor[ 2 ] = color[ 2 ]; shader->diffuseColor[ 3 ] = color[ 3 ]; } void PicoSetShaderSpecularColor( picoShader_t *shader, picoColor_t color ) { if( shader == NULL || color == NULL ) return; shader->specularColor[ 0 ] = color[ 0 ]; shader->specularColor[ 1 ] = color[ 1 ]; shader->specularColor[ 2 ] = color[ 2 ]; shader->specularColor[ 3 ] = color[ 3 ]; } void PicoSetShaderTransparency( picoShader_t *shader, float value ) { if( shader == NULL ) return; shader->transparency = value; /* cap to 0..1 range */ if (shader->transparency < 0.0) shader->transparency = 0.0; if (shader->transparency > 1.0) shader->transparency = 1.0; } void PicoSetShaderShininess( picoShader_t *shader, float value ) { if( shader == NULL ) return; shader->shininess = value; /* cap to 0..127 range */ if (shader->shininess < 0.0) shader->shininess = 0.0; if (shader->shininess > 127.0) shader->shininess = 127.0; } void PicoSetSurfaceData( picoSurface_t *surface, void *data ) { if( surface == NULL ) return; surface->data = data; } void PicoSetSurfaceType( picoSurface_t *surface, picoSurfaceType_t type ) { if( surface == NULL ) return; surface->type = type; } void PicoSetSurfaceName( picoSurface_t *surface, char *name ) { if( surface == NULL || name == NULL ) return; if( surface->name != NULL ) _pico_free( surface->name ); surface->name = _pico_clone_alloc( name ); } void PicoSetSurfaceShader( picoSurface_t *surface, picoShader_t *shader ) { if( surface == NULL ) return; surface->shader = shader; } void PicoSetSurfaceXYZ( picoSurface_t *surface, int num, picoVec3_t xyz ) { if( surface == NULL || num < 0 || xyz == NULL ) return; if( !PicoAdjustSurface( surface, num + 1, 0, 0, 0, 0 ) ) return; _pico_copy_vec( xyz, surface->xyz[ num ] ); if( surface->model != NULL ) _pico_expand_bounds( xyz, surface->model->mins, surface->model->maxs ); } void PicoSetSurfaceNormal( picoSurface_t *surface, int num, picoVec3_t normal ) { if( surface == NULL || num < 0 || normal == NULL ) return; if( !PicoAdjustSurface( surface, num + 1, 0, 0, 0, 0 ) ) return; _pico_copy_vec( normal, surface->normal[ num ] ); } void PicoSetSurfaceST( picoSurface_t *surface, int array, int num, picoVec2_t st ) { if( surface == NULL || num < 0 || st == NULL ) return; if( !PicoAdjustSurface( surface, num + 1, array + 1, 0, 0, 0 ) ) return; surface->st[ array ][ num ][ 0 ] = st[ 0 ]; surface->st[ array ][ num ][ 1 ] = st[ 1 ]; } void PicoSetSurfaceColor( picoSurface_t *surface, int array, int num, picoColor_t color ) { if( surface == NULL || num < 0 || color == NULL ) return; if( !PicoAdjustSurface( surface, num + 1, 0, array + 1, 0, 0 ) ) return; surface->color[ array ][ num ][ 0 ] = color[ 0 ]; surface->color[ array ][ num ][ 1 ] = color[ 1 ]; surface->color[ array ][ num ][ 2 ] = color[ 2 ]; surface->color[ array ][ num ][ 3 ] = color[ 3 ]; } void PicoSetSurfaceIndex( picoSurface_t *surface, int num, picoIndex_t index ) { if( surface == NULL || num < 0 ) return; if( !PicoAdjustSurface( surface, 0, 0, 0, num + 1, 0 ) ) return; surface->index[ num ] = index; } void PicoSetSurfaceIndexes( picoSurface_t *surface, int num, picoIndex_t *index, int count ) { if( num < 0 || index == NULL || count < 1 ) return; if( !PicoAdjustSurface( surface, 0, 0, 0, num + count, 0 ) ) return; memcpy( &surface->index[ num ], index, count * sizeof( surface->index[ num ] ) ); } void PicoSetFaceNormal( picoSurface_t *surface, int num, picoVec3_t normal ) { if( surface == NULL || num < 0 || normal == NULL ) return; if( !PicoAdjustSurface( surface, 0, 0, 0, 0, num + 1 ) ) return; _pico_copy_vec( normal, surface->faceNormal[ num ] ); } void PicoSetSurfaceSmoothingGroup( picoSurface_t *surface, int num, picoIndex_t smoothingGroup ) { if( num < 0 ) return; if( !PicoAdjustSurface( surface, num + 1, 0, 0, 0, 0 ) ) return; surface->smoothingGroup[ num ] = smoothingGroup; } void PicoSetSurfaceSpecial( picoSurface_t *surface, int num, int special ) { if( surface == NULL || num < 0 || num >= PICO_MAX_SPECIAL ) return; surface->special[ num ] = special; } /*---------------------------------------------------------------------------- PicoGet*() Getter Functions ----------------------------------------------------------------------------*/ char *PicoGetModelName( picoModel_t *model ) { if( model == NULL ) return NULL; if( model->name == NULL) return (char*) ""; return model->name; } char *PicoGetModelFileName( picoModel_t *model ) { if( model == NULL ) return NULL; if( model->fileName == NULL) return (char*) ""; return model->fileName; } int PicoGetModelFrameNum( picoModel_t *model ) { if( model == NULL ) return 0; return model->frameNum; } int PicoGetModelNumFrames( picoModel_t *model ) { if( model == NULL ) return 0; return model->numFrames; } void *PicoGetModelData( picoModel_t *model ) { if( model == NULL ) return NULL; return model->data; } int PicoGetModelNumShaders( picoModel_t *model ) { if( model == NULL ) return 0; return model->numShaders; } picoShader_t *PicoGetModelShader( picoModel_t *model, int num ) { /* a few sanity checks */ if( model == NULL ) return NULL; if( model->shader == NULL) return NULL; if( num < 0 || num >= model->numShaders ) return NULL; /* return the shader */ return model->shader[ num ]; } int PicoGetModelNumSurfaces( picoModel_t *model ) { if( model == NULL ) return 0; return model->numSurfaces; } picoSurface_t *PicoGetModelSurface( picoModel_t *model, int num ) { /* a few sanity checks */ if( model == NULL ) return NULL; if( model->surface == NULL) return NULL; if( num < 0 || num >= model->numSurfaces ) return NULL; /* return the surface */ return model->surface[ num ]; } int PicoGetModelTotalVertexes( picoModel_t *model ) { int i, count; if( model == NULL ) return 0; if( model->surface == NULL ) return 0; count = 0; for( i = 0; i < model->numSurfaces; i++ ) count += PicoGetSurfaceNumVertexes( model->surface[ i ] ); return count; } int PicoGetModelTotalIndexes( picoModel_t *model ) { int i, count; if( model == NULL ) return 0; if( model->surface == NULL ) return 0; count = 0; for( i = 0; i < model->numSurfaces; i++ ) count += PicoGetSurfaceNumIndexes( model->surface[ i ] ); return count; } char *PicoGetShaderName( picoShader_t *shader ) { if( shader == NULL ) return NULL; if( shader->name == NULL) return (char*) ""; return shader->name; } char *PicoGetShaderMapName( picoShader_t *shader ) { if( shader == NULL ) return NULL; if( shader->mapName == NULL) return (char*) ""; return shader->mapName; } picoByte_t *PicoGetShaderAmbientColor( picoShader_t *shader ) { if( shader == NULL ) return NULL; return shader->ambientColor; } picoByte_t *PicoGetShaderDiffuseColor( picoShader_t *shader ) { if( shader == NULL ) return NULL; return shader->diffuseColor; } picoByte_t *PicoGetShaderSpecularColor( picoShader_t *shader ) { if( shader == NULL ) return NULL; return shader->specularColor; } float PicoGetShaderTransparency( picoShader_t *shader ) { if( shader == NULL ) return 0.0f; return shader->transparency; } float PicoGetShaderShininess( picoShader_t *shader ) { if( shader == NULL ) return 0.0f; return shader->shininess; } void *PicoGetSurfaceData( picoSurface_t *surface ) { if( surface == NULL ) return NULL; return surface->data; } picoSurfaceType_t PicoGetSurfaceType( picoSurface_t *surface ) { if( surface == NULL ) return PICO_BAD; return surface->type; } char *PicoGetSurfaceName( picoSurface_t *surface ) { if( surface == NULL ) return NULL; if( surface->name == NULL ) return (char*) ""; return surface->name; } picoShader_t *PicoGetSurfaceShader( picoSurface_t *surface ) { if( surface == NULL ) return NULL; return surface->shader; } int PicoGetSurfaceNumVertexes( picoSurface_t *surface ) { if( surface == NULL ) return 0; return surface->numVertexes; } picoVec_t *PicoGetSurfaceXYZ( picoSurface_t *surface, int num ) { if( surface == NULL || num < 0 || num > surface->numVertexes ) return NULL; return surface->xyz[ num ]; } picoVec_t *PicoGetSurfaceNormal( picoSurface_t *surface, int num ) { if( surface == NULL || num < 0 || num > surface->numVertexes ) return NULL; return surface->normal[ num ]; } picoVec_t *PicoGetSurfaceST( picoSurface_t *surface, int array, int num ) { if( surface == NULL || array < 0 || array > surface->numSTArrays || num < 0 || num > surface->numVertexes ) return NULL; return surface->st[ array ][ num ]; } picoByte_t *PicoGetSurfaceColor( picoSurface_t *surface, int array, int num ) { if( surface == NULL || array < 0 || array > surface->numColorArrays || num < 0 || num > surface->numVertexes ) return NULL; return surface->color[ array ][ num ]; } int PicoGetSurfaceNumIndexes( picoSurface_t *surface ) { if( surface == NULL ) return 0; return surface->numIndexes; } picoIndex_t PicoGetSurfaceIndex( picoSurface_t *surface, int num ) { if( surface == NULL || num < 0 || num > surface->numIndexes ) return 0; return surface->index[ num ]; } picoIndex_t *PicoGetSurfaceIndexes( picoSurface_t *surface, int num ) { if( surface == NULL || num < 0 || num > surface->numIndexes ) return NULL; return &surface->index[ num ]; } picoVec_t *PicoGetFaceNormal( picoSurface_t *surface, int num ) { if( surface == NULL || num < 0 || num > surface->numFaceNormals ) return NULL; return surface->faceNormal[ num ]; } picoIndex_t PicoGetSurfaceSmoothingGroup( picoSurface_t *surface, int num ) { if( surface == NULL || num < 0 || num > surface->numVertexes ) return -1; return surface->smoothingGroup[ num ]; } int PicoGetSurfaceSpecial( picoSurface_t *surface, int num ) { if( surface == NULL || num < 0 || num >= PICO_MAX_SPECIAL ) return 0; return surface->special[ num ]; } /* ---------------------------------------------------------------------------- hashtable related functions ---------------------------------------------------------------------------- */ /* hashtable code for faster vertex lookups */ //#define HASHTABLE_SIZE 32768 // 2048 /* power of 2, use & */ #define HASHTABLE_SIZE 7919 // 32749 // 2039 /* prime, use % */ int PicoGetHashTableSize( void ) { return HASHTABLE_SIZE; } #define HASH_USE_EPSILON #ifdef HASH_USE_EPSILON #define HASH_XYZ_EPSILON 0.01f #define HASH_XYZ_EPSILONSPACE_MULTIPLIER 1.f / HASH_XYZ_EPSILON #define HASH_ST_EPSILON 0.0001f #define HASH_NORMAL_EPSILON 0.02f #endif unsigned int PicoVertexCoordGenerateHash( picoVec3_t xyz ) { unsigned int hash = 0; #ifndef HASH_USE_EPSILON hash += ~(*((unsigned int*) &xyz[ 0 ]) << 15); hash ^= (*((unsigned int*) &xyz[ 0 ]) >> 10); hash += (*((unsigned int*) &xyz[ 1 ]) << 3); hash ^= (*((unsigned int*) &xyz[ 1 ]) >> 6); hash += ~(*((unsigned int*) &xyz[ 2 ]) << 11); hash ^= (*((unsigned int*) &xyz[ 2 ]) >> 16); #else picoVec3_t xyz_epsilonspace; _pico_scale_vec( xyz, HASH_XYZ_EPSILONSPACE_MULTIPLIER, xyz_epsilonspace ); xyz_epsilonspace[ 0 ] = (double)floor(xyz_epsilonspace[ 0 ]); xyz_epsilonspace[ 1 ] = (double)floor(xyz_epsilonspace[ 1 ]); xyz_epsilonspace[ 2 ] = (double)floor(xyz_epsilonspace[ 2 ]); hash += ~(*((unsigned int*) &xyz_epsilonspace[ 0 ]) << 15); hash ^= (*((unsigned int*) &xyz_epsilonspace[ 0 ]) >> 10); hash += (*((unsigned int*) &xyz_epsilonspace[ 1 ]) << 3); hash ^= (*((unsigned int*) &xyz_epsilonspace[ 1 ]) >> 6); hash += ~(*((unsigned int*) &xyz_epsilonspace[ 2 ]) << 11); hash ^= (*((unsigned int*) &xyz_epsilonspace[ 2 ]) >> 16); #endif //hash = hash & (HASHTABLE_SIZE-1); hash = hash % (HASHTABLE_SIZE); return hash; } picoVertexCombinationHash_t **PicoNewVertexCombinationHashTable( void ) { picoVertexCombinationHash_t **hashTable = _pico_alloc( HASHTABLE_SIZE * sizeof(picoVertexCombinationHash_t*) ); memset( hashTable, 0, HASHTABLE_SIZE * sizeof(picoVertexCombinationHash_t*) ); return hashTable; } void PicoFreeVertexCombinationHashTable( picoVertexCombinationHash_t **hashTable ) { int i; picoVertexCombinationHash_t *vertexCombinationHash; picoVertexCombinationHash_t *nextVertexCombinationHash; /* dummy check */ if (hashTable == NULL) return; for( i = 0; i < HASHTABLE_SIZE; i++ ) { if (hashTable[ i ]) { nextVertexCombinationHash = NULL; for( vertexCombinationHash = hashTable[ i ]; vertexCombinationHash; vertexCombinationHash = nextVertexCombinationHash ) { nextVertexCombinationHash = vertexCombinationHash->next; if (vertexCombinationHash->data != NULL) { _pico_free( vertexCombinationHash->data ); } _pico_free( vertexCombinationHash ); } } } _pico_free( hashTable ); } picoVertexCombinationHash_t *PicoFindVertexCombinationInHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color ) { unsigned int hash; picoVertexCombinationHash_t *vertexCombinationHash; /* dumy check */ if (hashTable == NULL || xyz == NULL || normal == NULL || st == NULL || color == NULL ) return NULL; hash = PicoVertexCoordGenerateHash( xyz ); for( vertexCombinationHash = hashTable[ hash ]; vertexCombinationHash; vertexCombinationHash = vertexCombinationHash->next ) { #ifndef HASH_USE_EPSILON /* check xyz */ if( (vertexCombinationHash->vcd.xyz[ 0 ] != xyz[ 0 ] || vertexCombinationHash->vcd.xyz[ 1 ] != xyz[ 1 ] || vertexCombinationHash->vcd.xyz[ 2 ] != xyz[ 2 ]) ) continue; /* check normal */ if( (vertexCombinationHash->vcd.normal[ 0 ] != normal[ 0 ] || vertexCombinationHash->vcd.normal[ 1 ] != normal[ 1 ] || vertexCombinationHash->vcd.normal[ 2 ] != normal[ 2 ]) ) continue; /* check st */ if( vertexCombinationHash->vcd.st[ 0 ] != st[ 0 ] || vertexCombinationHash->vcd.st[ 1 ] != st[ 1 ] ) continue; #else /* check xyz */ if( ( fabs(xyz[ 0 ] - vertexCombinationHash->vcd.xyz[ 0 ]) ) > HASH_XYZ_EPSILON || ( fabs(xyz[ 1 ] - vertexCombinationHash->vcd.xyz[ 1 ]) ) > HASH_XYZ_EPSILON || ( fabs(xyz[ 2 ] - vertexCombinationHash->vcd.xyz[ 2 ]) ) > HASH_XYZ_EPSILON ) continue; /* check normal */ if( ( fabs(normal[ 0 ] - vertexCombinationHash->vcd.normal[ 0 ]) ) > HASH_NORMAL_EPSILON || ( fabs(normal[ 1 ] - vertexCombinationHash->vcd.normal[ 1 ]) ) > HASH_NORMAL_EPSILON || ( fabs(normal[ 2 ] - vertexCombinationHash->vcd.normal[ 2 ]) ) > HASH_NORMAL_EPSILON ) continue; /* check st */ if( ( fabs(st[ 0 ] - vertexCombinationHash->vcd.st[ 0 ]) ) > HASH_ST_EPSILON || ( fabs(st[ 1 ] - vertexCombinationHash->vcd.st[ 1 ]) ) > HASH_ST_EPSILON ) continue; #endif /* check color */ if( *((int*) vertexCombinationHash->vcd.color) != *((int*) color) ) continue; /* gotcha */ return vertexCombinationHash; } return NULL; } picoVertexCombinationHash_t *PicoAddVertexCombinationToHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color, picoIndex_t index ) { unsigned int hash; picoVertexCombinationHash_t *vertexCombinationHash; /* dumy check */ if (hashTable == NULL || xyz == NULL || normal == NULL || st == NULL || color == NULL ) return NULL; vertexCombinationHash = _pico_alloc( sizeof(picoVertexCombinationHash_t) ); if (!vertexCombinationHash) return NULL; hash = PicoVertexCoordGenerateHash( xyz ); _pico_copy_vec( xyz, vertexCombinationHash->vcd.xyz ); _pico_copy_vec( normal, vertexCombinationHash->vcd.normal ); _pico_copy_vec2( st, vertexCombinationHash->vcd.st ); _pico_copy_color( color, vertexCombinationHash->vcd.color ); vertexCombinationHash->index = index; vertexCombinationHash->data = NULL; vertexCombinationHash->next = hashTable[ hash ]; hashTable[ hash ] = vertexCombinationHash; return vertexCombinationHash; } /* ---------------------------------------------------------------------------- specialized routines ---------------------------------------------------------------------------- */ /* PicoFindSurfaceVertex() finds a vertex matching the set parameters fixme: needs non-naive algorithm */ int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t normal, int numSTs, picoVec2_t *st, int numColors, picoColor_t *color, picoIndex_t smoothingGroup) { int i, j; /* dummy check */ if( surface == NULL || surface->numVertexes <= 0 ) return -1; /* walk vertex list */ for( i = 0; i < surface->numVertexes; i++ ) { /* check xyz */ if( xyz != NULL && (surface->xyz[ i ][ 0 ] != xyz[ 0 ] || surface->xyz[ i ][ 1 ] != xyz[ 1 ] || surface->xyz[ i ][ 2 ] != xyz[ 2 ]) ) continue; /* check normal */ if( normal != NULL && (surface->normal[ i ][ 0 ] != normal[ 0 ] || surface->normal[ i ][ 1 ] != normal[ 1 ] || surface->normal[ i ][ 2 ] != normal[ 2 ]) ) continue; /* check normal */ if( surface->smoothingGroup[ i ] != smoothingGroup ) continue; /* check st */ if( numSTs > 0 && st != NULL ) { for( j = 0; j < numSTs; j++ ) { if( surface->st[ j ][ i ][ 0 ] != st[ j ][ 0 ] || surface->st[ j ][ i ][ 1 ] != st[ j ][ 1 ] ) break; } if( j != numSTs ) continue; } /* check color */ if( numColors > 0 && color != NULL ) { for( j = 0; j < numSTs; j++ ) { if( *((int*) surface->color[ j ]) != *((int*) color[ j ]) ) break; } if( j != numColors ) continue; } /* vertex matches */ return i; } /* nada */ return -1; } typedef struct _IndexArray IndexArray; struct _IndexArray { picoIndex_t* data; picoIndex_t* last; }; void indexarray_push_back(IndexArray* self, picoIndex_t value) { *self->last++ = value; } size_t indexarray_size(IndexArray* self) { return self->last - self->data; } void indexarray_reserve(IndexArray* self, size_t size) { self->data = self->last = _pico_calloc(size, sizeof(picoIndex_t)); } void indexarray_clear(IndexArray* self) { _pico_free(self->data); } typedef struct _BinaryTreeNode BinaryTreeNode; struct _BinaryTreeNode { picoIndex_t left; picoIndex_t right; }; typedef struct _BinaryTree BinaryTree; struct _BinaryTree { BinaryTreeNode* data; BinaryTreeNode* last; }; void binarytree_extend(BinaryTree* self) { self->last->left = 0; self->last->right = 0; ++self->last; } size_t binarytree_size(BinaryTree* self) { return self->last - self->data; } void binarytree_reserve(BinaryTree* self, size_t size) { self->data = self->last = _pico_calloc(size, sizeof(BinaryTreeNode)); } void binarytree_clear(BinaryTree* self) { _pico_free(self->data); } typedef int (*LessFunc)(void*, picoIndex_t, picoIndex_t); typedef struct _UniqueIndices UniqueIndices; struct _UniqueIndices { BinaryTree tree; IndexArray indices; LessFunc lessFunc; void* lessData; }; size_t UniqueIndices_size(UniqueIndices* self) { return binarytree_size(&self->tree); } void UniqueIndices_reserve(UniqueIndices* self, size_t size) { binarytree_reserve(&self->tree, size); indexarray_reserve(&self->indices, size); } void UniqueIndices_init(UniqueIndices* self, LessFunc lessFunc, void* lessData) { self->lessFunc = lessFunc; self->lessData = lessData; } void UniqueIndices_destroy(UniqueIndices* self) { binarytree_clear(&self->tree); indexarray_clear(&self->indices); } picoIndex_t UniqueIndices_find_or_insert(UniqueIndices* self, picoIndex_t value) { picoIndex_t index = 0; for(;;) { if(self->lessFunc(self->lessData, value, self->indices.data[index])) { BinaryTreeNode* node = self->tree.data + index; if(node->left != 0) { index = node->left; continue; } else { node->left = (picoIndex_t)binarytree_size(&self->tree); binarytree_extend(&self->tree); indexarray_push_back(&self->indices, value); return node->left; } } if(self->lessFunc(self->lessData, self->indices.data[index], value)) { BinaryTreeNode* node = self->tree.data + index; if(node->right != 0) { index = node->right; continue; } else { node->right = (picoIndex_t)binarytree_size(&self->tree); binarytree_extend(&self->tree); indexarray_push_back(&self->indices, value); return node->right; } } return index; } } picoIndex_t UniqueIndices_insert(UniqueIndices* self, picoIndex_t value) { if(self->tree.data == self->tree.last) { binarytree_extend(&self->tree); indexarray_push_back(&self->indices, value); return 0; } else { return UniqueIndices_find_or_insert(self, value); } } typedef struct picoSmoothVertices_s picoSmoothVertices_t; struct picoSmoothVertices_s { picoVec3_t* xyz; picoIndex_t* smoothingGroups; }; int lessSmoothVertex(void* data, picoIndex_t first, picoIndex_t second) { picoSmoothVertices_t* smoothVertices = data; if(smoothVertices->xyz[first][0] != smoothVertices->xyz[second][0]) { return smoothVertices->xyz[first][0] < smoothVertices->xyz[second][0]; } if(smoothVertices->xyz[first][1] != smoothVertices->xyz[second][1]) { return smoothVertices->xyz[first][1] < smoothVertices->xyz[second][1]; } if(smoothVertices->xyz[first][2] != smoothVertices->xyz[second][2]) { return smoothVertices->xyz[first][2] < smoothVertices->xyz[second][2]; } if(smoothVertices->smoothingGroups[first] != smoothVertices->smoothingGroups[second]) { return smoothVertices->smoothingGroups[first] < smoothVertices->smoothingGroups[second]; } return 0; } void _pico_vertices_combine_shared_normals(picoVec3_t* xyz, picoIndex_t* smoothingGroups, picoVec3_t* normals, picoIndex_t numVertices) { UniqueIndices vertices; IndexArray indices; picoSmoothVertices_t smoothVertices = { xyz, smoothingGroups }; UniqueIndices_init(&vertices, lessSmoothVertex, &smoothVertices); UniqueIndices_reserve(&vertices, numVertices); indexarray_reserve(&indices, numVertices); { picoIndex_t i = 0; for(; i < numVertices; ++i) { size_t size = UniqueIndices_size(&vertices); picoIndex_t index = UniqueIndices_insert(&vertices, i); if((size_t)index != size) { double* normal = normals[vertices.indices.data[index]]; _pico_add_vec(normal, normals[i], normal); } indexarray_push_back(&indices, index); } } { picoIndex_t maxIndex = 0; picoIndex_t* i = indices.data; for(; i != indices.last; ++i) { if(*i <= maxIndex) { _pico_copy_vec(normals[vertices.indices.data[*i]], normals[i - indices.data]); } else { maxIndex = *i; } } } UniqueIndices_destroy(&vertices); indexarray_clear(&indices); } typedef picoVec3_t* picoNormalIter_t; typedef picoIndex_t* picoIndexIter_t; #define THE_CROSSPRODUCTS_OF_ANY_PAIR_OF_EDGES_OF_A_GIVEN_TRIANGLE_ARE_EQUAL 1 void _pico_triangles_generate_weighted_normals(picoIndexIter_t first, picoIndexIter_t end, picoVec3_t* xyz, picoVec3_t* normals) { for(; first != end; first += 3) { #if (THE_CROSSPRODUCTS_OF_ANY_PAIR_OF_EDGES_OF_A_GIVEN_TRIANGLE_ARE_EQUAL) picoVec3_t weightedNormal; { double* a = xyz[*(first + 0)]; double* b = xyz[*(first + 1)]; double* c = xyz[*(first + 2)]; picoVec3_t ba, ca; _pico_subtract_vec( b, a, ba ); _pico_subtract_vec( c, a, ca ); _pico_cross_vec( ca, ba, weightedNormal ); } #endif { int j = 0; for(; j < 3; ++j) { double* normal = normals[*(first + j)]; #if (!THE_CROSSPRODUCTS_OF_ANY_PAIR_OF_EDGES_OF_A_GIVEN_TRIANGLE_ARE_EQUAL) picoVec3_t weightedNormal; { double* a = xyz[*(first + ((j + 0) % 3))]; double* b = xyz[*(first + ((j + 1) % 3))]; double* c = xyz[*(first + ((j + 2) % 3))]; picoVec3_t ba, ca; _pico_subtract_vec( b, a, ba ); _pico_subtract_vec( c, a, ca ); _pico_cross_vec( ca, ba, weightedNormal ); } #endif _pico_add_vec(weightedNormal, normal, normal); } } } } void _pico_normals_zero(picoNormalIter_t first, picoNormalIter_t last) { for(; first != last; ++first) { _pico_zero_vec(*first); } } void _pico_normals_normalize(picoNormalIter_t first, picoNormalIter_t last) { for(; first != last; ++first) { _pico_normalize_vec(*first); } } double _pico_length_vec( picoVec3_t vec ) { return sqrt( vec[ 0 ] * vec[ 0 ] + vec[ 1 ] * vec[ 1 ] + vec[ 2 ] * vec[ 2 ] ); } #define NORMAL_UNIT_LENGTH_EPSILON 0.01 #define FLOAT_EQUAL_EPSILON(f, other, epsilon) (fabs(f - other) < epsilon) int _pico_normal_is_unit_length(picoVec3_t normal) { return FLOAT_EQUAL_EPSILON(_pico_length_vec(normal), 1.0, NORMAL_UNIT_LENGTH_EPSILON); } int _pico_normal_within_tolerance(picoVec3_t normal, picoVec3_t other) { return _pico_dot_vec(normal, other) > 0.0f; } void _pico_normals_assign_generated_normals(picoNormalIter_t first, picoNormalIter_t last, picoNormalIter_t generated) { for(; first != last; ++first, ++generated) { if(!_pico_normal_is_unit_length(*first) || !_pico_normal_within_tolerance(*first, *generated)) { _pico_copy_vec(*generated, *first); } } } void PicoFixSurfaceNormals(picoSurface_t* surface) { picoVec3_t* normals = (picoVec3_t*)_pico_calloc(surface->numVertexes, sizeof(picoVec3_t)); _pico_normals_zero(normals, normals + surface->numVertexes); _pico_triangles_generate_weighted_normals(surface->index, surface->index + surface->numIndexes, surface->xyz, normals); _pico_vertices_combine_shared_normals(surface->xyz, surface->smoothingGroup, normals, surface->numVertexes); _pico_normals_normalize(normals, normals + surface->numVertexes); _pico_normals_assign_generated_normals(surface->normal, surface->normal + surface->numVertexes, normals); _pico_free(normals); } /* PicoRemapModel() - sea remaps model material/etc. information using the remappings contained in the given 'remapFile' (full path to the ascii file to open) returns 1 on success or 0 on error */ #define _prm_error_return \ { \ _pico_free_parser( p ); \ _pico_free_file( remapBuffer ); \ return 0; \ } int PicoRemapModel( picoModel_t *model, char *remapFile ) { picoParser_t *p; picoByte_t *remapBuffer; int remapBufSize; /* sanity checks */ if( model == NULL || remapFile == NULL ) return 0; /* load remap file contents */ _pico_load_file( remapFile,&remapBuffer,&remapBufSize ); /* check result */ if( remapBufSize == 0 ) return 1; /* file is empty: no error */ if( remapBufSize < 0 ) return 0; /* load failed: error */ /* create a new pico parser */ p = _pico_new_parser( remapBuffer, remapBufSize ); if (p == NULL) { /* ram is really cheap nowadays... */ _prm_error_return; } /* doo teh parse */ while( 1 ) { /* get next token in remap file */ if (!_pico_parse( p,1 )) break; /* skip over c++ style comment lines */ if (!_pico_stricmp(p->token,"//")) { _pico_parse_skip_rest( p ); continue; } /* block for quick material shader name remapping */ /* materials { "m" (=>|->|=) "s" } */ if( !_pico_stricmp(p->token, "materials" ) ) { int level = 1; /* check bracket */ if (!_pico_parse_check( p,1,"{" )) _prm_error_return; /* process assignments */ while( 1 ) { picoShader_t *shader; char *materialName; /* get material name */ if (_pico_parse( p,1 ) == NULL) break; if (!strlen(p->token)) continue; materialName = _pico_clone_alloc( p->token ); if (materialName == NULL) _prm_error_return; /* handle levels */ if (p->token[0] == '{') level++; if (p->token[0] == '}') level--; if (!level) break; /* get next token (assignment token or shader name) */ if (!_pico_parse( p,0 )) { _pico_free( materialName ); _prm_error_return; } /* skip assignment token (if present) */ if (!strcmp(p->token,"=>") || !strcmp(p->token,"->") || !strcmp(p->token,"=")) { /* simply grab the next token */ if (!_pico_parse( p,0 )) { _pico_free( materialName ); _prm_error_return; } } /* try to find material by name */ shader = PicoFindShader( model,materialName,0 ); /* we've found a material matching the name */ if (shader != NULL) { PicoSetShaderName( shader,p->token ); } /* free memory used by material name */ _pico_free( materialName ); /* skip rest */ _pico_parse_skip_rest( p ); } } /* block for detailed single material remappings */ /* materials[ "m" ] { key data... } */ else if (!_pico_stricmp(p->token,"materials[")) { picoShader_t *shader; char *tempMaterialName; int level = 1; /* get material name */ if (!_pico_parse( p,0 )) _prm_error_return; /* temporary copy of material name */ tempMaterialName = _pico_clone_alloc( p->token ); if (tempMaterialName == NULL) _prm_error_return; /* check square closing bracket */ if (!_pico_parse_check( p,0,"]" )) _prm_error_return; /* try to find material by name */ shader = PicoFindShader( model,tempMaterialName,0 ); /* free memory used by temporary material name */ _pico_free( tempMaterialName ); /* we haven't found a material matching the name */ /* so we simply skip the braced section now and */ /* continue parsing with the next main token */ if (shader == NULL) { _pico_parse_skip_braced( p ); continue; } /* check opening bracket */ if (!_pico_parse_check( p,1,"{" )) _prm_error_return; /* process material info keys */ while( 1 ) { /* get key name */ if (_pico_parse( p,1 ) == NULL) break; if (!strlen(p->token)) continue; /* handle levels */ if (p->token[0] == '{') level++; if (p->token[0] == '}') level--; if (!level) break; /* remap shader name */ if (!_pico_stricmp(p->token,"shader")) { if (!_pico_parse( p,0 )) _prm_error_return; PicoSetShaderName( shader,p->token ); } /* remap shader map name */ else if (!_pico_stricmp(p->token,"mapname")) { if (!_pico_parse( p,0 )) _prm_error_return; PicoSetShaderMapName( shader,p->token ); } /* remap shader's ambient color */ else if (!_pico_stricmp(p->token,"ambient")) { picoColor_t color; picoVec3_t v; /* get vector from parser */ if (!_pico_parse_vec( p,v )) _prm_error_return; /* store as color */ color[ 0 ] = (picoByte_t)v[ 0 ]; color[ 1 ] = (picoByte_t)v[ 1 ]; color[ 2 ] = (picoByte_t)v[ 2 ]; /* set new ambient color */ PicoSetShaderAmbientColor( shader,color ); } /* remap shader's diffuse color */ else if (!_pico_stricmp(p->token,"diffuse")) { picoColor_t color; picoVec3_t v; /* get vector from parser */ if (!_pico_parse_vec( p,v )) _prm_error_return; /* store as color */ color[ 0 ] = (picoByte_t)v[ 0 ]; color[ 1 ] = (picoByte_t)v[ 1 ]; color[ 2 ] = (picoByte_t)v[ 2 ]; /* set new ambient color */ PicoSetShaderDiffuseColor( shader,color ); } /* remap shader's specular color */ else if (!_pico_stricmp(p->token,"specular")) { picoColor_t color; picoVec3_t v; /* get vector from parser */ if (!_pico_parse_vec( p,v )) _prm_error_return; /* store as color */ color[ 0 ] = (picoByte_t)v[ 0 ]; color[ 1 ] = (picoByte_t)v[ 1 ]; color[ 2 ] = (picoByte_t)v[ 2 ]; /* set new ambient color */ PicoSetShaderSpecularColor( shader,color ); } /* skip rest */ _pico_parse_skip_rest( p ); } } /* end 'materials[' */ } /* free both parser and file buffer */ _pico_free_parser( p ); _pico_free_file( remapBuffer ); /* return with success */ return 1; } /* PicoAddTriangleToModel() - jhefty A nice way to add individual triangles to the model. Chooses an appropriate surface based on the shader, or adds a new surface if necessary */ void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** normals, int numSTs, picoVec2_t **st, int numColors, picoColor_t **colors, picoShader_t* shader, picoIndex_t* smoothingGroup ) { int i,j; int vertDataIndex; picoSurface_t* workSurface = NULL; /* see if a surface already has the shader */ for ( i = 0 ; i < model->numSurfaces ; i++ ) { workSurface = model->surface[i]; if ( workSurface->shader == shader ) { break; } } /* no surface uses this shader yet, so create a new surface */ if ( !workSurface || i >=model->numSurfaces ) { /* create a new surface in the model for the unique shader */ workSurface = PicoNewSurface(model); if ( !workSurface ) { _pico_printf ( PICO_ERROR , "Could not allocate a new surface!\n" ); return; } /* do surface setup */ PicoSetSurfaceType( workSurface, PICO_TRIANGLES ); PicoSetSurfaceName( workSurface, shader->name ); PicoSetSurfaceShader( workSurface, shader ); } /* add the triangle data to the surface */ for ( i = 0 ; i < 3 ; i++ ) { /* get the next free spot in the index array */ int newVertIndex = PicoGetSurfaceNumIndexes ( workSurface ); /* get the index of the vertex that we're going to store at newVertIndex */ vertDataIndex = PicoFindSurfaceVertexNum ( workSurface , *xyz[i] , *normals[i] , numSTs , st[i] , numColors , colors[i], smoothingGroup[i]); /* the vertex wasn't found, so create a new vertex in the pool from the data we have */ if ( vertDataIndex == -1 ) { /* find the next spot for a new vertex */ vertDataIndex = PicoGetSurfaceNumVertexes ( workSurface ); /* assign the data to it */ PicoSetSurfaceXYZ ( workSurface ,vertDataIndex , *xyz[i] ); PicoSetSurfaceNormal ( workSurface , vertDataIndex , *normals[i] ); /* make sure to copy over all available ST's and colors for the vertex */ for ( j = 0 ; j < numColors ; j++ ) { PicoSetSurfaceColor( workSurface , j , vertDataIndex , colors[i][j] ); } for ( j = 0 ; j < numSTs ; j++ ) { PicoSetSurfaceST ( workSurface , j , vertDataIndex , st[i][j] ); } PicoSetSurfaceSmoothingGroup ( workSurface , vertDataIndex , smoothingGroup[i] ); } /* add this vertex to the triangle */ PicoSetSurfaceIndex ( workSurface , newVertIndex , vertDataIndex ); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/picomodules.c������������������������������������������������������0000664�0000000�0000000�00000006151�12454246557�0021313�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #define PICOMODULES_C /* dependencies */ #include "picointernal.h" /* external modules */ extern const picoModule_t picoModuleMD3; extern const picoModule_t picoModule3DS; extern const picoModule_t picoModuleASE; extern const picoModule_t picoModuleOBJ; extern const picoModule_t picoModuleMS3D; extern const picoModule_t picoModuleMDC; extern const picoModule_t picoModuleMD2; extern const picoModule_t picoModuleFM; extern const picoModule_t picoModuleLWO; extern const picoModule_t picoModuleTerrain; /* list of all supported file format modules */ const picoModule_t *picoModules[] = { &picoModuleMD3, /* quake3 arena md3 */ &picoModule3DS, /* autodesk 3ds */ &picoModuleASE, /* autodesk ase */ &picoModuleMS3D, /* milkshape3d */ &picoModuleMDC, /* return to castle wolfenstein mdc */ &picoModuleMD2, /* quake2 md2 */ &picoModuleFM, /* heretic2 fm */ &picoModuleLWO, /* lightwave object */ &picoModuleTerrain, /* picoterrain object */ &picoModuleOBJ, /* wavefront object */ NULL /* arnold */ }; /* PicoModuleList() returns a pointer to the module list and optionally stores the number of supported modules in 'numModules'. Note that this param can be NULL when the count is not needed. */ const picoModule_t **PicoModuleList( int *numModules ) { /* get module count */ if( numModules != NULL ) for( (*numModules) = 0; picoModules[ *numModules ] != NULL; (*numModules)++ ); /* return list of modules */ return (const picoModule_t**) picoModules; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/pm_3ds.c�����������������������������������������������������������0000664�0000000�0000000�00000047544�12454246557�0020170�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #define PM_3DS_C /* dependencies */ #include "picointernal.h" /* ydnar */ static picoColor_t white = { 255,255,255,255 }; /* remarks: * - 3ds file version is stored in pico special field 0 on load (ydnar: removed) * todo: * - sometimes there is one unnamed surface 0 having 0 verts as * well as 0 faces. this error occurs since pm 0.6 (ydnar?) */ /* uncomment when debugging this module */ /* #define DEBUG_PM_3DS #define DEBUG_PM_3DS_EX */ /* structure holding persistent 3ds loader specific data used */ /* to store formerly static vars to keep the module reentrant */ /* safe. put everything that needs to be static in here. */ typedef struct S3dsLoaderPers { picoModel_t *model; /* ptr to output model */ picoSurface_t *surface; /* ptr to current surface */ picoShader_t *shader; /* ptr to current shader */ picoByte_t *bufptr; /* ptr to raw data */ char *basename; /* ptr to model base name (eg. jeep) */ int cofs; int maxofs; } T3dsLoaderPers; /* 3ds chunk types that we use */ enum { /* primary chunk */ CHUNK_MAIN = 0x4D4D, /* main chunks */ CHUNK_VERSION = 0x0002, CHUNK_EDITOR_CONFIG = 0x3D3E, CHUNK_EDITOR_DATA = 0x3D3D, CHUNK_KEYFRAME_DATA = 0xB000, /* editor data sub chunks */ CHUNK_MATERIAL = 0xAFFF, CHUNK_OBJECT = 0x4000, /* material sub chunks */ CHUNK_MATNAME = 0xA000, CHUNK_MATDIFFUSE = 0xA020, CHUNK_MATMAP = 0xA200, CHUNK_MATMAPFILE = 0xA300, /* lets us know we're reading a new object */ CHUNK_OBJECT_MESH = 0x4100, /* object mesh sub chunks */ CHUNK_OBJECT_VERTICES = 0x4110, CHUNK_OBJECT_FACES = 0x4120, CHUNK_OBJECT_MATERIAL = 0x4130, CHUNK_OBJECT_UV = 0x4140, }; #ifdef DEBUG_PM_3DS static struct { int id; char *name; } debugChunkNames[] = { { CHUNK_MAIN , "CHUNK_MAIN" }, { CHUNK_VERSION , "CHUNK_VERSION" }, { CHUNK_EDITOR_CONFIG , "CHUNK_EDITOR_CONFIG" }, { CHUNK_EDITOR_DATA , "CHUNK_EDITOR_DATA" }, { CHUNK_KEYFRAME_DATA , "CHUNK_KEYFRAME_DATA" }, { CHUNK_MATERIAL , "CHUNK_MATERIAL" }, { CHUNK_OBJECT , "CHUNK_OBJECT" }, { CHUNK_MATNAME , "CHUNK_MATNAME" }, { CHUNK_MATDIFFUSE , "CHUNK_MATDIFFUSE" }, { CHUNK_MATMAP , "CHUNK_MATMAP" }, { CHUNK_MATMAPFILE , "CHUNK_MATMAPFILE" }, { CHUNK_OBJECT_MESH , "CHUNK_OBJECT_MESH" }, { CHUNK_OBJECT_VERTICES , "CHUNK_OBJECT_VERTICES" }, { CHUNK_OBJECT_FACES , "CHUNK_OBJECT_FACES" }, { CHUNK_OBJECT_MATERIAL , "CHUNK_OBJECT_MATERIAL" }, { CHUNK_OBJECT_UV , "CHUNK_OBJECT_UV" }, { 0 , NULL } }; static char *DebugGetChunkName (int id) { int i,max; /* imax? ;) */ max = sizeof(debugChunkNames) / sizeof(debugChunkNames[0]); for (i=0; ilen)) return PICO_PMV_ERROR_SIZE; /* check 3ds magic */ if (_pico_little_short(chunk->id) != CHUNK_MAIN) return PICO_PMV_ERROR_IDENT; /* file seems to be a valid 3ds */ return PICO_PMV_OK; } static T3dsChunk *GetChunk (T3dsLoaderPers *pers) { T3dsChunk *chunk; /* sanity check */ if (pers->cofs > pers->maxofs) return 0; #ifdef DEBUG_PM_3DS /* printf("GetChunk: pers->cofs %x\n",pers->cofs); */ #endif /* fill in pointer to chunk */ chunk = (T3dsChunk *)&pers->bufptr[ pers->cofs ]; if (!chunk) return NULL; chunk->id = _pico_little_short(chunk->id ); chunk->len = _pico_little_long (chunk->len); /* advance in buffer */ pers->cofs += sizeof(T3dsChunk); /* this means yay */ return chunk; } static int GetASCIIZ (T3dsLoaderPers *pers, char *dest, int max) { int pos = 0; int ch; for (;;) { ch = pers->bufptr[ pers->cofs++ ]; if (ch == '\0') break; if (pers->cofs >= pers->maxofs) { dest[ pos ] = '\0'; return 0; } dest[ pos++ ] = ch; if (pos >= max) break; } dest[ pos ] = '\0'; return 1; } static picoByte_t GetByte (T3dsLoaderPers *pers) { picoByte_t *value; /* sanity check */ if (pers->cofs > pers->maxofs) return 0; /* get and return value */ value = (picoByte_t *)(pers->bufptr + pers->cofs); pers->cofs += 1; return *value; } static int GetWord (T3dsLoaderPers *pers) { unsigned short *value; /* sanity check */ if (pers->cofs > pers->maxofs) return 0; /* get and return value */ value = (unsigned short *)(pers->bufptr + pers->cofs); pers->cofs += 2; return _pico_little_short(*value); } static float GetFloat (T3dsLoaderPers *pers) { float *value; /* sanity check */ if (pers->cofs > pers->maxofs) return 0; /* get and return value */ value = (float *)(pers->bufptr + pers->cofs); pers->cofs += 4; return _pico_little_float(*value); } static int GetMeshVertices (T3dsLoaderPers *pers) { int numVerts; int i; /* get number of verts for this surface */ numVerts = GetWord(pers); #ifdef DEBUG_PM_3DS printf("GetMeshVertices: numverts %d\n",numVerts); #endif /* read in vertices for current surface */ for (i=0; isurface,i,v ); PicoSetSurfaceColor( pers->surface,0,i,white ); /* ydnar */ #ifdef DEBUG_PM_3DS_EX printf("Vertex: x: %f y: %f z: %f\n",v[0],v[1],v[2]); #endif } /* success (no errors occured) */ return 1; } static int GetMeshFaces (T3dsLoaderPers *pers) { int numFaces; int i; /* get number of faces for this surface */ numFaces = GetWord(pers); #ifdef DEBUG_PM_3DS printf("GetMeshFaces: numfaces %d\n",numFaces); #endif /* read in vertex indices for current surface */ for (i=0; isurface, (i * 3 + 0), (picoIndex_t)face.a ); PicoSetSurfaceIndex( pers->surface, (i * 3 + 1), (picoIndex_t)face.b ); PicoSetSurfaceIndex( pers->surface, (i * 3 + 2), (picoIndex_t)face.c ); #ifdef DEBUG_PM_3DS_EX printf("Face: a: %d b: %d c: %d (%d)\n",face.a,face.b,face.c,face.visible); #endif } /* success (no errors occured) */ return 1; } static int GetMeshTexCoords (T3dsLoaderPers *pers) { int numTexCoords; int i; /* get number of uv coords for this surface */ numTexCoords = GetWord(pers); #ifdef DEBUG_PM_3DS printf("GetMeshTexCoords: numcoords %d\n",numTexCoords); #endif /* read in uv coords for current surface */ for (i=0; isurface == NULL) continue; /* add current uv */ PicoSetSurfaceST( pers->surface,0,i,uv ); #ifdef DEBUG_PM_3DS_EX printf("u: %f v: %f\n",uv[0],uv[1]); #endif } /* success (no errors occured) */ return 1; } static int GetMeshShader (T3dsLoaderPers *pers) { char shaderName[255] = { 0 }; picoShader_t *shader; int numSharedVerts; int setShaderName = 0; int i; /* the shader is either the color or the texture map of the */ /* object. it can also hold other information like the brightness, */ /* shine, etc. stuff we don't really care about. we just want the */ /* color, or the texture map file name really */ /* get in the shader name */ if (!GetASCIIZ(pers,shaderName,sizeof(shaderName))) return 0; /* ydnar: trim to first whitespace */ _pico_first_token( shaderName ); /* now that we have the shader name we need to go through all of */ /* the shaders and check the name against each shader. when we */ /* find a shader in our shader list that matches this name we */ /* just read in, then we assign the shader's id of the object to */ /* that shader */ /* get shader id for shader name */ shader = PicoFindShader( pers->model, shaderName, 1 ); /* we've found a matching shader */ if ((shader != NULL) && pers->surface) { char mapName[1024+1]; char *mapNamePtr; memset( mapName,0,sizeof(mapName) ); /* get ptr to shader's map name */ mapNamePtr = PicoGetShaderMapName( shader ); /* we have a valid map name ptr */ if (mapNamePtr != NULL) { char temp[128]; const char *name; /* copy map name to local buffer */ strcpy( mapName,mapNamePtr ); /* extract file name */ name = _pico_nopath( mapName ); strncpy( temp, name, sizeof(temp) ); /* remove file extension */ /* name = _pico_setfext( name,"" ); */ /* assign default name if no name available */ if (strlen(temp) < 1) strcpy(temp,pers->basename); /* build shader name */ _pico_strlwr( temp ); /* gaynux update -sea */ sprintf( mapName,"models/mapobjects/%s/%s",pers->basename,temp ); /* set shader name */ /* PicoSetShaderName( shader,mapName ); */ /* ydnar: this will screw up the named shader */ /* set surface's shader index */ PicoSetSurfaceShader( pers->surface, shader ); setShaderName = 1; } } /* we didn't set a shader name; throw out warning */ if (!setShaderName) { _pico_printf( PICO_WARNING,"3DS mesh is missing shader name"); } /* we don't process the list of shared vertices here; there is a */ /* short int that gives the number of faces of the mesh concerned */ /* by this shader, then there is the list itself of these faces. */ /* 0000 means the first face of the (4120) face list */ /* get number of shared verts */ numSharedVerts = GetWord(pers); #ifdef DEBUG_PM_3DS printf("GetMeshShader: uses shader '%s' (nsv %d)\n",shaderName,numSharedVerts); #endif /* skip list of shared verts */ for (i=0; ishader ) { PicoSetShaderDiffuseColor( pers->shader,color ); } #ifdef DEBUG_PM_3DS printf("GetDiffuseColor: %d %d %d\n",color[0],color[1],color[2]); #endif /* success (no errors occured) */ return 1; } static int DoNextEditorDataChunk (T3dsLoaderPers *pers, long endofs) { T3dsChunk *chunk; #ifdef DEBUG_PM_3DS_EX printf("DoNextEditorDataChunk: endofs %d\n",endofs); #endif while (pers->cofs < endofs) { long nextofs = pers->cofs; if ((chunk = GetChunk(pers)) == NULL) return 0; if (!chunk->len) return 0; nextofs += chunk->len; #ifdef DEBUG_PM_3DS_EX printf("Chunk %04x (%s), len %d pers->cofs %x\n",chunk->id,DebugGetChunkName(chunk->id),chunk->len,pers->cofs); #endif /*** meshes ***/ if (chunk->id == CHUNK_OBJECT) { picoSurface_t *surface; char surfaceName[ 0xff ] = { 0 }; /* read in surface name */ if( !GetASCIIZ(pers,surfaceName,sizeof(surfaceName)) ) return 0; /* this is bad */ //PicoGetSurfaceName /* ignore NULL name surfaces */ // if( surfaceName /* allocate a pico surface */ surface = PicoNewSurface( pers->model ); if( surface == NULL ) { pers->surface = NULL; return 0; /* this is bad too */ } /* assign ptr to current surface */ pers->surface = surface; /* 3ds models surfaces are all triangle meshes */ PicoSetSurfaceType( pers->surface,PICO_TRIANGLES ); /* set surface name */ PicoSetSurfaceName( pers->surface,surfaceName ); /* continue mess with object's sub chunks */ DoNextEditorDataChunk(pers,nextofs); continue; } if (chunk->id == CHUNK_OBJECT_MESH) { /* continue mess with mesh's sub chunks */ if (!DoNextEditorDataChunk(pers,nextofs)) return 0; continue; } if (chunk->id == CHUNK_OBJECT_VERTICES) { if (!GetMeshVertices(pers)) return 0; continue; } if (chunk->id == CHUNK_OBJECT_FACES) { if (!GetMeshFaces(pers)) return 0; continue; } if (chunk->id == CHUNK_OBJECT_UV) { if (!GetMeshTexCoords(pers)) return 0; continue; } if (chunk->id == CHUNK_OBJECT_MATERIAL) { if (!GetMeshShader(pers)) return 0; continue; } /*** materials ***/ if (chunk->id == CHUNK_MATERIAL) { /* new shader specific things should be */ /* initialized right here */ picoShader_t *shader; /* allocate a pico shader */ shader = PicoNewShader( pers->model ); /* ydnar */ if( shader == NULL ) { pers->shader = NULL; return 0; /* this is bad too */ } /* assign ptr to current shader */ pers->shader = shader; /* continue and process the material's sub chunks */ DoNextEditorDataChunk(pers,nextofs); continue; } if (chunk->id == CHUNK_MATNAME) { /* new material's names should be stored here. note that */ /* GetMeshMaterial returns the name of the material that */ /* is used by the mesh. new material names are set HERE. */ /* but for now we skip the new material's name ... */ if (pers->shader) { char *name = (char*) (pers->bufptr + pers->cofs); char *cleanedName = _pico_clone_alloc( name ); _pico_first_token( cleanedName ); PicoSetShaderName( pers->shader, cleanedName ); #ifdef DEBUG_PM_3DS printf( "NewShader: '%s'\n", cleanedName ); #endif _pico_free( cleanedName ); } } if (chunk->id == CHUNK_MATDIFFUSE) { /* todo: color for last inserted new material should be */ /* stored somewhere by GetDiffuseColor */ if (!GetDiffuseColor(pers)) return 0; /* rest of chunk is skipped here */ } if (chunk->id == CHUNK_MATMAP) { /* continue and process the material map sub chunks */ DoNextEditorDataChunk(pers,nextofs); continue; } if (chunk->id == CHUNK_MATMAPFILE) { /* map file name for last inserted new material should */ /* be stored here. but for now we skip this too ... */ if( pers->shader ) { char *name = (char *)(pers->bufptr + pers->cofs); PicoSetShaderMapName( pers->shader,name ); #ifdef DEBUG_PM_3DS printf("NewShaderMapfile: '%s'\n",name); #endif } } /*** keyframes ***/ if (chunk->id == CHUNK_KEYFRAME_DATA) { /* well umm, this is a bit too much since we don't really */ /* need model animation sequences right now. we skip this */ #ifdef DEBUG_PM_3DS printf("KeyframeData: len %d\n",chunk->len); #endif } /* skip unknown chunk */ pers->cofs = nextofs; if (pers->cofs >= pers->maxofs) break; } return 1; } static int DoNextChunk (T3dsLoaderPers *pers, int endofs) { T3dsChunk *chunk; #ifdef DEBUG_PM_3DS printf("DoNextChunk: endofs %d\n",endofs); #endif while (pers->cofs < endofs) { long nextofs = pers->cofs; if ((chunk = GetChunk(pers)) == NULL) return 0; if (!chunk->len) return 0; nextofs += chunk->len; #ifdef DEBUG_PM_3DS_EX printf("Chunk %04x (%s), len %d pers->cofs %x\n",chunk->id,DebugGetChunkName(chunk->id),chunk->len,pers->cofs); #endif /*** version ***/ if (chunk->id == CHUNK_VERSION) { /* at this point i get the 3ds file version. since there */ /* might be new additions to the 3ds file format in 4.0 */ /* it might be a good idea to store the version somewhere */ /* for later handling or message displaying */ /* get the version */ int version; version = GetWord(pers); GetWord(pers); #ifdef DEBUG_PM_3DS printf("FileVersion: %d\n",version); #endif /* throw out a warning for version 4 models */ if (version == 4) { _pico_printf( PICO_WARNING, "3DS version is 4. Model might load incorrectly."); } /* store the 3ds file version in pico special field 0 */ /* PicoSetSurfaceSpecial(pers->surface,0,version); */ /* ydnar: this was causing a crash accessing uninitialized surface */ /* rest of chunk is skipped here */ } /*** editor data ***/ if (chunk->id == CHUNK_EDITOR_DATA) { if (!DoNextEditorDataChunk(pers,nextofs)) return 0; continue; } /* skip unknown chunk */ pers->cofs = nextofs; if (pers->cofs >= pers->maxofs) break; } return 1; } /* _3ds_load: * loads an autodesk 3ds model file. */ static picoModel_t *_3ds_load( PM_PARAMS_LOAD ) { T3dsLoaderPers pers; picoModel_t *model; char basename[128]; /* create a new pico model */ model = PicoNewModel(); if (model == NULL) { /* user must have some serious ram problems ;) */ return NULL; } /* get model's base name (eg. jeep from c:\models\jeep.3ds) */ memset( basename,0,sizeof(basename) ); strncpy( basename,_pico_nopath(fileName),sizeof(basename) ); _pico_setfext( basename,"" ); /* initialize persistant vars (formerly static) */ pers.model = model; pers.bufptr = (picoByte_t *)buffer; pers.basename = (char *)basename; pers.maxofs = bufSize; pers.cofs = 0L; /* do model setup */ PicoSetModelFrameNum( model,frameNum ); PicoSetModelName( model,fileName ); PicoSetModelFileName( model,fileName ); /* skip first chunk in file (magic) */ GetChunk(&pers); /* process chunks */ if (!DoNextChunk(&pers,pers.maxofs)) { /* well, bleh i guess */ PicoFreeModel(model); return NULL; } /* return allocated pico model */ return model; } /* pico file format module definition */ const picoModule_t picoModule3DS = { "0.86-b", /* module version string */ "Autodesk 3Dstudio", /* module display name */ "seaw0lf", /* author's name */ "2002 seaw0lf", /* module copyright */ { "3ds",NULL,NULL,NULL /* default extensions to use */ }, _3ds_canload, /* validation routine */ _3ds_load, /* load routine */ NULL, /* save validation routine */ NULL /* save routine */ }; ������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/pm_ase.c�����������������������������������������������������������0000664�0000000�0000000�00000102036�12454246557�0020233�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other aseMaterialList provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #define PM_ASE_C /* uncomment when debugging this module */ //#define DEBUG_PM_ASE //#define DEBUG_PM_ASE_EX /* dependencies */ #include "picointernal.h" #ifdef DEBUG_PM_ASE #include "time.h" #endif /* plain white */ static picoColor_t white = { 255, 255, 255, 255 }; /* jhefty - multi-subobject material support */ /* Material/SubMaterial management */ /* A material should have 1..n submaterials assigned to it */ typedef struct aseSubMaterial_s { struct aseSubMaterial_s* next; int subMtlId; picoShader_t* shader; } aseSubMaterial_t; typedef struct aseMaterial_s { struct aseMaterial_s* next; struct aseSubMaterial_s* subMtls; int mtlId; } aseMaterial_t; /* Material/SubMaterial management functions */ static aseMaterial_t* _ase_get_material ( aseMaterial_t* list , int mtlIdParent ) { aseMaterial_t* mtl = list; while ( mtl ) { if ( mtlIdParent == mtl->mtlId ) { break; } mtl = mtl->next; } return mtl; } static aseSubMaterial_t* _ase_get_submaterial ( aseMaterial_t* list, int mtlIdParent , int subMtlId ) { aseMaterial_t* parent = _ase_get_material ( list , mtlIdParent ); aseSubMaterial_t* subMtl = NULL; if ( !parent ) { _pico_printf ( PICO_ERROR , "No ASE material exists with id %i\n" , mtlIdParent ); return NULL; } subMtl = parent->subMtls; while ( subMtl ) { if ( subMtlId == subMtl->subMtlId ) { break; } subMtl = subMtl->next; } return subMtl; } aseSubMaterial_t* _ase_get_submaterial_or_default ( aseMaterial_t* materials, int mtlIdParent , int subMtlId ) { aseSubMaterial_t* subMtl = _ase_get_submaterial( materials, mtlIdParent, subMtlId ); if(subMtl != NULL) { return subMtl; } /* ydnar: trying default submaterial */ subMtl = _ase_get_submaterial( materials, mtlIdParent, 0 ); if( subMtl != NULL ) { return subMtl; } _pico_printf( PICO_ERROR, "Could not find material/submaterial for id %d/%d\n", mtlIdParent, subMtlId ); return NULL; } static aseMaterial_t* _ase_add_material( aseMaterial_t **list, int mtlIdParent ) { aseMaterial_t *mtl = _pico_calloc( 1, sizeof( aseMaterial_t ) ); mtl->mtlId = mtlIdParent; mtl->subMtls = NULL; mtl->next = *list; *list = mtl; return mtl; } static aseSubMaterial_t* _ase_add_submaterial( aseMaterial_t **list, int mtlIdParent, int subMtlId, picoShader_t* shader ) { aseMaterial_t *parent = _ase_get_material( *list, mtlIdParent ); aseSubMaterial_t *subMtl = _pico_calloc( 1, sizeof ( aseSubMaterial_t ) ); if ( !parent ) { parent = _ase_add_material ( list , mtlIdParent ); } subMtl->shader = shader; subMtl->subMtlId = subMtlId; subMtl->next = parent->subMtls; parent->subMtls = subMtl; return subMtl; } static void _ase_free_materials( aseMaterial_t **list ) { aseMaterial_t* mtl = *list; aseSubMaterial_t* subMtl = NULL; aseMaterial_t* mtlTemp = NULL; aseSubMaterial_t* subMtlTemp = NULL; while ( mtl ) { subMtl = mtl->subMtls; while ( subMtl ) { subMtlTemp = subMtl->next; _pico_free ( subMtl ); subMtl = subMtlTemp; } mtlTemp = mtl->next; _pico_free ( mtl ); mtl = mtlTemp; } (*list) = NULL; } #ifdef DEBUG_PM_ASE static void _ase_print_materials( aseMaterial_t *list ) { aseMaterial_t* mtl = list; aseSubMaterial_t* subMtl = NULL; while ( mtl ) { _pico_printf ( PICO_NORMAL , "ASE Material %i" , mtl->mtlId ); subMtl = mtl->subMtls; while ( subMtl ) { _pico_printf ( PICO_NORMAL , " -- ASE SubMaterial %i - %s\n" , subMtl->subMtlId , subMtl->shader->name ); subMtl = subMtl->next; } mtl = mtl->next; } } #endif //DEBUG_PM_ASE /* todo: * - apply material specific uv offsets to uv coordinates */ /* _ase_canload: * validates a 3dsmax ase model file. */ static int _ase_canload( PM_PARAMS_CANLOAD ) { picoParser_t *p; /* quick data length validation */ if( bufSize < 80 ) return PICO_PMV_ERROR_SIZE; /* keep the friggin compiler happy */ *fileName = *fileName; /* create pico parser */ p = _pico_new_parser( (picoByte_t*) buffer, bufSize ); if( p == NULL ) return PICO_PMV_ERROR_MEMORY; /* get first token */ if( _pico_parse_first( p ) == NULL) { return PICO_PMV_ERROR_IDENT; } /* check first token */ if( _pico_stricmp( p->token, "*3dsmax_asciiexport" ) ) { _pico_free_parser( p ); return PICO_PMV_ERROR_IDENT; } /* free the pico parser object */ _pico_free_parser( p ); /* file seems to be a valid ase file */ return PICO_PMV_OK; } typedef struct aseVertex_s aseVertex_t; struct aseVertex_s { picoVec3_t xyz; picoVec3_t normal; picoIndex_t id; }; typedef struct aseTexCoord_s aseTexCoord_t; struct aseTexCoord_s { picoVec2_t texcoord; }; typedef struct aseColor_s aseColor_t; struct aseColor_s { picoColor_t color; }; typedef struct aseFace_s aseFace_t; struct aseFace_s { picoIndex_t indices[9]; picoIndex_t smoothingGroup; picoIndex_t materialId; picoIndex_t subMaterialId; }; typedef aseFace_t* aseFacesIter_t; picoSurface_t* PicoModelFindOrAddSurface( picoModel_t *model, picoShader_t* shader ) { /* see if a surface already has the shader */ int i = 0; for ( ; i < model->numSurfaces ; i++ ) { picoSurface_t* workSurface = model->surface[i]; if ( workSurface->shader == shader ) { return workSurface; } } /* no surface uses this shader yet, so create a new surface */ { /* create a new surface in the model for the unique shader */ picoSurface_t* workSurface = PicoNewSurface(model); if ( !workSurface ) { _pico_printf ( PICO_ERROR , "Could not allocate a new surface!\n" ); return 0; } /* do surface setup */ PicoSetSurfaceType( workSurface, PICO_TRIANGLES ); PicoSetSurfaceName( workSurface, shader->name ); PicoSetSurfaceShader( workSurface, shader ); return workSurface; } } /* _ase_submit_triangles - jhefty use the surface and the current face list to look up material/submaterial IDs and submit them to the model for proper processing The following still holds from ydnar's _ase_make_surface: indexes 0 1 2 = vert indexes indexes 3 4 5 = st indexes indexes 6 7 8 = color indexes (new) */ #if 0 typedef picoIndex_t* picoIndexIter_t; typedef struct aseUniqueIndices_s aseUniqueIndices_t; struct aseUniqueIndices_s { picoIndex_t* data; picoIndex_t* last; aseFace_t* faces; }; size_t aseUniqueIndices_size(aseUniqueIndices_t* self) { return self->last - self->data; } void aseUniqueIndices_reserve(aseUniqueIndices_t* self, picoIndex_t size) { self->data = self->last = (picoIndex_t*)_pico_calloc(size, sizeof(picoIndex_t)); } void aseUniqueIndices_clear(aseUniqueIndices_t* self) { _pico_free(self->data); } void aseUniqueIndices_pushBack(aseUniqueIndices_t* self, picoIndex_t index) { *self->last++ = index; } picoIndex_t aseFaces_getVertexIndex(aseFace_t* faces, picoIndex_t index) { return faces[index / 3].indices[index % 3]; } picoIndex_t aseFaces_getTexCoordIndex(aseFace_t* faces, picoIndex_t index) { return faces[index / 3].indices[(index % 3) + 3]; } picoIndex_t aseFaces_getColorIndex(aseFace_t* faces, picoIndex_t index) { return faces[index / 3].indices[(index % 3) + 6]; } int aseUniqueIndex_equal(aseFace_t* faces, picoIndex_t index, picoIndex_t other) { return aseFaces_getVertexIndex(faces, index) == aseFaces_getVertexIndex(faces, other) && aseFaces_getTexCoordIndex(faces, index) == aseFaces_getTexCoordIndex(faces, other) && aseFaces_getColorIndex(faces, index) == aseFaces_getColorIndex(faces, other); } picoIndex_t aseUniqueIndices_insertUniqueVertex(aseUniqueIndices_t* self, picoIndex_t index) { picoIndexIter_t i = self->data; for(; i != self->last; ++i) { picoIndex_t other = (picoIndex_t)(i - self->data); if(aseUniqueIndex_equal(self->faces, index, other)) { return other; } } aseUniqueIndices_pushBack(self, index); return (picoIndex_t)(aseUniqueIndices_size(self) - 1); } static void _ase_submit_triangles_unshared ( picoModel_t* model , aseMaterial_t* materials , aseVertex_t* vertices, aseTexCoord_t* texcoords, aseColor_t* colors, aseFace_t* faces, int numFaces, int meshHasNormals ) { aseFacesIter_t i = faces, end = faces + numFaces; aseUniqueIndices_t indices; aseUniqueIndices_t remap; aseUniqueIndices_reserve(&indices, numFaces * 3); aseUniqueIndices_reserve(&remap, numFaces * 3); indices.faces = faces; for(; i != end; ++i) { /* look up the shader for the material/submaterial pair */ aseSubMaterial_t* subMtl = _ase_get_submaterial_or_default( materials, (*i).materialId, (*i).subMaterialId ); if( subMtl == NULL ) { return; } { picoSurface_t* surface = PicoModelFindOrAddSurface(model, subMtl->shader); int j; /* we pull the data from the vertex, color and texcoord arrays using the face index data */ for ( j = 0 ; j < 3 ; j ++ ) { picoIndex_t index = (picoIndex_t)(((i - faces) * 3) + j); picoIndex_t size = (picoIndex_t)aseUniqueIndices_size(&indices); picoIndex_t unique = aseUniqueIndices_insertUniqueVertex(&indices, index); picoIndex_t numVertexes = PicoGetSurfaceNumVertexes(surface); picoIndex_t numIndexes = PicoGetSurfaceNumIndexes(surface); aseUniqueIndices_pushBack(&remap, numIndexes); PicoSetSurfaceIndex(surface, numIndexes, remap.data[unique]); if(unique == size) { PicoSetSurfaceXYZ(surface, numVertexes, vertices[(*i).indices[j]].xyz); PicoSetSurfaceNormal(surface, numVertexes, vertices[(*i).indices[j]].normal); PicoSetSurfaceST(surface, 0, numVertexes, texcoords[(*i).indices[j + 3]].texcoord); if ( (*i).indices[j + 6] >= 0 ) { PicoSetSurfaceColor(surface, 0, numVertexes, colors[(*i).indices[j + 6]].color); } else { PicoSetSurfaceColor(surface, 0, numVertexes, white); } PicoSetSurfaceSmoothingGroup(surface, numVertexes, (vertices[(*i).indices[j]].id * (1 << 16)) + (*i).smoothingGroup); } } } } aseUniqueIndices_clear(&indices); aseUniqueIndices_clear(&remap); } #endif static void _ase_submit_triangles( picoModel_t* model , aseMaterial_t* materials , aseVertex_t* vertices, aseTexCoord_t* texcoords, aseColor_t* colors, aseFace_t* faces, int numFaces ) { aseFacesIter_t i = faces, end = faces + numFaces; for(; i != end; ++i) { /* look up the shader for the material/submaterial pair */ aseSubMaterial_t* subMtl = _ase_get_submaterial_or_default( materials, (*i).materialId, (*i).subMaterialId ); if( subMtl == NULL ) { return; } { picoVec3_t* xyz[3]; picoVec3_t* normal[3]; picoVec2_t* st[3]; picoColor_t* color[3]; picoIndex_t smooth[3]; int j; /* we pull the data from the vertex, color and texcoord arrays using the face index data */ for ( j = 0 ; j < 3 ; j ++ ) { xyz[j] = &vertices[(*i).indices[j]].xyz; normal[j] = &vertices[(*i).indices[j]].normal; st[j] = &texcoords[(*i).indices[j + 3]].texcoord; if( colors != NULL && (*i).indices[j + 6] >= 0 ) { color[j] = &colors[(*i).indices[j + 6]].color; } else { color[j] = &white; } smooth[j] = (vertices[(*i).indices[j]].id * (1 << 16)) + (*i).smoothingGroup; /* don't merge vertices */ } /* submit the triangle to the model */ PicoAddTriangleToModel ( model , xyz , normal , 1 , st , 1 , color , subMtl->shader, smooth ); } } } static void shadername_convert(char* shaderName) { /* unix-style path separators */ char* s = shaderName; for(; *s != '\0'; ++s) { if(*s == '\\') { *s = '/'; } } } /* _ase_load: * loads a 3dsmax ase model file. */ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) { picoModel_t *model; picoParser_t *p; char lastNodeName[ 1024 ]; aseVertex_t* vertices = NULL; aseTexCoord_t* texcoords = NULL; aseColor_t* colors = NULL; aseFace_t* faces = NULL; int numVertices = 0; int numFaces = 0; int numTextureVertices = 0; int numTextureVertexFaces = 0; int numColorVertices = 0; int numColorVertexFaces = 0; int vertexId = 0; aseMaterial_t* materials = NULL; #ifdef DEBUG_PM_ASE clock_t start, finish; double elapsed; start = clock(); #endif /* helper */ #define _ase_error_return(m) \ { \ _pico_printf( PICO_ERROR,"%s in ASE, line %d.",m,p->curLine); \ _pico_free_parser( p ); \ PicoFreeModel( model ); \ return NULL; \ } /* create a new pico parser */ p = _pico_new_parser( (picoByte_t *)buffer,bufSize ); if (p == NULL) return NULL; /* create a new pico model */ model = PicoNewModel(); if (model == NULL) { _pico_free_parser( p ); return NULL; } /* do model setup */ PicoSetModelFrameNum( model, frameNum ); PicoSetModelName( model, fileName ); PicoSetModelFileName( model, fileName ); /* initialize some stuff */ memset( lastNodeName,0,sizeof(lastNodeName) ); /* parse ase model file */ while( 1 ) { /* get first token on line */ if (_pico_parse_first( p ) == NULL) break; /* we just skip empty lines */ if (p->token == NULL || !strlen( p->token )) continue; /* we skip invalid ase statements */ if (p->token[0] != '*' && p->token[0] != '{' && p->token[0] != '}') { _pico_parse_skip_rest( p ); continue; } /* remember node name */ if (!_pico_stricmp(p->token,"*node_name")) { /* read node name */ char *ptr = _pico_parse( p,0 ); if (ptr == NULL) _ase_error_return("Node name parse error"); /* remember node name */ strncpy( lastNodeName,ptr,sizeof(lastNodeName) ); } /* model mesh (originally contained within geomobject) */ else if (!_pico_stricmp(p->token,"*mesh")) { /* finish existing surface */ _ase_submit_triangles(model, materials, vertices, texcoords, colors, faces, numFaces); _pico_free(faces); _pico_free(vertices); _pico_free(texcoords); _pico_free(colors); colors = NULL; /* OrbWeaver: reset all pointers to avoid double-free */ faces = NULL; vertices = NULL; texcoords = NULL; } else if (!_pico_stricmp(p->token,"*mesh_numvertex")) { if (!_pico_parse_int( p, &numVertices) ) _ase_error_return("Missing MESH_NUMVERTEX value"); vertices = _pico_calloc(numVertices, sizeof(aseVertex_t)); } else if (!_pico_stricmp(p->token,"*mesh_numfaces")) { if (!_pico_parse_int( p, &numFaces) ) _ase_error_return("Missing MESH_NUMFACES value"); faces = _pico_calloc(numFaces, sizeof(aseFace_t)); } else if (!_pico_stricmp(p->token,"*mesh_numtvertex")) { if (!_pico_parse_int( p, &numTextureVertices) ) _ase_error_return("Missing MESH_NUMTVERTEX value"); texcoords = _pico_calloc(numTextureVertices, sizeof(aseTexCoord_t)); } else if (!_pico_stricmp(p->token,"*mesh_numtvfaces")) { if (!_pico_parse_int( p, &numTextureVertexFaces) ) _ase_error_return("Missing MESH_NUMTVFACES value"); } else if (!_pico_stricmp(p->token,"*mesh_numcvertex")) { if (!_pico_parse_int( p, &numColorVertices) ) _ase_error_return("Missing MESH_NUMCVERTEX value"); colors = _pico_calloc(numColorVertices, sizeof(aseColor_t)); memset( colors, 255, numColorVertices * sizeof( aseColor_t ) ); /* ydnar: force colors to white initially */ } else if (!_pico_stricmp(p->token,"*mesh_numcvfaces")) { if (!_pico_parse_int( p, &numColorVertexFaces) ) _ase_error_return("Missing MESH_NUMCVFACES value"); } /* mesh material reference. this usually comes at the end of */ /* geomobjects after the mesh blocks. we must assume that the */ /* new mesh was already created so all we can do here is assign */ /* the material reference id (shader index) now. */ else if (!_pico_stricmp(p->token,"*material_ref")) { int mtlId; /* get the material ref (0..n) */ if (!_pico_parse_int( p,&mtlId) ) _ase_error_return("Missing material reference ID"); { int i = 0; /* fix up all of the aseFaceList in the surface to point to the parent material */ /* we've already saved off their subMtl */ for(; i < numFaces; ++i) { faces[i].materialId = mtlId; } } } /* model mesh vertex */ else if (!_pico_stricmp(p->token,"*mesh_vertex")) { int index; if( numVertices == 0 ) _ase_error_return("Vertex parse error"); /* get vertex data (orig: index +y -x +z) */ if (!_pico_parse_int( p,&index )) _ase_error_return("Vertex parse error"); if (!_pico_parse_vec( p,vertices[index].xyz )) _ase_error_return("Vertex parse error"); if (index >= numVertices) { _ase_error_return("Error: MESH_VERTEX index out of bounds (is >= MESH_NUMVERTEX)"); } vertices[index].id = vertexId++; } /* model mesh vertex normal */ else if (!_pico_stricmp(p->token,"*mesh_vertexnormal")) { int index; if( numVertices == 0 ) _ase_error_return("Vertex parse error"); /* get vertex data (orig: index +y -x +z) */ if (!_pico_parse_int( p,&index )) _ase_error_return("Vertex parse error"); if (index >= numVertices) { _ase_error_return("Error: MESH_VERTEXNORMAL index out of bounds (is >= MESH_NUMVERTEX)"); } if (!_pico_parse_vec( p,vertices[index].normal )) _ase_error_return("Vertex parse error"); } /* model mesh face */ else if (!_pico_stricmp(p->token,"*mesh_face")) { picoIndex_t indexes[3]; int index; if( numFaces == 0 ) _ase_error_return("Face parse error"); /* get face index */ if (!_pico_parse_int( p,&index )) _ase_error_return("Face parse error"); if (index >= numFaces) { _ase_error_return("Error: MESH_FACE index out of bounds (is >= MESH_NUMFACES)"); } /* get 1st vertex index */ _pico_parse( p,0 ); if (!_pico_parse_int( p,&indexes[0] )) _ase_error_return("Face parse error"); if (indexes[0] >= numVertices) { _ase_error_return("Error: MESH_FACE: vertex index 0 out of bounds (is >= MESH_NUMVERTEX)"); } /* get 2nd vertex index */ _pico_parse( p,0 ); if (!_pico_parse_int( p,&indexes[1] )) _ase_error_return("Face parse error"); if (indexes[1] >= numVertices) { _ase_error_return("Error: MESH_FACE: vertex index 1 out of bounds (is >= MESH_NUMVERTEX)"); } /* get 3rd vertex index */ _pico_parse( p,0 ); if (!_pico_parse_int( p,&indexes[2] )) _ase_error_return("Face parse error"); if (indexes[2] >= numVertices) { _ase_error_return("Error: MESH_FACE: vertex index 2 out of bounds (is >= MESH_NUMVERTEX)"); } /* parse to the subMaterial ID */ while ( 1 ) { if (!_pico_parse (p,0)) /* EOL */ { break; } if (!_pico_stricmp (p->token,"*MESH_SMOOTHING" )) { _pico_parse_int ( p , &faces[index].smoothingGroup ); } if (!_pico_stricmp (p->token,"*MESH_MTLID" )) { _pico_parse_int ( p , &faces[index].subMaterialId ); } } faces[index].materialId = 0; faces[index].indices[0] = indexes[2]; faces[index].indices[1] = indexes[1]; faces[index].indices[2] = indexes[0]; } /* model texture vertex */ else if (!_pico_stricmp(p->token,"*mesh_tvert")) { int index; if( numVertices == 0 ) _ase_error_return("Texture Vertex parse error"); /* get uv vertex index */ if (!_pico_parse_int( p,&index ) || index >= numTextureVertices) _ase_error_return("Texture vertex parse error"); /* get uv vertex s */ if (!_pico_parse_double( p,&texcoords[index].texcoord[0] )) _ase_error_return("Texture vertex parse error"); /* get uv vertex t */ if (!_pico_parse_double( p,&texcoords[index].texcoord[1] )) _ase_error_return("Texture vertex parse error"); /* ydnar: invert t */ texcoords[index].texcoord[ 1 ] = 1.0f - texcoords[index].texcoord[ 1 ]; } /* ydnar: model mesh texture face */ else if( !_pico_stricmp( p->token, "*mesh_tface" ) ) { picoIndex_t indexes[3]; int index; if( numFaces == 0 ) _ase_error_return("Texture face parse error"); /* get face index */ if (!_pico_parse_int( p,&index )) _ase_error_return("Texture face parse error"); if (index >= numFaces) { _ase_error_return("Error: MESH_TFACE index out of bounds (is >= MESH_NUMFACES)"); } /* get 1st vertex index */ if (!_pico_parse_int( p,&indexes[0] )) _ase_error_return("Texture face parse error"); /* get 2nd vertex index */ if (!_pico_parse_int( p,&indexes[1] )) _ase_error_return("Texture face parse error"); /* get 3rd vertex index */ if (!_pico_parse_int( p,&indexes[2] )) _ase_error_return("Texture face parse error"); faces[index].indices[3] = indexes[2]; faces[index].indices[4] = indexes[1]; faces[index].indices[5] = indexes[0]; } /* model color vertex */ else if (!_pico_stricmp(p->token,"*mesh_vertcol")) { int index; float colorInput; if( numVertices == 0 ) _ase_error_return("Color Vertex parse error"); /* get color vertex index */ if (!_pico_parse_int( p,&index )) _ase_error_return("Color vertex parse error"); if (index >= numColorVertices) { _ase_error_return("Error: MESH_VERTCOL index out of bounds (is >= MESH_NUMCVERTEX)"); } /* get R component */ if (!_pico_parse_float( p,&colorInput )) _ase_error_return("Color vertex parse error"); colors[index].color[0] = (picoByte_t)(colorInput * 255); /* get G component */ if (!_pico_parse_float( p,&colorInput )) _ase_error_return("Color vertex parse error"); colors[index].color[1] = (picoByte_t)(colorInput * 255); /* get B component */ if (!_pico_parse_float( p,&colorInput )) _ase_error_return("Color vertex parse error"); colors[index].color[2] = (picoByte_t)(colorInput * 255); /* leave alpha alone since we don't get any data from the ASE format */ colors[index].color[3] = 255; } /* model color face */ else if (!_pico_stricmp(p->token,"*mesh_cface")) { picoIndex_t indexes[3]; int index; if( numFaces == 0 ) _ase_error_return("Face parse error"); /* get face index */ if (!_pico_parse_int( p,&index )) _ase_error_return("Face parse error"); if (index >= numFaces) { _ase_error_return("Error: MESH_CFACE index out of bounds (is >= MESH_NUMFACES)"); } /* get 1st cvertex index */ // _pico_parse( p,0 ); if (!_pico_parse_int( p,&indexes[0] )) _ase_error_return("Face parse error"); /* get 2nd cvertex index */ // _pico_parse( p,0 ); if (!_pico_parse_int( p,&indexes[1] )) _ase_error_return("Face parse error"); /* get 3rd cvertex index */ // _pico_parse( p,0 ); if (!_pico_parse_int( p,&indexes[2] )) _ase_error_return("Face parse error"); faces[index].indices[6] = indexes[2]; faces[index].indices[7] = indexes[1]; faces[index].indices[8] = indexes[0]; } /* model material */ else if( !_pico_stricmp( p->token, "*material" ) ) { aseSubMaterial_t* subMaterial = NULL; picoShader_t *shader = NULL; int level = 1, index; char materialName[ 1024 ]; float transValue = 0.0f, shineValue = 1.0f; picoColor_t ambientColor, diffuseColor, specularColor; char *mapname = NULL; int subMtlId, subMaterialLevel = -1; /* get material index */ _pico_parse_int( p,&index ); /* check brace */ if (!_pico_parse_check(p,1,"{")) _ase_error_return("Material missing opening brace"); /* parse material block */ while( 1 ) { /* get next token */ if (_pico_parse(p,1) == NULL) break; if (!strlen(p->token)) continue; /* handle levels */ if (p->token[0] == '{') level++; if (p->token[0] == '}') level--; if (!level) break; if( level == subMaterialLevel ) { /* set material name */ _pico_first_token( materialName ); shadername_convert(materialName); PicoSetShaderName( shader, materialName); /* set shader's transparency */ PicoSetShaderTransparency( shader,transValue ); /* set shader's ambient color */ PicoSetShaderAmbientColor( shader,ambientColor ); /* set diffuse alpha to transparency */ diffuseColor[3] = (picoByte_t)( transValue * 255.0 ); /* set shader's diffuse color */ PicoSetShaderDiffuseColor( shader,diffuseColor ); /* set shader's specular color */ PicoSetShaderSpecularColor( shader,specularColor ); /* set shader's shininess */ PicoSetShaderShininess( shader,shineValue ); /* set material map name */ PicoSetShaderMapName( shader, mapname ); subMaterial = _ase_add_submaterial( &materials, index, subMtlId, shader ); subMaterialLevel = -1; } /* parse submaterial index */ if (!_pico_stricmp(p->token,"*submaterial")) { /* allocate new pico shader */ _pico_parse_int( p , &subMtlId ); shader = PicoNewShader( model ); if (shader == NULL) { PicoFreeModel( model ); return NULL; } subMaterialLevel = level; } /* parse material name */ else if (!_pico_stricmp(p->token,"*material_name")) { char* name = _pico_parse(p,0); if ( name == NULL) _ase_error_return("Missing material name"); strcpy ( materialName , name ); /* skip rest and continue with next token */ _pico_parse_skip_rest( p ); continue; } /* parse material transparency */ else if (!_pico_stricmp(p->token,"*material_transparency")) { /* get transparency value from ase */ if (!_pico_parse_float( p,&transValue )) _ase_error_return("Material transparency parse error"); /* skip rest and continue with next token */ _pico_parse_skip_rest( p ); continue; } /* parse material shininess */ else if (!_pico_stricmp(p->token,"*material_shine")) { /* remark: * - not sure but instead of '*material_shine' i might * need to use '*material_shinestrength' */ /* get shine value from ase */ if (!_pico_parse_float( p,&shineValue )) _ase_error_return("Material shine parse error"); /* scale ase shine range 0..1 to pico range 0..127 */ shineValue *= 128.0; /* skip rest and continue with next token */ _pico_parse_skip_rest( p ); continue; } /* parse ambient material color */ else if (!_pico_stricmp(p->token,"*material_ambient")) { picoVec3_t vec; /* get r,g,b float values from ase */ if (!_pico_parse_vec( p,vec )) _ase_error_return("Material color parse error"); /* setup 0..255 range color values */ ambientColor[ 0 ] = (int)( vec[ 0 ] * 255.0 ); ambientColor[ 1 ] = (int)( vec[ 1 ] * 255.0 ); ambientColor[ 2 ] = (int)( vec[ 2 ] * 255.0 ); ambientColor[ 3 ] = (int)( 255 ); /* skip rest and continue with next token */ _pico_parse_skip_rest( p ); continue; } /* parse diffuse material color */ else if (!_pico_stricmp(p->token,"*material_diffuse")) { picoVec3_t vec; /* get r,g,b float values from ase */ if (!_pico_parse_vec( p,vec )) _ase_error_return("Material color parse error"); /* setup 0..255 range color */ diffuseColor[ 0 ] = (int)( vec[ 0 ] * 255.0 ); diffuseColor[ 1 ] = (int)( vec[ 1 ] * 255.0 ); diffuseColor[ 2 ] = (int)( vec[ 2 ] * 255.0 ); diffuseColor[ 3 ] = (int)( 255 ); /* skip rest and continue with next token */ _pico_parse_skip_rest( p ); continue; } /* parse specular material color */ else if (!_pico_stricmp(p->token,"*material_specular")) { picoVec3_t vec; /* get r,g,b float values from ase */ if (!_pico_parse_vec( p,vec )) _ase_error_return("Material color parse error"); /* setup 0..255 range color */ specularColor[ 0 ] = (int)( vec[ 0 ] * 255 ); specularColor[ 1 ] = (int)( vec[ 1 ] * 255 ); specularColor[ 2 ] = (int)( vec[ 2 ] * 255 ); specularColor[ 3 ] = (int)( 255 ); /* skip rest and continue with next token */ _pico_parse_skip_rest( p ); continue; } /* material diffuse map */ else if (!_pico_stricmp(p->token,"*map_diffuse") ) { int sublevel = 0; /* parse material block */ while( 1 ) { /* get next token */ if (_pico_parse(p,1) == NULL) break; if (!strlen(p->token)) continue; /* handle levels */ if (p->token[0] == '{') sublevel++; if (p->token[0] == '}') sublevel--; if (!sublevel) break; /* parse diffuse map bitmap */ if (!_pico_stricmp(p->token,"*bitmap")) { char* name = _pico_parse(p,0); if (name == NULL) _ase_error_return("Missing material map bitmap name"); mapname = _pico_alloc ( strlen ( name ) + 1 ); strcpy ( mapname, name ); /* skip rest and continue with next token */ _pico_parse_skip_rest( p ); continue; } } } /* end map_diffuse block */ } /* end material block */ if( subMaterial == NULL ) { /* allocate new pico shader */ shader = PicoNewShader( model ); if (shader == NULL) { PicoFreeModel( model ); return NULL; } /* set material name */ shadername_convert(materialName); PicoSetShaderName( shader,materialName ); /* set shader's transparency */ PicoSetShaderTransparency( shader,transValue ); /* set shader's ambient color */ PicoSetShaderAmbientColor( shader,ambientColor ); /* set diffuse alpha to transparency */ diffuseColor[3] = (picoByte_t)( transValue * 255.0 ); /* set shader's diffuse color */ PicoSetShaderDiffuseColor( shader,diffuseColor ); /* set shader's specular color */ PicoSetShaderSpecularColor( shader,specularColor ); /* set shader's shininess */ PicoSetShaderShininess( shader,shineValue ); /* set material map name */ PicoSetShaderMapName( shader, mapname ); /* extract shadername from bitmap path */ if(mapname != NULL) { char* p = mapname; /* convert to shader-name format */ shadername_convert(mapname); { /* remove extension */ char* last_period = strrchr(p, '.'); if(last_period != NULL) { *last_period = '\0'; } } /* find game root */ for(; *p != '\0'; ++p) { if(_pico_strnicmp(p, "quake", 5) == 0 || _pico_strnicmp(p, "doom", 4) == 0) { break; } } /* root-relative */ for(; *p != '\0'; ++p) { if(*p == '/') { ++p; break; } } /* game-relative */ for(; *p != '\0'; ++p) { if(*p == '/') { ++p; break; } } if(*p != '\0') { /* set material name */ PicoSetShaderName( shader,p ); } } /* this is just a material with 1 submaterial */ subMaterial = _ase_add_submaterial( &materials, index, 0, shader ); } /* ydnar: free mapname */ if( mapname != NULL ) _pico_free( mapname ); } // !_pico_stricmp ( "*material" ) /* skip unparsed rest of line and continue */ _pico_parse_skip_rest( p ); } /* ydnar: finish existing surface */ _ase_submit_triangles(model, materials, vertices, texcoords, colors, faces, numFaces); _pico_free(faces); _pico_free(vertices); _pico_free(texcoords); _pico_free(colors); #ifdef DEBUG_PM_ASE _ase_print_materials(materials); finish = clock(); elapsed = (double)(finish - start) / CLOCKS_PER_SEC; _pico_printf( PICO_NORMAL, "Loaded model in in %-.2f second(s)\n", elapsed ); #endif //DEBUG_PM_ASE _ase_free_materials(&materials); _pico_free_parser( p ); /* return allocated pico model */ return model; } /* pico file format module definition */ const picoModule_t picoModuleASE = { "1.0", /* module version string */ "Autodesk 3DSMAX ASCII", /* module display name */ "Jared Hefty, seaw0lf", /* author's name */ "2003 Jared Hefty, 2002 seaw0lf", /* module copyright */ { "ase",NULL,NULL,NULL /* default extensions to use */ }, _ase_canload, /* validation routine */ _ase_load, /* load routine */ NULL, /* save validation routine */ NULL /* save routine */ }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/pm_fm.c������������������������������������������������������������0000664�0000000�0000000�00000047051�12454246557�0020072�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* Nurail: Used pm_md3.c (Randy Reddig) as a template. */ /* marker */ #define PM_FM_C /* dependencies */ #include "pm_fm.h" //#define FM_VERBOSE_DBG 0 #undef FM_VERBOSE_DBG #undef FM_DBG typedef struct index_LUT_s { short Vert; short ST; struct index_LUT_s *next; } index_LUT_t; typedef struct index_DUP_LUT_s { short ST; short OldVert; } index_DUP_LUT_t; // _fm_canload() static int _fm_canload( PM_PARAMS_CANLOAD ) { fm_t fm; unsigned char *bb; int fm_file_pos; bb = (unsigned char *) buffer; // Header fm.fm_header_hdr = (fm_chunk_header_t *) bb; fm_file_pos = sizeof(fm_chunk_header_t) + fm.fm_header_hdr->size; #ifdef FM_VERBOSE_DBG _pico_printf( PICO_VERBOSE, "IDENT: %s\n", (unsigned char *) fm.fm_header_hdr->ident ); #endif if( (strcmp(fm.fm_header_hdr->ident, FM_HEADERCHUNKNAME)) ) { #ifdef FM_DBG _pico_printf( PICO_WARNING, "FM Header Ident incorrect\n"); #endif return PICO_PMV_ERROR_IDENT; } // check fm if( _pico_little_long( fm.fm_header_hdr->version ) != FM_HEADERCHUNKVER ) { #ifdef FM_DBG _pico_printf( PICO_WARNING, "FM Header Version incorrect\n"); #endif return PICO_PMV_ERROR_VERSION; } // Skin fm.fm_skin_hdr = (fm_chunk_header_t *) (bb + fm_file_pos); fm_file_pos += sizeof(fm_chunk_header_t) + fm.fm_skin_hdr->size; #ifdef FM_VERBOSE_DBG _pico_printf( PICO_VERBOSE, "SKIN: %s\n", (unsigned char *) fm.fm_skin_hdr->ident ); #endif if( (strcmp(fm.fm_skin_hdr->ident, FM_SKINCHUNKNAME)) ) { #ifdef FM_DBG _pico_printf( PICO_WARNING, "FM Skin Ident incorrect\n"); #endif return PICO_PMV_ERROR_IDENT; } // check fm if( _pico_little_long( fm.fm_skin_hdr->version ) != FM_SKINCHUNKVER ) { #ifdef FM_DBG _pico_printf( PICO_WARNING, "FM Skin Version incorrect\n"); #endif return PICO_PMV_ERROR_VERSION; } // st fm.fm_st_hdr = (fm_chunk_header_t *) (bb + fm_file_pos); fm_file_pos += sizeof(fm_chunk_header_t) + fm.fm_st_hdr->size; #ifdef FM_VERBOSE_DBG _pico_printf( PICO_VERBOSE, "ST: %s\n", (unsigned char *) fm.fm_st_hdr->ident ); #endif if( (strcmp(fm.fm_st_hdr->ident, FM_STCOORDCHUNKNAME)) ) { #ifdef FM_DBG _pico_printf( PICO_WARNING, "FM ST Ident incorrect\n"); #endif return PICO_PMV_ERROR_IDENT; } // check fm if( _pico_little_long( fm.fm_st_hdr->version ) != FM_STCOORDCHUNKVER ) { #ifdef FM_DBG _pico_printf( PICO_WARNING, "FM ST Version incorrect\n"); #endif return PICO_PMV_ERROR_VERSION; } // tri fm.fm_tri_hdr = (fm_chunk_header_t *) (bb + fm_file_pos); fm_file_pos += sizeof(fm_chunk_header_t) + fm.fm_tri_hdr->size; #ifdef FM_VERBOSE_DBG _pico_printf( PICO_VERBOSE, "TRI: %s\n", (unsigned char *) fm.fm_tri_hdr->ident ); #endif if( (strcmp(fm.fm_tri_hdr->ident, FM_TRISCHUNKNAME)) ) { #ifdef FM_DBG _pico_printf( PICO_WARNING, "FM Tri Ident incorrect\n"); #endif return PICO_PMV_ERROR_IDENT; } // check fm if( _pico_little_long( fm.fm_tri_hdr->version ) != FM_TRISCHUNKVER ) { #ifdef FM_DBG _pico_printf( PICO_WARNING, "FM Tri Version incorrect\n"); #endif return PICO_PMV_ERROR_VERSION; } // frame fm.fm_frame_hdr = (fm_chunk_header_t *) (bb + fm_file_pos); fm_file_pos += sizeof(fm_chunk_header_t); #ifdef FM_VERBOSE_DBG _pico_printf( PICO_VERBOSE, "FRAME: %s\n", (unsigned char *) fm.fm_frame_hdr->ident ); #endif if( (strcmp(fm.fm_frame_hdr->ident, FM_FRAMESCHUNKNAME)) ) { #ifdef FM_DBG _pico_printf( PICO_WARNING, "FM Frame Ident incorrect\n"); #endif return PICO_PMV_ERROR_IDENT; } // check fm if( _pico_little_long( fm.fm_frame_hdr->version ) != FM_FRAMESCHUNKVER ) { #ifdef FM_DBG _pico_printf( PICO_WARNING, "FM Frame Version incorrect\n"); #endif return PICO_PMV_ERROR_VERSION; } // file seems to be a valid fm return PICO_PMV_OK; } // _fm_load() loads a Heretic 2 model file. static picoModel_t *_fm_load( PM_PARAMS_LOAD ) { int i, j, dups, dup_index; int fm_file_pos; short tot_numVerts; index_LUT_t *p_index_LUT, *p_index_LUT2, *p_index_LUT3; index_DUP_LUT_t *p_index_LUT_DUPS; fm_vert_normal_t *vert; char skinname[FM_SKINPATHSIZE]; fm_t fm; fm_header_t *fm_head; fm_st_t *texCoord; fm_xyz_st_t *tri_verts; fm_xyz_st_t *triangle; fm_frame_t *frame; picoByte_t *bb; picoModel_t *picoModel; picoSurface_t *picoSurface; picoShader_t *picoShader; picoVec3_t xyz, normal; picoVec2_t st; picoColor_t color; bb = (picoByte_t*) buffer; // Header Header fm.fm_header_hdr = (fm_chunk_header_t *) bb; fm_file_pos = sizeof(fm_chunk_header_t) + fm.fm_header_hdr->size; if( (strcmp(fm.fm_header_hdr->ident, FM_HEADERCHUNKNAME)) ) { _pico_printf( PICO_WARNING, "FM Header Ident incorrect\n"); return NULL; } if( _pico_little_long( fm.fm_header_hdr->version ) != FM_HEADERCHUNKVER ) { _pico_printf( PICO_WARNING, "FM Header Version incorrect\n"); return NULL; } // Skin Header fm.fm_skin_hdr = (fm_chunk_header_t *) (bb + fm_file_pos); fm_file_pos += sizeof(fm_chunk_header_t) + fm.fm_skin_hdr->size; if( (strcmp(fm.fm_skin_hdr->ident, FM_SKINCHUNKNAME)) ) { _pico_printf( PICO_WARNING, "FM Skin Ident incorrect\n"); return NULL; } if( _pico_little_long( fm.fm_skin_hdr->version ) != FM_SKINCHUNKVER ) { _pico_printf( PICO_WARNING, "FM Skin Version incorrect\n"); return NULL; } // ST Header fm.fm_st_hdr = (fm_chunk_header_t *) (bb + fm_file_pos); fm_file_pos += sizeof(fm_chunk_header_t) + fm.fm_st_hdr->size; if( (strcmp(fm.fm_st_hdr->ident, FM_STCOORDCHUNKNAME)) ) { _pico_printf( PICO_WARNING, "FM ST Ident incorrect\n"); return NULL; } if( _pico_little_long( fm.fm_st_hdr->version ) != FM_STCOORDCHUNKVER ) { _pico_printf( PICO_WARNING, "FM ST Version incorrect\n"); return NULL; } // Tris Header fm.fm_tri_hdr = (fm_chunk_header_t *) (bb + fm_file_pos); fm_file_pos += sizeof(fm_chunk_header_t) + fm.fm_tri_hdr->size; if( (strcmp(fm.fm_tri_hdr->ident, FM_TRISCHUNKNAME)) ) { _pico_printf( PICO_WARNING, "FM Tri Ident incorrect\n"); return NULL; } if( _pico_little_long( fm.fm_tri_hdr->version ) != FM_TRISCHUNKVER ) { _pico_printf( PICO_WARNING, "FM Tri Version incorrect\n"); return NULL; } // Frame Header fm.fm_frame_hdr = (fm_chunk_header_t *) (bb + fm_file_pos); fm_file_pos += sizeof(fm_chunk_header_t); if( (strcmp(fm.fm_frame_hdr->ident, FM_FRAMESCHUNKNAME)) ) { _pico_printf( PICO_WARNING, "FM Frame Ident incorrect\n"); return NULL; } if( _pico_little_long( fm.fm_frame_hdr->version ) != FM_FRAMESCHUNKVER ) { _pico_printf( PICO_WARNING, "FM Frame Version incorrect\n"); return NULL; } // Header fm_file_pos = sizeof(fm_chunk_header_t); fm_head = fm.fm_header = (fm_header_t *) (bb + fm_file_pos); fm_file_pos += fm.fm_header_hdr->size; // Skin fm_file_pos += sizeof(fm_chunk_header_t); fm.fm_skin = (fm_skinpath_t *) (bb + fm_file_pos); fm_file_pos += fm.fm_skin_hdr->size; // ST fm_file_pos += sizeof(fm_chunk_header_t); texCoord = fm.fm_st = (fm_st_t *) (bb + fm_file_pos); fm_file_pos += fm.fm_st_hdr->size; // Tri fm_file_pos += sizeof(fm_chunk_header_t); tri_verts = fm.fm_tri = (fm_xyz_st_t *) (bb + fm_file_pos); fm_file_pos += fm.fm_tri_hdr->size; // Frame fm_file_pos += sizeof(fm_chunk_header_t); frame = fm.fm_frame = (fm_frame_t *) (bb + fm_file_pos); // do frame check if( fm_head->numFrames < 1 ) { _pico_printf( PICO_ERROR, "%s has 0 frames!", fileName ); return NULL; } if( frameNum < 0 || frameNum >= fm_head->numFrames ) { _pico_printf( PICO_ERROR, "Invalid or out-of-range FM frame specified" ); return NULL; } // swap fm fm_head->skinWidth = _pico_little_long( fm_head->skinWidth ); fm_head->skinHeight = _pico_little_long( fm_head->skinHeight ); fm_head->frameSize = _pico_little_long( fm_head->frameSize ); fm_head->numSkins = _pico_little_long( fm_head->numSkins ); fm_head->numXYZ = _pico_little_long( fm_head->numXYZ ); fm_head->numST = _pico_little_long( fm_head->numST ); fm_head->numTris = _pico_little_long( fm_head->numTris ); fm_head->numGLCmds = _pico_little_long( fm_head->numGLCmds ); fm_head->numFrames = _pico_little_long( fm_head->numFrames ); // swap frame scale and translation for( i = 0; i < 3; i++ ) { frame->header.scale[ i ] = _pico_little_float( frame->header.scale[ i ] ); frame->header.translate[ i ] = _pico_little_float( frame->header.translate[ i ] ); } // swap triangles triangle = tri_verts; for( i = 0; i < fm_head->numTris; i++, triangle++ ) { for( j = 0; j < 3; j++ ) { triangle->index_xyz[ j ] = _pico_little_short( triangle->index_xyz[ j ] ); triangle->index_st[ j ] = _pico_little_short( triangle->index_st[ j ] ); } } // swap st coords for( i = 0; i < fm_head->numST; i++ ) { texCoord->s = _pico_little_short( texCoord[i].s ); texCoord->t = _pico_little_short( texCoord[i].t ); } // set Skin Name strncpy(skinname, fm.fm_skin->path, FM_SKINPATHSIZE ); #ifdef FM_VERBOSE_DBG // Print out md2 values _pico_printf(PICO_VERBOSE,"numSkins->%d numXYZ->%d numST->%d numTris->%d numFrames->%d\nSkin Name \"%s\"\n", fm_head->numSkins, fm_head->numXYZ, fm_head->numST, fm_head->numTris, fm_head->numFrames, &skinname ); #endif // detox Skin name _pico_setfext( skinname, "" ); _pico_unixify( skinname ); /* create new pico model */ picoModel = PicoNewModel(); if( picoModel == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model" ); return NULL; } /* do model setup */ PicoSetModelFrameNum( picoModel, frameNum ); PicoSetModelNumFrames( picoModel, fm_head->numFrames ); /* sea */ PicoSetModelName( picoModel, fileName ); PicoSetModelFileName( picoModel, fileName ); // allocate new pico surface picoSurface = PicoNewSurface( picoModel ); if( picoSurface == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model surface" ); PicoFreeModel( picoModel ); return NULL; } PicoSetSurfaceType( picoSurface, PICO_TRIANGLES ); PicoSetSurfaceName( picoSurface, frame->header.name ); picoShader = PicoNewShader( picoModel ); if( picoShader == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model shader" ); PicoFreeModel( picoModel ); return NULL; } PicoSetShaderName( picoShader, skinname ); // associate current surface with newly created shader PicoSetSurfaceShader( picoSurface, picoShader ); // Init LUT for Verts p_index_LUT = (index_LUT_t *)_pico_alloc(sizeof(index_LUT_t) * fm_head->numXYZ); for(i=0; inumXYZ; i++) { p_index_LUT[i].Vert = -1; p_index_LUT[i].ST = -1; p_index_LUT[i].next = NULL; } // Fill in Look Up Table, and allocate/fill Linked List from vert array as needed for dup STs per Vert. tot_numVerts = fm_head->numXYZ; dups = 0; triangle = tri_verts; for(i=0; inumTris; i++) { for(j=0; j<3; j++) { if (p_index_LUT[triangle->index_xyz[j]].ST == -1) // No Main Entry p_index_LUT[triangle->index_xyz[j]].ST = triangle->index_st[j]; else if (triangle->index_st[j] == p_index_LUT[triangle->index_xyz[j]].ST ) // Equal to Main Entry { #ifdef FM_VERBOSE_DBG _pico_printf( PICO_NORMAL, "-> Tri #%d, Vert %d:\t XYZ:%d ST:%d\n", i, j, triangle->index_xyz[j], triangle->index_st[j]); #endif continue; } else if ( (p_index_LUT[triangle->index_xyz[j]].next == NULL) ) // Not equal to Main entry, and no LL entry { // Add first entry of LL from Main p_index_LUT2 = (index_LUT_t *)_pico_alloc(sizeof(index_LUT_t)); if (p_index_LUT2 == NULL) _pico_printf( PICO_NORMAL, " Couldn't allocate memory!\n"); p_index_LUT[triangle->index_xyz[j]].next = (index_LUT_t *)p_index_LUT2; p_index_LUT2->Vert = dups; p_index_LUT2->ST = triangle->index_st[j]; p_index_LUT2->next = NULL; #ifdef FM_VERBOSE_DBG _pico_printf( PICO_NORMAL, " ADDING first LL XYZ:%d DUP:%d ST:%d\n", triangle->index_xyz[j], dups, triangle->index_st[j]); #endif triangle->index_xyz[j] = dups + fm_head->numXYZ; // Make change in Tri hunk dups++; } else // Try to find in LL from Main Entry { p_index_LUT3 = p_index_LUT2 = p_index_LUT[triangle->index_xyz[j]].next; while ( (p_index_LUT2 != NULL) && (triangle->index_xyz[j] != p_index_LUT2->Vert) ) // Walk down LL { p_index_LUT3 = p_index_LUT2; p_index_LUT2 = p_index_LUT2->next; } p_index_LUT2 = p_index_LUT3; if ( triangle->index_st[j] == p_index_LUT2->ST ) // Found it { triangle->index_xyz[j] = p_index_LUT2->Vert + fm_head->numXYZ; // Make change in Tri hunk #ifdef FM_VERBOSE_DBG _pico_printf( PICO_NORMAL, "--> Tri #%d, Vert %d:\t XYZ:%d ST:%d\n", i, j, triangle->index_xyz[j], triangle->index_st[j]); #endif continue; } if ( p_index_LUT2->next == NULL) // Didn't find it. Add entry to LL. { // Add the Entry p_index_LUT3 = (index_LUT_t *)_pico_alloc(sizeof(index_LUT_t)); if (p_index_LUT3 == NULL) _pico_printf( PICO_NORMAL, " Couldn't allocate memory!\n"); p_index_LUT2->next = (index_LUT_t *)p_index_LUT3; p_index_LUT3->Vert = dups; p_index_LUT3->ST = triangle->index_st[j]; p_index_LUT3->next = NULL; #ifdef FM_VERBOSE_DBG _pico_printf( PICO_NORMAL, " ADDING additional LL XYZ:%d DUP:%d NewXYZ:%d ST:%d\n", triangle->index_xyz[j], dups, dups + (fm_head->numXYZ), triangle->index_st[j]); #endif triangle->index_xyz[j] = dups + fm_head->numXYZ; // Make change in Tri hunk dups++; } } #ifdef FM_VERBOSE_DBG _pico_printf( PICO_NORMAL, "---> Tri #%d, Vert %d:\t XYZ:%d ST:%d\n", i, j, triangle->index_xyz[j], triangle->index_st[j]); #endif } triangle++; } // malloc and build array for Dup STs p_index_LUT_DUPS = (index_DUP_LUT_t *)_pico_alloc(sizeof(index_DUP_LUT_t) * dups); if (p_index_LUT_DUPS == NULL) _pico_printf( PICO_NORMAL, " Couldn't allocate memory!\n"); dup_index = 0; for(i=0; inumXYZ; i++) { p_index_LUT2 = p_index_LUT[i].next; while (p_index_LUT2 != NULL) { p_index_LUT_DUPS[p_index_LUT2->Vert].OldVert = i; p_index_LUT_DUPS[p_index_LUT2->Vert].ST = p_index_LUT2->ST; dup_index++; p_index_LUT2 = p_index_LUT2->next; } } #ifdef FM_VERBOSE_DBG _pico_printf( PICO_NORMAL, " Dups = %d\n", dups); _pico_printf( PICO_NORMAL, " Dup Index = %d\n", dup_index); #endif for(i=0; inumXYZ; i++) { #ifdef FM_VERBOSE_DBG _pico_printf( PICO_NORMAL, "Vert: %4d\t%4d",i, p_index_LUT[i].ST); #endif if (p_index_LUT[i].next != NULL) { p_index_LUT2 = p_index_LUT[i].next; do { #ifdef FM_VERBOSE_DBG _pico_printf( PICO_NORMAL, " %4d %4d", p_index_LUT2->Vert, p_index_LUT2->ST); #endif p_index_LUT2 = p_index_LUT2->next; } while ( p_index_LUT2 != NULL); } #ifdef FM_VERBOSE_DBG _pico_printf( PICO_NORMAL, "\n"); #endif } #ifdef FM_VERBOSE_DBG for(i=0; inumTris; i++) { for(j=0; j<3; j++) _pico_printf( PICO_NORMAL, "Tri #%d, Vert %d:\t XYZ:%d ST:%d\n", i, j, triangle->index_xyz[j], triangle->index_st[j]); _pico_printf( PICO_NORMAL, "\n"); triangle++; } #endif // Build Picomodel triangle = tri_verts; for( j = 0; j < fm_head->numTris; j++, triangle++ ) { PicoSetSurfaceIndex( picoSurface, j*3 , triangle->index_xyz[0] ); PicoSetSurfaceIndex( picoSurface, j*3+1 , triangle->index_xyz[1] ); PicoSetSurfaceIndex( picoSurface, j*3+2 , triangle->index_xyz[2] ); } vert = (fm_vert_normal_t*) ((picoByte_t*) (frame->verts) ); for(i=0; i< fm_head->numXYZ; i++, vert++) { /* set vertex origin */ xyz[ 0 ] = vert->v[0] * frame->header.scale[0] + frame->header.translate[0]; xyz[ 1 ] = vert->v[1] * frame->header.scale[1] + frame->header.translate[1]; xyz[ 2 ] = vert->v[2] * frame->header.scale[2] + frame->header.translate[2]; PicoSetSurfaceXYZ( picoSurface, i , xyz ); /* set normal */ normal[ 0 ] = fm_normals[vert->lightnormalindex][0]; normal[ 1 ] = fm_normals[vert->lightnormalindex][1]; normal[ 2 ] = fm_normals[vert->lightnormalindex][2]; PicoSetSurfaceNormal( picoSurface, i , normal ); /* set st coords */ st[ 0 ] = ((texCoord[p_index_LUT[i].ST].s) / ((float)fm_head->skinWidth)); st[ 1 ] = (texCoord[p_index_LUT[i].ST].t / ((float)fm_head->skinHeight)); PicoSetSurfaceST( picoSurface, 0, i , st ); } if (dups) { for(i=0; iverts[j].v[0] * frame->header.scale[0] + frame->header.translate[0]; xyz[ 1 ] = frame->verts[j].v[1] * frame->header.scale[1] + frame->header.translate[1]; xyz[ 2 ] = frame->verts[j].v[2] * frame->header.scale[2] + frame->header.translate[2]; PicoSetSurfaceXYZ( picoSurface, i + fm_head->numXYZ , xyz ); /* set normal */ normal[ 0 ] = fm_normals[frame->verts[j].lightnormalindex][0]; normal[ 1 ] = fm_normals[frame->verts[j].lightnormalindex][1]; normal[ 2 ] = fm_normals[frame->verts[j].lightnormalindex][2]; PicoSetSurfaceNormal( picoSurface, i + fm_head->numXYZ , normal ); /* set st coords */ st[ 0 ] = ((texCoord[p_index_LUT_DUPS[i].ST].s) / ((float)fm_head->skinWidth)); st[ 1 ] = (texCoord[p_index_LUT_DUPS[i].ST].t / ((float)fm_head->skinHeight)); PicoSetSurfaceST( picoSurface, 0, i + fm_head->numXYZ , st ); } } /* set color */ PicoSetSurfaceColor( picoSurface, 0, 0, color ); // Free up malloc'ed LL entries for(i=0; inumXYZ; i++) { if(p_index_LUT[i].next != NULL) { p_index_LUT2 = p_index_LUT[i].next; do { p_index_LUT3 = p_index_LUT2->next; _pico_free(p_index_LUT2); p_index_LUT2 = p_index_LUT3; dups--; } while (p_index_LUT2 != NULL); } } if (dups) _pico_printf(PICO_WARNING, " Not all LL mallocs freed\n"); // Free malloc'ed LUTs _pico_free(p_index_LUT); _pico_free(p_index_LUT_DUPS); /* return the new pico model */ return picoModel; } /* pico file format module definition */ const picoModule_t picoModuleFM = { "0.85", /* module version string */ "Heretic 2 FM", /* module display name */ "Nurail", /* author's name */ "2003 Nurail", /* module copyright */ { "fm", NULL, NULL, NULL /* default extensions to use */ }, _fm_canload, /* validation routine */ _fm_load, /* load routine */ NULL, /* save validation routine */ NULL /* save routine */ }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/pm_fm.h������������������������������������������������������������0000664�0000000�0000000�00000026645�12454246557�0020105�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ // This header file is based from the following: /* FlexModel.H - Header file for FlexModel file structure By Chris Burke serotonin@earthlink.net */ #ifndef __PM_FM_H__ #define __PM_FM_H__ #include "picointernal.h" // // Absolute limits (from QData / QMView source) // #define MAX_FM_TRIANGLES 2048 #define MAX_FM_VERTS 2048 #define MAX_FM_FRAMES 2048 #define MAX_FM_SKINS 64 #define MAX_FM_SKINNAME 64 #define MAX_FM_MESH_NODES 16 #define DTRIVERTX_V0 0 #define DTRIVERTX_V1 1 #define DTRIVERTX_V2 2 #define DTRIVERTX_LNI 3 #define DTRIVERTX_SIZE 4 #define SKINPAGE_WIDTH 640 #define SKINPAGE_HEIGHT 480 #define ENCODED_WIDTH_X 92 #define ENCODED_WIDTH_Y 475 #define ENCODED_HEIGHT_X 128 #define ENCODED_HEIGHT_Y 475 #define SCALE_ADJUST_FACTOR 0.96 #define INFO_HEIGHT 5 #define INFO_Y (SKINPAGE_HEIGHT-INFO_HEIGHT) #ifndef byte #define byte unsigned char #endif // // Generic header on every chunk // #define FM_MAXCHUNKIDENT 32L typedef struct { char ident[FM_MAXCHUNKIDENT]; unsigned int version; unsigned int size; } fm_chunk_header_t; // // The format of the "header" chunk // #define FM_HEADERCHUNKNAME "header" #define FM_HEADERCHUNKVER 2 #define FM_HEADERCHUNKSIZE 40 typedef struct { int skinWidth; // in pixels int skinHeight; // in pixels int frameSize; // size of each frame (in bytes) int numSkins; // number of skins int numXYZ; // number of unique vertices in 3D space int numST; // number of unique vertices in texture space int numTris; // number of unique triangles int numGLCmds; // # 32-bit elements in strip/fan command list int numFrames; // number of animation frames int numMeshNodes; // number of mesh nodes } fm_header_t; // // The format of an entry in the "skin" chunk. // The number of entries is given in the fmheader chunk // #define FM_SKINCHUNKNAME "skin" #define FM_SKINCHUNKVER 1 #define FM_MAXPATHLENGTH 64L #define FM_SKINPATHSIZE (FM_MAXPATHLENGTH) typedef struct { char path[FM_SKINPATHSIZE]; // path, relative to 'base' } fm_skinpath_t; // // The format of the "st coord" chunk. This is a list // of unique skin texture (u, v) coordinates to be mapped // to verteces of the model // #define FM_STCOORDCHUNKNAME "st coord" #define FM_STCOORDCHUNKVER 1 #define FM_STCOORDUVSIZE (2L + 2L) typedef struct { short s; short t; } fm_st_t; // // The format of the "tris" chunk. This is a list of vertex indeces // in 3D space, and the corresponding vertex indeces in texture space. // #define FM_TRISCHUNKNAME "tris" #define FM_TRISCHUNKVER 1 #define FM_TRISINFOSIZE (2L*3 + 2L*3) typedef struct { short index_xyz[3]; short index_st[3]; } fm_xyz_st_t; // // The format of the "frames" chunk. This is a list of animation // frames, each specifying the coordinates and "light normal" index // of every vertex of the model in 3D space. // #define FM_FRAMESCHUNKNAME "frames" #define FM_FRAMESCHUNKVER 1 #define FM_NUMVERTEXNORMALS 162 // Frame info typedef struct { byte v[3]; // scaled by header info byte lightnormalindex; // index in canned table of closest vertex normal } fm_vert_normal_t; typedef struct { float scale[3]; // multiply byte verts by this float translate[3]; // then add this char name[16]; // frame name } fm_framehdr_t; typedef struct { fm_framehdr_t header; // One header per frame fm_vert_normal_t verts[1]; // variable number of these } fm_frame_t; typedef struct { fm_chunk_header_t *fm_header_hdr; fm_header_t *fm_header; fm_chunk_header_t *fm_skin_hdr; fm_skinpath_t *fm_skin; fm_chunk_header_t *fm_st_hdr; fm_st_t *fm_st; fm_chunk_header_t *fm_tri_hdr; fm_xyz_st_t *fm_tri; fm_chunk_header_t *fm_frame_hdr; fm_frame_t *fm_frame; } fm_t; float fm_normals[FM_NUMVERTEXNORMALS][3] = { {-0.525731f, 0.000000f, 0.850651f}, {-0.442863f, 0.238856f, 0.864188f}, {-0.295242f, 0.000000f, 0.955423f}, {-0.309017f, 0.500000f, 0.809017f}, {-0.162460f, 0.262866f, 0.951056f}, {0.000000f, 0.000000f, 1.000000f}, {0.000000f, 0.850651f, 0.525731f}, {-0.147621f, 0.716567f, 0.681718f}, {0.147621f, 0.716567f, 0.681718f}, {0.000000f, 0.525731f, 0.850651f}, {0.309017f, 0.500000f, 0.809017f}, {0.525731f, 0.000000f, 0.850651f}, {0.295242f, 0.000000f, 0.955423f}, {0.442863f, 0.238856f, 0.864188f}, {0.162460f, 0.262866f, 0.951056f}, {-0.681718f, 0.147621f, 0.716567f}, {-0.809017f, 0.309017f, 0.500000f}, {-0.587785f, 0.425325f, 0.688191f}, {-0.850651f, 0.525731f, 0.000000f}, {-0.864188f, 0.442863f, 0.238856f}, {-0.716567f, 0.681718f, 0.147621f}, {-0.688191f, 0.587785f, 0.425325f}, {-0.500000f, 0.809017f, 0.309017f}, {-0.238856f, 0.864188f, 0.442863f}, {-0.425325f, 0.688191f, 0.587785f}, {-0.716567f, 0.681718f, -0.147621f}, {-0.500000f, 0.809017f, -0.309017f}, {-0.525731f, 0.850651f, 0.000000f}, {0.000000f, 0.850651f, -0.525731f}, {-0.238856f, 0.864188f, -0.442863f}, {0.000000f, 0.955423f, -0.295242f}, {-0.262866f, 0.951056f, -0.162460f}, {0.000000f, 1.000000f, 0.000000f}, {0.000000f, 0.955423f, 0.295242f}, {-0.262866f, 0.951056f, 0.162460f}, {0.238856f, 0.864188f, 0.442863f}, {0.262866f, 0.951056f, 0.162460f}, {0.500000f, 0.809017f, 0.309017f}, {0.238856f, 0.864188f, -0.442863f}, {0.262866f, 0.951056f, -0.162460f}, {0.500000f, 0.809017f, -0.309017f}, {0.850651f, 0.525731f, 0.000000f}, {0.716567f, 0.681718f, 0.147621f}, {0.716567f, 0.681718f, -0.147621f}, {0.525731f, 0.850651f, 0.000000f}, {0.425325f, 0.688191f, 0.587785f}, {0.864188f, 0.442863f, 0.238856f}, {0.688191f, 0.587785f, 0.425325f}, {0.809017f, 0.309017f, 0.500000f}, {0.681718f, 0.147621f, 0.716567f}, {0.587785f, 0.425325f, 0.688191f}, {0.955423f, 0.295242f, 0.000000f}, {1.000000f, 0.000000f, 0.000000f}, {0.951056f, 0.162460f, 0.262866f}, {0.850651f, -0.525731f, 0.000000f}, {0.955423f, -0.295242f, 0.000000f}, {0.864188f, -0.442863f, 0.238856f}, {0.951056f, -0.162460f, 0.262866f}, {0.809017f, -0.309017f, 0.500000f}, {0.681718f, -0.147621f, 0.716567f}, {0.850651f, 0.000000f, 0.525731f}, {0.864188f, 0.442863f, -0.238856f}, {0.809017f, 0.309017f, -0.500000f}, {0.951056f, 0.162460f, -0.262866f}, {0.525731f, 0.000000f, -0.850651f}, {0.681718f, 0.147621f, -0.716567f}, {0.681718f, -0.147621f, -0.716567f}, {0.850651f, 0.000000f, -0.525731f}, {0.809017f, -0.309017f, -0.500000f}, {0.864188f, -0.442863f, -0.238856f}, {0.951056f, -0.162460f, -0.262866f}, {0.147621f, 0.716567f, -0.681718f}, {0.309017f, 0.500000f, -0.809017f}, {0.425325f, 0.688191f, -0.587785f}, {0.442863f, 0.238856f, -0.864188f}, {0.587785f, 0.425325f, -0.688191f}, {0.688191f, 0.587785f, -0.425325f}, {-0.147621f, 0.716567f, -0.681718f}, {-0.309017f, 0.500000f, -0.809017f}, {0.000000f, 0.525731f, -0.850651f}, {-0.525731f, 0.000000f, -0.850651f}, {-0.442863f, 0.238856f, -0.864188f}, {-0.295242f, 0.000000f, -0.955423f}, {-0.162460f, 0.262866f, -0.951056f}, {0.000000f, 0.000000f, -1.000000f}, {0.295242f, 0.000000f, -0.955423f}, {0.162460f, 0.262866f, -0.951056f}, {-0.442863f, -0.238856f, -0.864188f}, {-0.309017f, -0.500000f, -0.809017f}, {-0.162460f, -0.262866f, -0.951056f}, {0.000000f, -0.850651f, -0.525731f}, {-0.147621f, -0.716567f, -0.681718f}, {0.147621f, -0.716567f, -0.681718f}, {0.000000f, -0.525731f, -0.850651f}, {0.309017f, -0.500000f, -0.809017f}, {0.442863f, -0.238856f, -0.864188f}, {0.162460f, -0.262866f, -0.951056f}, {0.238856f, -0.864188f, -0.442863f}, {0.500000f, -0.809017f, -0.309017f}, {0.425325f, -0.688191f, -0.587785f}, {0.716567f, -0.681718f, -0.147621f}, {0.688191f, -0.587785f, -0.425325f}, {0.587785f, -0.425325f, -0.688191f}, {0.000000f, -0.955423f, -0.295242f}, {0.000000f, -1.000000f, 0.000000f}, {0.262866f, -0.951056f, -0.162460f}, {0.000000f, -0.850651f, 0.525731f}, {0.000000f, -0.955423f, 0.295242f}, {0.238856f, -0.864188f, 0.442863f}, {0.262866f, -0.951056f, 0.162460f}, {0.500000f, -0.809017f, 0.309017f}, {0.716567f, -0.681718f, 0.147621f}, {0.525731f, -0.850651f, 0.000000f}, {-0.238856f, -0.864188f, -0.442863f}, {-0.500000f, -0.809017f, -0.309017f}, {-0.262866f, -0.951056f, -0.162460f}, {-0.850651f, -0.525731f, 0.000000f}, {-0.716567f, -0.681718f, -0.147621f}, {-0.716567f, -0.681718f, 0.147621f}, {-0.525731f, -0.850651f, 0.000000f}, {-0.500000f, -0.809017f, 0.309017f}, {-0.238856f, -0.864188f, 0.442863f}, {-0.262866f, -0.951056f, 0.162460f}, {-0.864188f, -0.442863f, 0.238856f}, {-0.809017f, -0.309017f, 0.500000f}, {-0.688191f, -0.587785f, 0.425325f}, {-0.681718f, -0.147621f, 0.716567f}, {-0.442863f, -0.238856f, 0.864188f}, {-0.587785f, -0.425325f, 0.688191f}, {-0.309017f, -0.500000f, 0.809017f}, {-0.147621f, -0.716567f, 0.681718f}, {-0.425325f, -0.688191f, 0.587785f}, {-0.162460f, -0.262866f, 0.951056f}, {0.442863f, -0.238856f, 0.864188f}, {0.162460f, -0.262866f, 0.951056f}, {0.309017f, -0.500000f, 0.809017f}, {0.147621f, -0.716567f, 0.681718f}, {0.000000f, -0.525731f, 0.850651f}, {0.425325f, -0.688191f, 0.587785f}, {0.587785f, -0.425325f, 0.688191f}, {0.688191f, -0.587785f, 0.425325f}, {-0.955423f, 0.295242f, 0.000000f}, {-0.951056f, 0.162460f, 0.262866f}, {-1.000000f, 0.000000f, 0.000000f}, {-0.850651f, 0.000000f, 0.525731f}, {-0.955423f, -0.295242f, 0.000000f}, {-0.951056f, -0.162460f, 0.262866f}, {-0.864188f, 0.442863f, -0.238856f}, {-0.951056f, 0.162460f, -0.262866f}, {-0.809017f, 0.309017f, -0.500000f}, {-0.864188f, -0.442863f, -0.238856f}, {-0.951056f, -0.162460f, -0.262866f}, {-0.809017f, -0.309017f, -0.500000f}, {-0.681718f, 0.147621f, -0.716567f}, {-0.681718f, -0.147621f, -0.716567f}, {-0.850651f, 0.000000f, -0.525731f}, {-0.688191f, 0.587785f, -0.425325f}, {-0.587785f, 0.425325f, -0.688191f}, {-0.425325f, 0.688191f, -0.587785f}, {-0.425325f, -0.688191f, -0.587785f}, {-0.587785f, -0.425325f, -0.688191f}, {-0.688191f, -0.587785f, -0.425325f}, }; #endif �������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/pm_lwo.c�����������������������������������������������������������0000664�0000000�0000000�00000031527�12454246557�0020272�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #define PM_LWO_C /* dependencies */ #include "picointernal.h" #include "lwo/lwo2.h" /* uncomment when debugging this module */ /*#define DEBUG_PM_LWO*/ #ifdef DEBUG_PM_LWO #include "time.h" #endif /* helper functions */ static const char *lwo_lwIDToStr( unsigned int lwID ) { static char lwIDStr[5]; if (!lwID) { return "n/a"; } lwIDStr[ 0 ] = (char)((lwID) >> 24); lwIDStr[ 1 ] = (char)((lwID) >> 16); lwIDStr[ 2 ] = (char)((lwID) >> 8); lwIDStr[ 3 ] = (char)((lwID)); lwIDStr[ 4 ] = '\0'; return lwIDStr; } /* _lwo_canload() validates a LightWave Object model file. btw, i use the preceding underscore cause it's a static func referenced by one structure only. */ static int _lwo_canload( PM_PARAMS_CANLOAD ) { picoMemStream_t *s; unsigned int failID = 0; int failpos = -1; int ret; /* create a new pico memorystream */ s = _pico_new_memstream( (picoByte_t *)buffer, bufSize ); if (s == NULL) { return PICO_PMV_ERROR_MEMORY; } ret = lwValidateObject( fileName, s, &failID, &failpos ); _pico_free_memstream( s ); return ret; } /* _lwo_load() loads a LightWave Object model file. */ static picoModel_t *_lwo_load( PM_PARAMS_LOAD ) { picoMemStream_t *s; unsigned int failID = 0; int failpos = -1; lwObject *obj; lwSurface *surface; lwLayer *layer; lwPoint *pt; lwPolygon *pol; lwPolVert *v; lwVMapPt *vm; char name[ 256 ]; int i, j, k, numverts; picoModel_t *picoModel; picoSurface_t *picoSurface; picoShader_t *picoShader; picoVec3_t xyz, normal; picoVec2_t st; picoColor_t color; int defaultSTAxis[ 2 ]; picoVec2_t defaultXYZtoSTScale; picoVertexCombinationHash_t **hashTable; picoVertexCombinationHash_t *vertexCombinationHash; int surfacePolyCount; #ifdef DEBUG_PM_LWO clock_t load_start, load_finish, convert_start, convert_finish; double load_elapsed, convert_elapsed; load_start = clock(); #endif /* do frame check */ if( frameNum < 0 || frameNum >= 1 ) { _pico_printf( PICO_ERROR, "Invalid or out-of-range LWO frame specified" ); return NULL; } /* create a new pico memorystream */ s = _pico_new_memstream( (picoByte_t *)buffer, bufSize ); if (s == NULL) { return NULL; } obj = lwGetObject( fileName, s, &failID, &failpos ); _pico_free_memstream( s ); if( !obj ) { _pico_printf( PICO_ERROR, "Couldn't load LWO file, failed on ID '%s', position %d", lwo_lwIDToStr( failID ), failpos ); return NULL; } #ifdef DEBUG_PM_LWO convert_start = load_finish = clock(); load_elapsed = (double)(load_finish - load_start) / CLOCKS_PER_SEC; #endif /* ------------------------------------------------- pico model creation ------------------------------------------------- */ /* create a new pico model */ picoModel = PicoNewModel(); if (picoModel == NULL) { _pico_printf( PICO_ERROR, "Unable to allocate a new model" ); return NULL; } /* do model setup */ PicoSetModelFrameNum( picoModel, frameNum ); PicoSetModelNumFrames( picoModel, 1 ); PicoSetModelName( picoModel, fileName ); PicoSetModelFileName( picoModel, fileName ); /* create all polygons from layer[ 0 ] that belong to this surface */ layer = &obj->layer[0]; /* warn the user that other layers are discarded */ if (obj->nlayers > 1) { _pico_printf( PICO_WARNING, "LWO loader discards any geometry data not in Layer 1 (%d layers found)", obj->nlayers ); } /* initialize dummy normal */ normal[ 0 ] = normal[ 1 ] = normal[ 2 ] = 0.f; /* setup default st map */ st[ 0 ] = st[ 1 ] = 0.f; /* st[0] holds max, st[1] holds max par one */ defaultSTAxis[ 0 ] = 0; defaultSTAxis[ 1 ] = 1; for( i = 0; i < 3; i++ ) { float min = layer->bbox[ i ]; float max = layer->bbox[ i + 3 ]; float size = max - min; if (size > st[ 0 ]) { defaultSTAxis[ 1 ] = defaultSTAxis[ 0 ]; defaultSTAxis[ 0 ] = i; st[ 1 ] = st[ 0 ]; st[ 0 ] = size; } else if (size > st[ 1 ]) { defaultSTAxis[ 1 ] = i; st[ 1 ] = size; } } defaultXYZtoSTScale[ 0 ] = 4.f / st[ 0 ]; defaultXYZtoSTScale[ 1 ] = 4.f / st[ 1 ]; /* LWO surfaces become pico surfaces */ surface = obj->surf; while (surface) { /* allocate new pico surface */ picoSurface = PicoNewSurface( picoModel ); if (picoSurface == NULL) { _pico_printf( PICO_ERROR, "Unable to allocate a new model surface" ); PicoFreeModel( picoModel ); lwFreeObject( obj ); return NULL; } /* LWO model surfaces are all triangle meshes */ PicoSetSurfaceType( picoSurface, PICO_TRIANGLES ); /* set surface name */ PicoSetSurfaceName( picoSurface, surface->name ); /* create new pico shader */ picoShader = PicoNewShader( picoModel ); if (picoShader == NULL) { _pico_printf( PICO_ERROR, "Unable to allocate a new model shader" ); PicoFreeModel( picoModel ); lwFreeObject( obj ); return NULL; } /* detox and set shader name */ strncpy( name, surface->name, sizeof(name) ); _pico_first_token( name ); _pico_setfext( name, "" ); _pico_unixify( name ); PicoSetShaderName( picoShader, name ); /* associate current surface with newly created shader */ PicoSetSurfaceShader( picoSurface, picoShader ); /* copy indices and vertex data */ numverts = 0; hashTable = PicoNewVertexCombinationHashTable(); if (hashTable == NULL) { _pico_printf( PICO_ERROR, "Unable to allocate hash table" ); PicoFreeModel( picoModel ); lwFreeObject( obj ); return NULL; } /* Local polygon index for this surface. We don't want to use i in the loop * since that is the global poly index for the entire layer */ surfacePolyCount = 0; for( i = 0, pol = layer->polygon.pol; i < layer->polygon.count; i++, pol++ ) { /* does this polygon belong to this surface? */ if (pol->surf != surface) continue; /* we only support polygons of the FACE type */ if (pol->type != ID_FACE) { _pico_printf( PICO_WARNING, "LWO loader discarded a polygon because it's type != FACE (%s)", lwo_lwIDToStr( pol->type ) ); continue; } /* NOTE: LWO has support for non-convex polygons, do we want to store them as well? */ if (pol->nverts != 3) { _pico_printf( PICO_WARNING, "LWO loader discarded a polygon because it has != 3 verts (%d)", pol->nverts ); continue; } /* We haven't discarded this polygon, so bump the surface polycount */ surfacePolyCount++; for( j = 0, v = pol->v; j < 3; j++, v++ ) { pt = &layer->point.pt[ v->index ]; /* setup data */ xyz[ 0 ] = pt->pos[ 0 ]; xyz[ 1 ] = pt->pos[ 2 ]; xyz[ 2 ] = pt->pos[ 1 ]; /* doom3 lwo data doesn't seem to have smoothing-angle information */ #if 0 if(surface->smooth <= 0) { /* use face normals */ normal[ 0 ] = v->norm[ 0 ]; normal[ 1 ] = v->norm[ 2 ]; normal[ 2 ] = v->norm[ 1 ]; } else #endif { /* smooth normals later */ normal[ 0 ] = 0; normal[ 1 ] = 0; normal[ 2 ] = 0; } st[ 0 ] = xyz[ defaultSTAxis[ 0 ] ] * defaultXYZtoSTScale[ 0 ]; st[ 1 ] = xyz[ defaultSTAxis[ 1 ] ] * defaultXYZtoSTScale[ 1 ]; color[ 0 ] = (picoByte_t)(surface->color.rgb[ 0 ] * surface->diffuse.val * 0xFF); color[ 1 ] = (picoByte_t)(surface->color.rgb[ 1 ] * surface->diffuse.val * 0xFF); color[ 2 ] = (picoByte_t)(surface->color.rgb[ 2 ] * surface->diffuse.val * 0xFF); color[ 3 ] = 0xFF; /* set from points */ for( k = 0, vm = pt->vm; k < pt->nvmaps; k++, vm++ ) { if (vm->vmap->type == LWID_('T','X','U','V')) { /* set st coords */ st[ 0 ] = vm->vmap->val[ vm->index ][ 0 ]; st[ 1 ] = 1.f - vm->vmap->val[ vm->index ][ 1 ]; } else if (vm->vmap->type == LWID_('R','G','B','A')) { /* set rgba */ color[ 0 ] = (picoByte_t)(vm->vmap->val[ vm->index ][ 0 ] * surface->color.rgb[ 0 ] * surface->diffuse.val * 0xFF); color[ 1 ] = (picoByte_t)(vm->vmap->val[ vm->index ][ 1 ] * surface->color.rgb[ 1 ] * surface->diffuse.val * 0xFF); color[ 2 ] = (picoByte_t)(vm->vmap->val[ vm->index ][ 2 ] * surface->color.rgb[ 2 ] * surface->diffuse.val * 0xFF); color[ 3 ] = (picoByte_t)(vm->vmap->val[ vm->index ][ 3 ] * 0xFF); } } /* override with polygon data */ for( k = 0, vm = v->vm; k < v->nvmaps; k++, vm++ ) { if (vm->vmap->type == LWID_('T','X','U','V')) { /* set st coords */ st[ 0 ] = vm->vmap->val[ vm->index ][ 0 ]; st[ 1 ] = 1.f - vm->vmap->val[ vm->index ][ 1 ]; } else if (vm->vmap->type == LWID_('R','G','B','A')) { /* set rgba */ color[ 0 ] = (picoByte_t)(vm->vmap->val[ vm->index ][ 0 ] * surface->color.rgb[ 0 ] * surface->diffuse.val * 0xFF); color[ 1 ] = (picoByte_t)(vm->vmap->val[ vm->index ][ 1 ] * surface->color.rgb[ 1 ] * surface->diffuse.val * 0xFF); color[ 2 ] = (picoByte_t)(vm->vmap->val[ vm->index ][ 2 ] * surface->color.rgb[ 2 ] * surface->diffuse.val * 0xFF); color[ 3 ] = (picoByte_t)(vm->vmap->val[ vm->index ][ 3 ] * 0xFF); } } /* find vertex in this surface and if we can't find it there create it */ vertexCombinationHash = PicoFindVertexCombinationInHashTable( hashTable, xyz, normal, st, color ); if (vertexCombinationHash) { /* found an existing one */ PicoSetSurfaceIndex( picoSurface, (surfacePolyCount * 3 + j ), vertexCombinationHash->index ); } else { /* it is a new one */ vertexCombinationHash = PicoAddVertexCombinationToHashTable( hashTable, xyz, normal, st, color, (picoIndex_t) numverts ); if (vertexCombinationHash == NULL) { _pico_printf( PICO_ERROR, "Unable to allocate hash bucket entry table" ); PicoFreeVertexCombinationHashTable( hashTable ); PicoFreeModel( picoModel ); lwFreeObject( obj ); return NULL; } /* add the vertex to this surface */ PicoSetSurfaceXYZ( picoSurface, numverts, xyz ); /* set dummy normal */ PicoSetSurfaceNormal( picoSurface, numverts, normal ); /* set color */ PicoSetSurfaceColor( picoSurface, 0, numverts, color ); /* set st coords */ PicoSetSurfaceST( picoSurface, 0, numverts, st ); /* set index */ PicoSetSurfaceIndex( picoSurface, (surfacePolyCount * 3 + j ), (picoIndex_t) numverts ); numverts++; } } } /* free the hashtable */ PicoFreeVertexCombinationHashTable( hashTable ); /* get next surface */ surface = surface->next; } #ifdef DEBUG_PM_LWO load_start = convert_finish = clock(); #endif lwFreeObject( obj ); #ifdef DEBUG_PM_LWO load_finish = clock(); load_elapsed += (double)(load_finish - load_start) / CLOCKS_PER_SEC; convert_elapsed = (double)(convert_finish - convert_start) / CLOCKS_PER_SEC; _pico_printf( PICO_NORMAL, "Loaded model in in %-.2f second(s) (loading: %-.2fs converting: %-.2fs)\n", load_elapsed + convert_elapsed, load_elapsed, convert_elapsed ); #endif /* return the new pico model */ return picoModel; } /* pico file format module definition */ const picoModule_t picoModuleLWO = { "1.0", /* module version string */ "LightWave Object", /* module display name */ "Arnout van Meer", /* author's name */ "2003 Arnout van Meer, 2000 Ernie Wright", /* module copyright */ { "lwo", NULL, NULL, NULL /* default extensions to use */ }, _lwo_canload, /* validation routine */ _lwo_load, /* load routine */ NULL, /* save validation routine */ NULL /* save routine */ }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/pm_md2.c�����������������������������������������������������������0000664�0000000�0000000�00000043011�12454246557�0020142�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* Nurail: Used pm_md3.c (Randy Reddig) as a template. */ /* marker */ #define PM_MD2_C /* dependencies */ #include "picointernal.h" #ifdef WIN32 #include #define snprintf _snprintf #endif /* md2 model format */ #define MD2_MAGIC "IDP2" #define MD2_VERSION 8 #define MD2_NUMVERTEXNORMALS 162 #define MD2_MAX_SKINNAME 64 #define MD2_MAX_TRIANGLES 4096 #define MD2_MAX_VERTS 2048 #define MD2_MAX_FRAMES 512 #define MD2_MAX_MD2SKINS 32 #define MD2_MAX_SKINNAME 64 #ifndef byte #define byte unsigned char #endif typedef struct index_LUT_s { short Vert; short ST; } index_LUT_t; typedef struct index_DUP_LUT_s { short ST; short OldVert; } index_DUP_LUT_t; typedef struct { short s; short t; } md2St_t; typedef struct { short index_xyz[3]; short index_st[3]; } md2Triangle_t; typedef struct { byte v[3]; // scaled byte to fit in frame mins/maxs byte lightnormalindex; } md2XyzNormal_t; typedef struct md2Frame_s { float scale[3]; // multiply byte verts by this float translate[3]; // then add this char name[16]; // frame name from grabbing md2XyzNormal_t verts[1]; // variable sized } md2Frame_t; /* md2 model file md2 structure */ typedef struct md2_s { char magic[ 4 ]; int version; int skinWidth; int skinHeight; int frameSize; int numSkins; int numXYZ; int numST; int numTris; int numGLCmds; int numFrames; int ofsSkins; int ofsST; int ofsTris; int ofsFrames; int ofsGLCmds; int ofsEnd; } md2_t; float md2_normals[ MD2_NUMVERTEXNORMALS ][ 3 ] = { { -0.525731f, 0.000000f, 0.850651f }, { -0.442863f, 0.238856f, 0.864188f }, { -0.295242f, 0.000000f, 0.955423f }, { -0.309017f, 0.500000f, 0.809017f }, { -0.162460f, 0.262866f, 0.951056f }, { 0.000000f, 0.000000f, 1.000000f }, { 0.000000f, 0.850651f, 0.525731f }, { -0.147621f, 0.716567f, 0.681718f }, { 0.147621f, 0.716567f, 0.681718f }, { 0.000000f, 0.525731f, 0.850651f }, { 0.309017f, 0.500000f, 0.809017f }, { 0.525731f, 0.000000f, 0.850651f }, { 0.295242f, 0.000000f, 0.955423f }, { 0.442863f, 0.238856f, 0.864188f }, { 0.162460f, 0.262866f, 0.951056f }, { -0.681718f, 0.147621f, 0.716567f }, { -0.809017f, 0.309017f, 0.500000f }, { -0.587785f, 0.425325f, 0.688191f }, { -0.850651f, 0.525731f, 0.000000f }, { -0.864188f, 0.442863f, 0.238856f }, { -0.716567f, 0.681718f, 0.147621f }, { -0.688191f, 0.587785f, 0.425325f }, { -0.500000f, 0.809017f, 0.309017f }, { -0.238856f, 0.864188f, 0.442863f }, { -0.425325f, 0.688191f, 0.587785f }, { -0.716567f, 0.681718f, -0.147621f }, { -0.500000f, 0.809017f, -0.309017f }, { -0.525731f, 0.850651f, 0.000000f }, { 0.000000f, 0.850651f, -0.525731f }, { -0.238856f, 0.864188f, -0.442863f }, { 0.000000f, 0.955423f, -0.295242f }, { -0.262866f, 0.951056f, -0.162460f }, { 0.000000f, 1.000000f, 0.000000f }, { 0.000000f, 0.955423f, 0.295242f }, { -0.262866f, 0.951056f, 0.162460f }, { 0.238856f, 0.864188f, 0.442863f }, { 0.262866f, 0.951056f, 0.162460f }, { 0.500000f, 0.809017f, 0.309017f }, { 0.238856f, 0.864188f, -0.442863f }, { 0.262866f, 0.951056f, -0.162460f }, { 0.500000f, 0.809017f, -0.309017f }, { 0.850651f, 0.525731f, 0.000000f }, { 0.716567f, 0.681718f, 0.147621f }, { 0.716567f, 0.681718f, -0.147621f }, { 0.525731f, 0.850651f, 0.000000f }, { 0.425325f, 0.688191f, 0.587785f }, { 0.864188f, 0.442863f, 0.238856f }, { 0.688191f, 0.587785f, 0.425325f }, { 0.809017f, 0.309017f, 0.500000f }, { 0.681718f, 0.147621f, 0.716567f }, { 0.587785f, 0.425325f, 0.688191f }, { 0.955423f, 0.295242f, 0.000000f }, { 1.000000f, 0.000000f, 0.000000f }, { 0.951056f, 0.162460f, 0.262866f }, { 0.850651f, -0.525731f, 0.000000f }, { 0.955423f, -0.295242f, 0.000000f }, { 0.864188f, -0.442863f, 0.238856f }, { 0.951056f, -0.162460f, 0.262866f }, { 0.809017f, -0.309017f, 0.500000f }, { 0.681718f, -0.147621f, 0.716567f }, { 0.850651f, 0.000000f, 0.525731f }, { 0.864188f, 0.442863f, -0.238856f }, { 0.809017f, 0.309017f, -0.500000f }, { 0.951056f, 0.162460f, -0.262866f }, { 0.525731f, 0.000000f, -0.850651f }, { 0.681718f, 0.147621f, -0.716567f }, { 0.681718f, -0.147621f, -0.716567f }, { 0.850651f, 0.000000f, -0.525731f }, { 0.809017f, -0.309017f, -0.500000f }, { 0.864188f, -0.442863f, -0.238856f }, { 0.951056f, -0.162460f, -0.262866f }, { 0.147621f, 0.716567f, -0.681718f }, { 0.309017f, 0.500000f, -0.809017f }, { 0.425325f, 0.688191f, -0.587785f }, { 0.442863f, 0.238856f, -0.864188f }, { 0.587785f, 0.425325f, -0.688191f }, { 0.688191f, 0.587785f, -0.425325f }, { -0.147621f, 0.716567f, -0.681718f }, { -0.309017f, 0.500000f, -0.809017f }, { 0.000000f, 0.525731f, -0.850651f }, { -0.525731f, 0.000000f, -0.850651f }, { -0.442863f, 0.238856f, -0.864188f }, { -0.295242f, 0.000000f, -0.955423f }, { -0.162460f, 0.262866f, -0.951056f }, { 0.000000f, 0.000000f, -1.000000f }, { 0.295242f, 0.000000f, -0.955423f }, { 0.162460f, 0.262866f, -0.951056f }, { -0.442863f, -0.238856f, -0.864188f }, { -0.309017f, -0.500000f, -0.809017f }, { -0.162460f, -0.262866f, -0.951056f }, { 0.000000f, -0.850651f, -0.525731f }, { -0.147621f, -0.716567f, -0.681718f }, { 0.147621f, -0.716567f, -0.681718f }, { 0.000000f, -0.525731f, -0.850651f }, { 0.309017f, -0.500000f, -0.809017f }, { 0.442863f, -0.238856f, -0.864188f }, { 0.162460f, -0.262866f, -0.951056f }, { 0.238856f, -0.864188f, -0.442863f }, { 0.500000f, -0.809017f, -0.309017f }, { 0.425325f, -0.688191f, -0.587785f }, { 0.716567f, -0.681718f, -0.147621f }, { 0.688191f, -0.587785f, -0.425325f }, { 0.587785f, -0.425325f, -0.688191f }, { 0.000000f, -0.955423f, -0.295242f }, { 0.000000f, -1.000000f, 0.000000f }, { 0.262866f, -0.951056f, -0.162460f }, { 0.000000f, -0.850651f, 0.525731f }, { 0.000000f, -0.955423f, 0.295242f }, { 0.238856f, -0.864188f, 0.442863f }, { 0.262866f, -0.951056f, 0.162460f }, { 0.500000f, -0.809017f, 0.309017f }, { 0.716567f, -0.681718f, 0.147621f }, { 0.525731f, -0.850651f, 0.000000f }, { -0.238856f, -0.864188f, -0.442863f }, { -0.500000f, -0.809017f, -0.309017f }, { -0.262866f, -0.951056f, -0.162460f }, { -0.850651f, -0.525731f, 0.000000f }, { -0.716567f, -0.681718f, -0.147621f }, { -0.716567f, -0.681718f, 0.147621f }, { -0.525731f, -0.850651f, 0.000000f }, { -0.500000f, -0.809017f, 0.309017f }, { -0.238856f, -0.864188f, 0.442863f }, { -0.262866f, -0.951056f, 0.162460f }, { -0.864188f, -0.442863f, 0.238856f }, { -0.809017f, -0.309017f, 0.500000f }, { -0.688191f, -0.587785f, 0.425325f }, { -0.681718f, -0.147621f, 0.716567f }, { -0.442863f, -0.238856f, 0.864188f }, { -0.587785f, -0.425325f, 0.688191f }, { -0.309017f, -0.500000f, 0.809017f }, { -0.147621f, -0.716567f, 0.681718f }, { -0.425325f, -0.688191f, 0.587785f }, { -0.162460f, -0.262866f, 0.951056f }, { 0.442863f, -0.238856f, 0.864188f }, { 0.162460f, -0.262866f, 0.951056f }, { 0.309017f, -0.500000f, 0.809017f }, { 0.147621f, -0.716567f, 0.681718f }, { 0.000000f, -0.525731f, 0.850651f }, { 0.425325f, -0.688191f, 0.587785f }, { 0.587785f, -0.425325f, 0.688191f }, { 0.688191f, -0.587785f, 0.425325f }, { -0.955423f, 0.295242f, 0.000000f }, { -0.951056f, 0.162460f, 0.262866f }, { -1.000000f, 0.000000f, 0.000000f }, { -0.850651f, 0.000000f, 0.525731f }, { -0.955423f, -0.295242f, 0.000000f }, { -0.951056f, -0.162460f, 0.262866f }, { -0.864188f, 0.442863f, -0.238856f }, { -0.951056f, 0.162460f, -0.262866f }, { -0.809017f, 0.309017f, -0.500000f }, { -0.864188f, -0.442863f, -0.238856f }, { -0.951056f, -0.162460f, -0.262866f }, { -0.809017f, -0.309017f, -0.500000f }, { -0.681718f, 0.147621f, -0.716567f }, { -0.681718f, -0.147621f, -0.716567f }, { -0.850651f, 0.000000f, -0.525731f }, { -0.688191f, 0.587785f, -0.425325f }, { -0.587785f, 0.425325f, -0.688191f }, { -0.425325f, 0.688191f, -0.587785f }, { -0.425325f, -0.688191f, -0.587785f }, { -0.587785f, -0.425325f, -0.688191f }, { -0.688191f, -0.587785f, -0.425325f }, }; // _md2_canload() static int _md2_canload( PM_PARAMS_CANLOAD ) { md2_t *md2; /* to keep the compiler happy */ *fileName = *fileName; /* sanity check */ if( bufSize < ( sizeof( *md2 ) * 2) ) return PICO_PMV_ERROR_SIZE; /* set as md2 */ md2 = (md2_t*) buffer; /* check md2 magic */ if( *((int*) md2->magic) != *((int*) MD2_MAGIC) ) return PICO_PMV_ERROR_IDENT; /* check md2 version */ if( _pico_little_long( md2->version ) != MD2_VERSION ) return PICO_PMV_ERROR_VERSION; /* file seems to be a valid md2 */ return PICO_PMV_OK; } // _md2_load() loads a quake2 md2 model file. static picoModel_t *_md2_load( PM_PARAMS_LOAD ) { int i, j; short tot_numVerts; index_LUT_t *p_index_LUT; md2Triangle_t *p_md2Triangle; char skinname[ MD2_MAX_SKINNAME ]; md2_t *md2; md2St_t *texCoord; md2Frame_t *frame; md2Triangle_t *triangle; md2XyzNormal_t *vertex; picoByte_t *bb; picoModel_t *picoModel; picoSurface_t *picoSurface; picoShader_t *picoShader; picoVec3_t xyz, normal; picoVec2_t st; picoColor_t color; /* set as md2 */ bb = (picoByte_t*) buffer; md2 = (md2_t*) buffer; /* check ident and version */ if( *((int*) md2->magic) != *((int*) MD2_MAGIC) || _pico_little_long( md2->version ) != MD2_VERSION ) { /* not an md2 file (todo: set error) */ _pico_printf( PICO_ERROR, "%s is not an MD2 File!", fileName ); return NULL; } // swap md2 md2->version = _pico_little_long( md2->version ); md2->skinWidth = _pico_little_long( md2->skinWidth ); md2->skinHeight = _pico_little_long( md2->skinHeight ); md2->frameSize = _pico_little_long( md2->frameSize ); md2->numSkins = _pico_little_long( md2->numSkins ); md2->numXYZ = _pico_little_long( md2->numXYZ ); md2->numST = _pico_little_long( md2->numST ); md2->numTris = _pico_little_long( md2->numTris ); md2->numGLCmds = _pico_little_long( md2->numGLCmds ); md2->numFrames = _pico_little_long( md2->numFrames ); md2->ofsSkins = _pico_little_long( md2->ofsSkins ); md2->ofsST = _pico_little_long( md2->ofsST ); md2->ofsTris = _pico_little_long( md2->ofsTris ); md2->ofsFrames = _pico_little_long( md2->ofsFrames ); md2->ofsGLCmds = _pico_little_long( md2->ofsGLCmds ); md2->ofsEnd = _pico_little_long( md2->ofsEnd ); // do frame check if( md2->numFrames < 1 ) { _pico_printf( PICO_ERROR, "%s has 0 frames!", fileName ); return NULL; } if( frameNum < 0 || frameNum >= md2->numFrames ) { _pico_printf( PICO_ERROR, "Invalid or out-of-range MD2 frame specified" ); return NULL; } // Setup Frame frame = (md2Frame_t *) (bb + md2->ofsFrames + (sizeof(md2Frame_t) * frameNum)); // swap frame scale and translation for( i = 0; i < 3; i++ ) { frame->scale[ i ] = _pico_little_float( frame->scale[ i ] ); frame->translate[ i ] = _pico_little_float( frame->translate[ i ] ); } // swap triangles triangle = (md2Triangle_t *) ((picoByte_t *) (bb + md2->ofsTris) ); for( i = 0; i < md2->numTris; i++, triangle++ ) { for( j = 0; j < 3; j++ ) { triangle->index_xyz[ j ] = _pico_little_short( triangle->index_xyz[ j ] ); triangle->index_st[ j ] = _pico_little_short( triangle->index_st[ j ] ); } } // swap st coords texCoord = (md2St_t*) ((picoByte_t *) (bb + md2->ofsST) ); for( i = 0; i < md2->numST; i++, texCoord++ ) { texCoord->s = _pico_little_short( texCoord->s ); texCoord->t = _pico_little_short( texCoord->t ); } // Print out md2 values _pico_printf(PICO_VERBOSE,"Skins: %d Verts: %d STs: %d Triangles: %d Frames: %d\nSkin Name \"%s\"\n", md2->numSkins, md2->numXYZ, md2->numST, md2->numTris, md2->numFrames, &skinname ); /* create new pico model */ picoModel = PicoNewModel(); if( picoModel == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model" ); return NULL; } /* do model setup */ PicoSetModelFrameNum( picoModel, frameNum ); PicoSetModelNumFrames( picoModel, md2->numFrames ); /* sea */ PicoSetModelName( picoModel, fileName ); PicoSetModelFileName( picoModel, fileName ); for (i = 0; i < md2->numSkins; i++) { char *offsetSkin = (char*) (bb + md2->ofsSkins) + i * MD2_MAX_SKINNAME; /* set Skin Name */ strncpy(skinname, offsetSkin, MD2_MAX_SKINNAME); /* detox Skin name */ if (skinname[0] == '.') {/* special case ufoai skinpath */ char path[MD2_MAX_SKINNAME]; char skinnameRelative[MD2_MAX_SKINNAME]; strncpy(path, fileName, MD2_MAX_SKINNAME); strncpy(skinnameRelative, skinname, MD2_MAX_SKINNAME); _pico_unixify(path); for (j = MD2_MAX_SKINNAME; j--;) {/* skip filename */ if (path[j] == '/') break; path[j] = '\0'; } snprintf(skinname, MD2_MAX_SKINNAME, "%s%s", path, &skinnameRelative[1]); } _pico_setfext(skinname, ""); picoShader = PicoNewShader(picoModel); if (picoShader == NULL) { _pico_printf(PICO_ERROR, "Unable to allocate a new model shader"); PicoFreeModel(picoModel); return NULL; } PicoSetShaderName(picoShader, skinname); } // allocate new pico surface picoSurface = PicoNewSurface( picoModel ); if( picoSurface == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model surface" ); PicoFreeModel( picoModel ); return NULL; } PicoSetSurfaceType( picoSurface, PICO_TRIANGLES ); PicoSetSurfaceName( picoSurface, frame->name ); picoShader = PicoNewShader( picoModel ); if( picoShader == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model shader" ); PicoFreeModel( picoModel ); return NULL; } PicoSetShaderName( picoShader, skinname ); // associate current surface with newly created shader PicoSetSurfaceShader( picoSurface, picoShader ); // Init LUT for Verts p_index_LUT = (index_LUT_t *)_pico_alloc(sizeof(index_LUT_t) * md2->numXYZ); for(i=0; inumXYZ; i++) { p_index_LUT[i].Vert = -1; p_index_LUT[i].ST = -1; } /* Fill in Look Up Table, and allocate/fill Linked List from vert array as needed for dup STs per Vert. */ tot_numVerts = md2->numXYZ; for (i = 0; i < md2->numTris; i++) { p_md2Triangle = (md2Triangle_t *) (bb + md2->ofsTris + (sizeof(md2Triangle_t) * i)); for (j = 0; j < 3; j++) { if (p_index_LUT[p_md2Triangle->index_xyz[j]].ST == -1) /* No Main Entry */ p_index_LUT[p_md2Triangle->index_xyz[j]].ST = p_md2Triangle->index_st[j]; } } /* Build Picomodel */ triangle = (md2Triangle_t *) ((picoByte_t *) (bb + md2->ofsTris)); for (j = 0; j < md2->numTris; j++, triangle++) { PicoSetSurfaceIndex(picoSurface, j * 3, triangle->index_xyz[0]); PicoSetSurfaceIndex(picoSurface, j * 3 + 1, triangle->index_xyz[1]); PicoSetSurfaceIndex(picoSurface, j * 3 + 2, triangle->index_xyz[2]); } _pico_set_color(color, 255, 255, 255, 255); texCoord = (md2St_t*) ((picoByte_t *) (bb + md2->ofsST)); vertex = (md2XyzNormal_t*) ((picoByte_t*) (frame->verts)); for (i = 0; i < md2->numXYZ; i++, vertex++) { /* set vertex origin */ xyz[0] = vertex->v[0] * frame->scale[0] + frame->translate[0]; xyz[1] = vertex->v[1] * frame->scale[1] + frame->translate[1]; xyz[2] = vertex->v[2] * frame->scale[2] + frame->translate[2]; PicoSetSurfaceXYZ(picoSurface, i, xyz); /* set normal */ normal[0] = md2_normals[vertex->lightnormalindex][0]; normal[1] = md2_normals[vertex->lightnormalindex][1]; normal[2] = md2_normals[vertex->lightnormalindex][2]; PicoSetSurfaceNormal(picoSurface, i, normal); /* set st coords */ st[0] = (float) texCoord[p_index_LUT[i].ST].s / (float) md2->skinWidth; st[1] = (float) texCoord[p_index_LUT[i].ST].t / (float) md2->skinHeight; PicoSetSurfaceST(picoSurface, 0, i, st); /* set color */ PicoSetSurfaceColor(picoSurface, 0, i, color); } /* Free malloc'ed LUTs */ _pico_free(p_index_LUT); /* return the new pico model */ return picoModel; } /* pico file format module definition */ const picoModule_t picoModuleMD2 = { "0.875", /* module version string */ "Quake 2 MD2", /* module display name */ "Nurail", /* author's name */ "2003 Nurail", /* module copyright */ { "md2", NULL, NULL, NULL /* default extensions to use */ }, _md2_canload, /* validation routine */ _md2_load, /* load routine */ NULL, /* save validation routine */ NULL /* save routine */ }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/pm_md3.c�����������������������������������������������������������0000664�0000000�0000000�00000027767�12454246557�0020167�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #define PM_MD3_C /* dependencies */ #include "picointernal.h" /* md3 model format */ #define MD3_MAGIC "IDP3" #define MD3_VERSION 15 /* md3 vertex scale */ #define MD3_SCALE (1.0f / 64.0f) /* md3 model frame information */ typedef struct md3Frame_s { float bounds[ 2 ][ 3 ]; float localOrigin[ 3 ]; float radius; char creator[ 16 ]; } md3Frame_t; /* md3 model tag information */ typedef struct md3Tag_s { char name[ 64 ]; float origin[ 3 ]; float axis[ 3 ][ 3 ]; } md3Tag_t; /* md3 surface md3 (one object mesh) */ typedef struct md3Surface_s { char magic[ 4 ]; char name[ 64 ]; /* polyset name */ int flags; int numFrames; /* all model surfaces should have the same */ int numShaders; /* all model surfaces should have the same */ int numVerts; int numTriangles; int ofsTriangles; int ofsShaders; /* offset from start of md3Surface_t */ int ofsSt; /* texture coords are common for all frames */ int ofsVertexes; /* numVerts * numFrames */ int ofsEnd; /* next surface follows */ } md3Surface_t; typedef struct md3Shader_s { char name[ 64 ]; int shaderIndex; /* for ingame use */ } md3Shader_t; typedef struct md3Triangle_s { int indexes[ 3 ]; } md3Triangle_t; typedef struct md3TexCoord_s { float st[ 2 ]; } md3TexCoord_t; typedef struct md3Vertex_s { short xyz[ 3 ]; short normal; } md3Vertex_t; /* md3 model file md3 structure */ typedef struct md3_s { char magic[ 4 ]; /* MD3_MAGIC */ int version; char name[ 64 ]; /* model name */ int flags; int numFrames; int numTags; int numSurfaces; int numSkins; /* number of skins for the mesh */ int ofsFrames; /* offset for first frame */ int ofsTags; /* numFrames * numTags */ int ofsSurfaces; /* first surface, others follow */ int ofsEnd; /* end of file */ } md3_t; /* _md3_canload() validates a quake3 arena md3 model file. btw, i use the preceding underscore cause it's a static func referenced by one structure only. */ static int _md3_canload( PM_PARAMS_CANLOAD ) { md3_t *md3; /* to keep the compiler happy */ *fileName = *fileName; /* sanity check */ if( bufSize < ( sizeof( *md3 ) * 2) ) return PICO_PMV_ERROR_SIZE; /* set as md3 */ md3 = (md3_t*) buffer; /* check md3 magic */ if( *((int*) md3->magic) != *((int*) MD3_MAGIC) ) return PICO_PMV_ERROR_IDENT; /* check md3 version */ if( _pico_little_long( md3->version ) != MD3_VERSION ) return PICO_PMV_ERROR_VERSION; /* file seems to be a valid md3 */ return PICO_PMV_OK; } /* _md3_load() loads a quake3 arena md3 model file. */ static picoModel_t *_md3_load( PM_PARAMS_LOAD ) { int i, j; picoByte_t *bb; md3_t *md3; md3Surface_t *surface; md3Shader_t *shader; md3TexCoord_t *texCoord; md3Frame_t *frame; md3Triangle_t *triangle; md3Vertex_t *vertex; double lat, lng; picoModel_t *picoModel; picoSurface_t *picoSurface; picoShader_t *picoShader; picoVec3_t xyz, normal; picoVec2_t st; picoColor_t color; /* ------------------------------------------------- md3 loading ------------------------------------------------- */ /* set as md3 */ bb = (picoByte_t*) buffer; md3 = (md3_t*) buffer; /* check ident and version */ if( *((int*) md3->magic) != *((int*) MD3_MAGIC) || _pico_little_long( md3->version ) != MD3_VERSION ) { /* not an md3 file (todo: set error) */ return NULL; } /* swap md3; sea: swaps fixed */ md3->version = _pico_little_long( md3->version ); md3->numFrames = _pico_little_long( md3->numFrames ); md3->numTags = _pico_little_long( md3->numTags ); md3->numSurfaces = _pico_little_long( md3->numSurfaces ); md3->numSkins = _pico_little_long( md3->numSkins ); md3->ofsFrames = _pico_little_long( md3->ofsFrames ); md3->ofsTags = _pico_little_long( md3->ofsTags ); md3->ofsSurfaces = _pico_little_long( md3->ofsSurfaces ); md3->ofsEnd = _pico_little_long( md3->ofsEnd ); /* do frame check */ if( md3->numFrames < 1 ) { _pico_printf( PICO_ERROR, "MD3 with 0 frames" ); return NULL; } if( frameNum < 0 || frameNum >= md3->numFrames ) { _pico_printf( PICO_ERROR, "Invalid or out-of-range MD3 frame specified" ); return NULL; } /* swap frames */ frame = (md3Frame_t*) (bb + md3->ofsFrames ); for( i = 0; i < md3->numFrames; i++, frame++ ) { frame->radius = _pico_little_float( frame->radius ); for( j = 0; j < 3; j++ ) { frame->bounds[ 0 ][ j ] = _pico_little_float( frame->bounds[ 0 ][ j ] ); frame->bounds[ 1 ][ j ] = _pico_little_float( frame->bounds[ 1 ][ j ] ); frame->localOrigin[ j ] = _pico_little_float( frame->localOrigin[ j ] ); } } /* swap surfaces */ surface = (md3Surface_t*) (bb + md3->ofsSurfaces); for( i = 0; i < md3->numSurfaces; i++ ) { /* swap surface md3; sea: swaps fixed */ surface->flags = _pico_little_long( surface->flags ); surface->numFrames = _pico_little_long( surface->numFrames ); surface->numShaders = _pico_little_long( surface->numShaders ); surface->numTriangles = _pico_little_long( surface->numTriangles ); surface->ofsTriangles = _pico_little_long( surface->ofsTriangles ); surface->numVerts = _pico_little_long( surface->numVerts ); surface->ofsShaders = _pico_little_long( surface->ofsShaders ); surface->ofsSt = _pico_little_long( surface->ofsSt ); surface->ofsVertexes = _pico_little_long( surface->ofsVertexes ); surface->ofsEnd = _pico_little_long( surface->ofsEnd ); /* swap triangles */ triangle = (md3Triangle_t*) ((picoByte_t*) surface + surface->ofsTriangles); for( j = 0; j < surface->numTriangles; j++, triangle++ ) { /* sea: swaps fixed */ triangle->indexes[ 0 ] = _pico_little_long( triangle->indexes[ 0 ] ); triangle->indexes[ 1 ] = _pico_little_long( triangle->indexes[ 1 ] ); triangle->indexes[ 2 ] = _pico_little_long( triangle->indexes[ 2 ] ); } /* swap st coords */ texCoord = (md3TexCoord_t*) ((picoByte_t*) surface + surface->ofsSt); for( j = 0; j < surface->numVerts; j++, texCoord++ ) { texCoord->st[ 0 ] = _pico_little_float( texCoord->st[ 0 ] ); texCoord->st[ 1 ] = _pico_little_float( texCoord->st[ 1 ] ); } /* swap xyz/normals */ vertex = (md3Vertex_t*) ((picoByte_t*) surface + surface->ofsVertexes); for( j = 0; j < (surface->numVerts * surface->numFrames); j++, vertex++) { vertex->xyz[ 0 ] = _pico_little_short( vertex->xyz[ 0 ] ); vertex->xyz[ 1 ] = _pico_little_short( vertex->xyz[ 1 ] ); vertex->xyz[ 2 ] = _pico_little_short( vertex->xyz[ 2 ] ); vertex->normal = _pico_little_short( vertex->normal ); } /* get next surface */ surface = (md3Surface_t*) ((picoByte_t*) surface + surface->ofsEnd); } /* ------------------------------------------------- pico model creation ------------------------------------------------- */ /* create new pico model */ picoModel = PicoNewModel(); if( picoModel == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model" ); return NULL; } /* do model setup */ PicoSetModelFrameNum( picoModel, frameNum ); PicoSetModelNumFrames( picoModel, md3->numFrames ); /* sea */ PicoSetModelName( picoModel, fileName ); PicoSetModelFileName( picoModel, fileName ); /* md3 surfaces become picomodel surfaces */ surface = (md3Surface_t*) (bb + md3->ofsSurfaces); /* run through md3 surfaces */ for( i = 0; i < md3->numSurfaces; i++ ) { /* allocate new pico surface */ picoSurface = PicoNewSurface( picoModel ); if( picoSurface == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model surface" ); PicoFreeModel( picoModel ); /* sea */ return NULL; } /* md3 model surfaces are all triangle meshes */ PicoSetSurfaceType( picoSurface, PICO_TRIANGLES ); /* set surface name */ PicoSetSurfaceName( picoSurface, surface->name ); /* create new pico shader -sea */ picoShader = PicoNewShader( picoModel ); if( picoShader == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model shader" ); PicoFreeModel( picoModel ); return NULL; } /* detox and set shader name */ shader = (md3Shader_t*) ((picoByte_t*) surface + surface->ofsShaders); _pico_setfext( shader->name, "" ); _pico_unixify( shader->name ); PicoSetShaderName( picoShader, shader->name ); /* associate current surface with newly created shader */ PicoSetSurfaceShader( picoSurface, picoShader ); /* copy indexes */ triangle = (md3Triangle_t *) ((picoByte_t*) surface + surface->ofsTriangles); for( j = 0; j < surface->numTriangles; j++, triangle++ ) { PicoSetSurfaceIndex( picoSurface, (j * 3 + 0), (picoIndex_t) triangle->indexes[ 0 ] ); PicoSetSurfaceIndex( picoSurface, (j * 3 + 1), (picoIndex_t) triangle->indexes[ 1 ] ); PicoSetSurfaceIndex( picoSurface, (j * 3 + 2), (picoIndex_t) triangle->indexes[ 2 ] ); } /* copy vertexes */ texCoord = (md3TexCoord_t*) ((picoByte_t *) surface + surface->ofsSt); vertex = (md3Vertex_t*) ((picoByte_t*) surface + surface->ofsVertexes + surface->numVerts * frameNum * sizeof( md3Vertex_t ) ); _pico_set_color( color, 255, 255, 255, 255 ); for( j = 0; j < surface->numVerts; j++, texCoord++, vertex++ ) { /* set vertex origin */ xyz[ 0 ] = MD3_SCALE * vertex->xyz[ 0 ]; xyz[ 1 ] = MD3_SCALE * vertex->xyz[ 1 ]; xyz[ 2 ] = MD3_SCALE * vertex->xyz[ 2 ]; PicoSetSurfaceXYZ( picoSurface, j, xyz ); /* decode lat/lng normal to 3 float normal */ lat = (float) ((vertex->normal >> 8) & 0xff); lng = (float) (vertex->normal & 0xff); lat *= PICO_PI / 128; lng *= PICO_PI / 128; normal[ 0 ] = (picoVec_t) cos( lat ) * (picoVec_t) sin( lng ); normal[ 1 ] = (picoVec_t) sin( lat ) * (picoVec_t) sin( lng ); normal[ 2 ] = (picoVec_t) cos( lng ); PicoSetSurfaceNormal( picoSurface, j, normal ); /* set st coords */ st[ 0 ] = texCoord->st[ 0 ]; st[ 1 ] = texCoord->st[ 1 ]; PicoSetSurfaceST( picoSurface, 0, j, st ); /* set color */ PicoSetSurfaceColor( picoSurface, 0, j, color ); } /* get next surface */ surface = (md3Surface_t*) ((picoByte_t*) surface + surface->ofsEnd); } /* return the new pico model */ return picoModel; } /* pico file format module definition */ const picoModule_t picoModuleMD3 = { "1.3", /* module version string */ "Quake 3 Arena", /* module display name */ "Randy Reddig", /* author's name */ "2002 Randy Reddig", /* module copyright */ { "md3", NULL, NULL, NULL /* default extensions to use */ }, _md3_canload, /* validation routine */ _md3_load, /* load routine */ NULL, /* save validation routine */ NULL /* save routine */ }; ���������DarkRadiant-2.0.2/libs/picomodel/pm_mdc.c�����������������������������������������������������������0000664�0000000�0000000�00000057463�12454246557�0020243�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #define PM_MDC_C /* dependencies */ #include "picointernal.h" /* mdc model format */ #define MDC_MAGIC "IDPC" #define MDC_VERSION 2 /* mdc vertex scale */ #define MDC_SCALE (1.0f / 64.0f) #define MDC_MAX_OFS 127.0f #define MDC_DIST_SCALE 0.05f /* mdc decoding normal table */ double mdcNormals[ 256 ][ 3 ] = { { 1.000000, 0.000000, 0.000000 }, { 0.980785, 0.195090, 0.000000 }, { 0.923880, 0.382683, 0.000000 }, { 0.831470, 0.555570, 0.000000 }, { 0.707107, 0.707107, 0.000000 }, { 0.555570, 0.831470, 0.000000 }, { 0.382683, 0.923880, 0.000000 }, { 0.195090, 0.980785, 0.000000 }, { -0.000000, 1.000000, 0.000000 }, { -0.195090, 0.980785, 0.000000 }, { -0.382683, 0.923880, 0.000000 }, { -0.555570, 0.831470, 0.000000 }, { -0.707107, 0.707107, 0.000000 }, { -0.831470, 0.555570, 0.000000 }, { -0.923880, 0.382683, 0.000000 }, { -0.980785, 0.195090, 0.000000 }, { -1.000000, -0.000000, 0.000000 }, { -0.980785, -0.195090, 0.000000 }, { -0.923880, -0.382683, 0.000000 }, { -0.831470, -0.555570, 0.000000 }, { -0.707107, -0.707107, 0.000000 }, { -0.555570, -0.831469, 0.000000 }, { -0.382684, -0.923880, 0.000000 }, { -0.195090, -0.980785, 0.000000 }, { 0.000000, -1.000000, 0.000000 }, { 0.195090, -0.980785, 0.000000 }, { 0.382684, -0.923879, 0.000000 }, { 0.555570, -0.831470, 0.000000 }, { 0.707107, -0.707107, 0.000000 }, { 0.831470, -0.555570, 0.000000 }, { 0.923880, -0.382683, 0.000000 }, { 0.980785, -0.195090, 0.000000 }, { 0.980785, 0.000000, -0.195090 }, { 0.956195, 0.218245, -0.195090 }, { 0.883657, 0.425547, -0.195090 }, { 0.766809, 0.611510, -0.195090 }, { 0.611510, 0.766809, -0.195090 }, { 0.425547, 0.883657, -0.195090 }, { 0.218245, 0.956195, -0.195090 }, { -0.000000, 0.980785, -0.195090 }, { -0.218245, 0.956195, -0.195090 }, { -0.425547, 0.883657, -0.195090 }, { -0.611510, 0.766809, -0.195090 }, { -0.766809, 0.611510, -0.195090 }, { -0.883657, 0.425547, -0.195090 }, { -0.956195, 0.218245, -0.195090 }, { -0.980785, -0.000000, -0.195090 }, { -0.956195, -0.218245, -0.195090 }, { -0.883657, -0.425547, -0.195090 }, { -0.766809, -0.611510, -0.195090 }, { -0.611510, -0.766809, -0.195090 }, { -0.425547, -0.883657, -0.195090 }, { -0.218245, -0.956195, -0.195090 }, { 0.000000, -0.980785, -0.195090 }, { 0.218245, -0.956195, -0.195090 }, { 0.425547, -0.883657, -0.195090 }, { 0.611510, -0.766809, -0.195090 }, { 0.766809, -0.611510, -0.195090 }, { 0.883657, -0.425547, -0.195090 }, { 0.956195, -0.218245, -0.195090 }, { 0.923880, 0.000000, -0.382683 }, { 0.892399, 0.239118, -0.382683 }, { 0.800103, 0.461940, -0.382683 }, { 0.653281, 0.653281, -0.382683 }, { 0.461940, 0.800103, -0.382683 }, { 0.239118, 0.892399, -0.382683 }, { -0.000000, 0.923880, -0.382683 }, { -0.239118, 0.892399, -0.382683 }, { -0.461940, 0.800103, -0.382683 }, { -0.653281, 0.653281, -0.382683 }, { -0.800103, 0.461940, -0.382683 }, { -0.892399, 0.239118, -0.382683 }, { -0.923880, -0.000000, -0.382683 }, { -0.892399, -0.239118, -0.382683 }, { -0.800103, -0.461940, -0.382683 }, { -0.653282, -0.653281, -0.382683 }, { -0.461940, -0.800103, -0.382683 }, { -0.239118, -0.892399, -0.382683 }, { 0.000000, -0.923880, -0.382683 }, { 0.239118, -0.892399, -0.382683 }, { 0.461940, -0.800103, -0.382683 }, { 0.653281, -0.653282, -0.382683 }, { 0.800103, -0.461940, -0.382683 }, { 0.892399, -0.239117, -0.382683 }, { 0.831470, 0.000000, -0.555570 }, { 0.790775, 0.256938, -0.555570 }, { 0.672673, 0.488726, -0.555570 }, { 0.488726, 0.672673, -0.555570 }, { 0.256938, 0.790775, -0.555570 }, { -0.000000, 0.831470, -0.555570 }, { -0.256938, 0.790775, -0.555570 }, { -0.488726, 0.672673, -0.555570 }, { -0.672673, 0.488726, -0.555570 }, { -0.790775, 0.256938, -0.555570 }, { -0.831470, -0.000000, -0.555570 }, { -0.790775, -0.256938, -0.555570 }, { -0.672673, -0.488726, -0.555570 }, { -0.488725, -0.672673, -0.555570 }, { -0.256938, -0.790775, -0.555570 }, { 0.000000, -0.831470, -0.555570 }, { 0.256938, -0.790775, -0.555570 }, { 0.488725, -0.672673, -0.555570 }, { 0.672673, -0.488726, -0.555570 }, { 0.790775, -0.256938, -0.555570 }, { 0.707107, 0.000000, -0.707107 }, { 0.653281, 0.270598, -0.707107 }, { 0.500000, 0.500000, -0.707107 }, { 0.270598, 0.653281, -0.707107 }, { -0.000000, 0.707107, -0.707107 }, { -0.270598, 0.653282, -0.707107 }, { -0.500000, 0.500000, -0.707107 }, { -0.653281, 0.270598, -0.707107 }, { -0.707107, -0.000000, -0.707107 }, { -0.653281, -0.270598, -0.707107 }, { -0.500000, -0.500000, -0.707107 }, { -0.270598, -0.653281, -0.707107 }, { 0.000000, -0.707107, -0.707107 }, { 0.270598, -0.653281, -0.707107 }, { 0.500000, -0.500000, -0.707107 }, { 0.653282, -0.270598, -0.707107 }, { 0.555570, 0.000000, -0.831470 }, { 0.481138, 0.277785, -0.831470 }, { 0.277785, 0.481138, -0.831470 }, { -0.000000, 0.555570, -0.831470 }, { -0.277785, 0.481138, -0.831470 }, { -0.481138, 0.277785, -0.831470 }, { -0.555570, -0.000000, -0.831470 }, { -0.481138, -0.277785, -0.831470 }, { -0.277785, -0.481138, -0.831470 }, { 0.000000, -0.555570, -0.831470 }, { 0.277785, -0.481138, -0.831470 }, { 0.481138, -0.277785, -0.831470 }, { 0.382683, 0.000000, -0.923880 }, { 0.270598, 0.270598, -0.923880 }, { -0.000000, 0.382683, -0.923880 }, { -0.270598, 0.270598, -0.923880 }, { -0.382683, -0.000000, -0.923880 }, { -0.270598, -0.270598, -0.923880 }, { 0.000000, -0.382683, -0.923880 }, { 0.270598, -0.270598, -0.923880 }, { 0.195090, 0.000000, -0.980785 }, { -0.000000, 0.195090, -0.980785 }, { -0.195090, -0.000000, -0.980785 }, { 0.000000, -0.195090, -0.980785 }, { 0.980785, 0.000000, 0.195090 }, { 0.956195, 0.218245, 0.195090 }, { 0.883657, 0.425547, 0.195090 }, { 0.766809, 0.611510, 0.195090 }, { 0.611510, 0.766809, 0.195090 }, { 0.425547, 0.883657, 0.195090 }, { 0.218245, 0.956195, 0.195090 }, { -0.000000, 0.980785, 0.195090 }, { -0.218245, 0.956195, 0.195090 }, { -0.425547, 0.883657, 0.195090 }, { -0.611510, 0.766809, 0.195090 }, { -0.766809, 0.611510, 0.195090 }, { -0.883657, 0.425547, 0.195090 }, { -0.956195, 0.218245, 0.195090 }, { -0.980785, -0.000000, 0.195090 }, { -0.956195, -0.218245, 0.195090 }, { -0.883657, -0.425547, 0.195090 }, { -0.766809, -0.611510, 0.195090 }, { -0.611510, -0.766809, 0.195090 }, { -0.425547, -0.883657, 0.195090 }, { -0.218245, -0.956195, 0.195090 }, { 0.000000, -0.980785, 0.195090 }, { 0.218245, -0.956195, 0.195090 }, { 0.425547, -0.883657, 0.195090 }, { 0.611510, -0.766809, 0.195090 }, { 0.766809, -0.611510, 0.195090 }, { 0.883657, -0.425547, 0.195090 }, { 0.956195, -0.218245, 0.195090 }, { 0.923880, 0.000000, 0.382683 }, { 0.892399, 0.239118, 0.382683 }, { 0.800103, 0.461940, 0.382683 }, { 0.653281, 0.653281, 0.382683 }, { 0.461940, 0.800103, 0.382683 }, { 0.239118, 0.892399, 0.382683 }, { -0.000000, 0.923880, 0.382683 }, { -0.239118, 0.892399, 0.382683 }, { -0.461940, 0.800103, 0.382683 }, { -0.653281, 0.653281, 0.382683 }, { -0.800103, 0.461940, 0.382683 }, { -0.892399, 0.239118, 0.382683 }, { -0.923880, -0.000000, 0.382683 }, { -0.892399, -0.239118, 0.382683 }, { -0.800103, -0.461940, 0.382683 }, { -0.653282, -0.653281, 0.382683 }, { -0.461940, -0.800103, 0.382683 }, { -0.239118, -0.892399, 0.382683 }, { 0.000000, -0.923880, 0.382683 }, { 0.239118, -0.892399, 0.382683 }, { 0.461940, -0.800103, 0.382683 }, { 0.653281, -0.653282, 0.382683 }, { 0.800103, -0.461940, 0.382683 }, { 0.892399, -0.239117, 0.382683 }, { 0.831470, 0.000000, 0.555570 }, { 0.790775, 0.256938, 0.555570 }, { 0.672673, 0.488726, 0.555570 }, { 0.488726, 0.672673, 0.555570 }, { 0.256938, 0.790775, 0.555570 }, { -0.000000, 0.831470, 0.555570 }, { -0.256938, 0.790775, 0.555570 }, { -0.488726, 0.672673, 0.555570 }, { -0.672673, 0.488726, 0.555570 }, { -0.790775, 0.256938, 0.555570 }, { -0.831470, -0.000000, 0.555570 }, { -0.790775, -0.256938, 0.555570 }, { -0.672673, -0.488726, 0.555570 }, { -0.488725, -0.672673, 0.555570 }, { -0.256938, -0.790775, 0.555570 }, { 0.000000, -0.831470, 0.555570 }, { 0.256938, -0.790775, 0.555570 }, { 0.488725, -0.672673, 0.555570 }, { 0.672673, -0.488726, 0.555570 }, { 0.790775, -0.256938, 0.555570 }, { 0.707107, 0.000000, 0.707107 }, { 0.653281, 0.270598, 0.707107 }, { 0.500000, 0.500000, 0.707107 }, { 0.270598, 0.653281, 0.707107 }, { -0.000000, 0.707107, 0.707107 }, { -0.270598, 0.653282, 0.707107 }, { -0.500000, 0.500000, 0.707107 }, { -0.653281, 0.270598, 0.707107 }, { -0.707107, -0.000000, 0.707107 }, { -0.653281, -0.270598, 0.707107 }, { -0.500000, -0.500000, 0.707107 }, { -0.270598, -0.653281, 0.707107 }, { 0.000000, -0.707107, 0.707107 }, { 0.270598, -0.653281, 0.707107 }, { 0.500000, -0.500000, 0.707107 }, { 0.653282, -0.270598, 0.707107 }, { 0.555570, 0.000000, 0.831470 }, { 0.481138, 0.277785, 0.831470 }, { 0.277785, 0.481138, 0.831470 }, { -0.000000, 0.555570, 0.831470 }, { -0.277785, 0.481138, 0.831470 }, { -0.481138, 0.277785, 0.831470 }, { -0.555570, -0.000000, 0.831470 }, { -0.481138, -0.277785, 0.831470 }, { -0.277785, -0.481138, 0.831470 }, { 0.000000, -0.555570, 0.831470 }, { 0.277785, -0.481138, 0.831470 }, { 0.481138, -0.277785, 0.831470 }, { 0.382683, 0.000000, 0.923880 }, { 0.270598, 0.270598, 0.923880 }, { -0.000000, 0.382683, 0.923880 }, { -0.270598, 0.270598, 0.923880 }, { -0.382683, -0.000000, 0.923880 }, { -0.270598, -0.270598, 0.923880 }, { 0.000000, -0.382683, 0.923880 }, { 0.270598, -0.270598, 0.923880 }, { 0.195090, 0.000000, 0.980785 }, { -0.000000, 0.195090, 0.980785 }, { -0.195090, -0.000000, 0.980785 }, { 0.000000, -0.195090, 0.980785 } }; /* mdc model frame information */ typedef struct mdcFrame_s { float bounds[ 2 ][ 3 ]; float localOrigin[ 3 ]; float radius; char creator[ 16 ]; } mdcFrame_t; /* mdc model tag information */ typedef struct mdcTag_s { short xyz[3]; short angles[3]; } mdcTag_t; /* mdc surface mdc (one object mesh) */ typedef struct mdcSurface_s { char magic[ 4 ]; char name[ 64 ]; /* polyset name */ int flags; int numCompFrames; /* all surfaces in a model should have the same */ int numBaseFrames; /* ditto */ int numShaders; /* all model surfaces should have the same */ int numVerts; int numTriangles; int ofsTriangles; int ofsShaders; /* offset from start of mdcSurface_t */ int ofsSt; /* texture coords are common for all frames */ int ofsXyzNormals; /* numVerts * numBaseFrames */ int ofsXyzCompressed; /* numVerts * numCompFrames */ int ofsFrameBaseFrames; /* numFrames */ int ofsFrameCompFrames; /* numFrames */ int ofsEnd; /* next surface follows */ } mdcSurface_t; typedef struct mdcShader_s { char name[ 64 ]; int shaderIndex; /* for ingame use */ } mdcShader_t; typedef struct mdcTriangle_s { int indexes[ 3 ]; } mdcTriangle_t; typedef struct mdcTexCoord_s { float st[ 2 ]; } mdcTexCoord_t; typedef struct mdcVertex_s { short xyz[ 3 ]; short normal; } mdcVertex_t; typedef struct mdcXyzCompressed_s { unsigned int ofsVec; /* offset direction from the last base frame */ } mdcXyzCompressed_t; /* mdc model file mdc structure */ typedef struct mdc_s { char magic[ 4 ]; /* MDC_MAGIC */ int version; char name[ 64 ]; /* model name */ int flags; int numFrames; int numTags; int numSurfaces; int numSkins; /* number of skins for the mesh */ int ofsFrames; /* offset for first frame */ int ofsTagNames; /* numTags */ int ofsTags; /* numFrames * numTags */ int ofsSurfaces; /* first surface, others follow */ int ofsEnd; /* end of file */ } mdc_t; /* _mdc_canload() validates a Return to Castle Wolfenstein model file. btw, i use the preceding underscore cause it's a static func referenced by one structure only. */ static int _mdc_canload( PM_PARAMS_CANLOAD ) { mdc_t *mdc; /* to keep the compiler happy */ *fileName = *fileName; /* sanity check */ if( bufSize < ( sizeof( *mdc ) * 2) ) return PICO_PMV_ERROR_SIZE; /* set as mdc */ mdc = (mdc_t*) buffer; /* check mdc magic */ if( *((int*) mdc->magic) != *((int*) MDC_MAGIC) ) return PICO_PMV_ERROR_IDENT; /* check mdc version */ if( _pico_little_long( mdc->version ) != MDC_VERSION ) return PICO_PMV_ERROR_VERSION; /* file seems to be a valid mdc */ return PICO_PMV_OK; } /* _mdc_load() loads a Return to Castle Wolfenstein mdc model file. */ static picoModel_t *_mdc_load( PM_PARAMS_LOAD ) { int i, j; picoByte_t *bb; mdc_t *mdc; mdcSurface_t *surface; mdcShader_t *shader; mdcTexCoord_t *texCoord; mdcFrame_t *frame; mdcTriangle_t *triangle; mdcVertex_t *vertex; mdcXyzCompressed_t *vertexComp; short *mdcShort, *mdcCompVert; double lat, lng; picoModel_t *picoModel; picoSurface_t *picoSurface; picoShader_t *picoShader; picoVec3_t xyz, normal; picoVec2_t st; picoColor_t color; /* ------------------------------------------------- mdc loading ------------------------------------------------- */ vertexComp = NULL; mdcCompVert = NULL; /* set as mdc */ bb = (picoByte_t*) buffer; mdc = (mdc_t*) buffer; /* check ident and version */ if( *((int*) mdc->magic) != *((int*) MDC_MAGIC) || _pico_little_long( mdc->version ) != MDC_VERSION ) { /* not an mdc file (todo: set error) */ return NULL; } /* swap mdc */ mdc->version = _pico_little_long( mdc->version ); mdc->numFrames = _pico_little_long( mdc->numFrames ); mdc->numTags = _pico_little_long( mdc->numTags ); mdc->numSurfaces = _pico_little_long( mdc->numSurfaces ); mdc->numSkins = _pico_little_long( mdc->numSkins ); mdc->ofsFrames = _pico_little_long( mdc->ofsFrames ); mdc->ofsTags = _pico_little_long( mdc->ofsTags ); mdc->ofsTagNames = _pico_little_long( mdc->ofsTagNames ); mdc->ofsSurfaces = _pico_little_long( mdc->ofsSurfaces ); mdc->ofsEnd = _pico_little_long( mdc->ofsEnd ); /* do frame check */ if( mdc->numFrames < 1 ) { _pico_printf( PICO_ERROR, "MDC with 0 frames" ); return NULL; } if( frameNum < 0 || frameNum >= mdc->numFrames ) { _pico_printf( PICO_ERROR, "Invalid or out-of-range MDC frame specified" ); return NULL; } /* swap frames */ frame = (mdcFrame_t*) (bb + mdc->ofsFrames ); for( i = 0; i < mdc->numFrames; i++, frame++ ) { frame->radius = _pico_little_float( frame->radius ); for( j = 0; j < 3; j++ ) { frame->bounds[ 0 ][ j ] = _pico_little_float( frame->bounds[ 0 ][ j ] ); frame->bounds[ 1 ][ j ] = _pico_little_float( frame->bounds[ 1 ][ j ] ); frame->localOrigin[ j ] = _pico_little_float( frame->localOrigin[ j ] ); } } /* swap surfaces */ surface = (mdcSurface_t*) (bb + mdc->ofsSurfaces); for( i = 0; i < mdc->numSurfaces; i++ ) { /* swap surface mdc */ surface->flags = _pico_little_long( surface->flags ); surface->numBaseFrames = _pico_little_long( surface->numBaseFrames ); surface->numCompFrames = _pico_little_long( surface->numCompFrames ); surface->numShaders = _pico_little_long( surface->numShaders ); surface->numTriangles = _pico_little_long( surface->numTriangles ); surface->ofsTriangles = _pico_little_long( surface->ofsTriangles ); surface->numVerts = _pico_little_long( surface->numVerts ); surface->ofsShaders = _pico_little_long( surface->ofsShaders ); surface->ofsSt = _pico_little_long( surface->ofsSt ); surface->ofsXyzNormals = _pico_little_long( surface->ofsXyzNormals ); surface->ofsXyzCompressed = _pico_little_long( surface->ofsXyzCompressed ); surface->ofsFrameBaseFrames = _pico_little_long( surface->ofsFrameBaseFrames ); surface->ofsFrameCompFrames = _pico_little_long( surface->ofsFrameCompFrames ); surface->ofsEnd = _pico_little_long( surface->ofsEnd ); /* swap triangles */ triangle = (mdcTriangle_t*) ((picoByte_t*) surface + surface->ofsTriangles); for( j = 0; j < surface->numTriangles; j++, triangle++ ) { /* sea: swaps fixed */ triangle->indexes[ 0 ] = _pico_little_long( triangle->indexes[ 0 ] ); triangle->indexes[ 1 ] = _pico_little_long( triangle->indexes[ 1 ] ); triangle->indexes[ 2 ] = _pico_little_long( triangle->indexes[ 2 ] ); } /* swap st coords */ texCoord = (mdcTexCoord_t*) ((picoByte_t*) surface + surface->ofsSt); for( j = 0; j < surface->numVerts; j++, texCoord++ ) { texCoord->st[ 0 ] = _pico_little_float( texCoord->st[ 0 ] ); texCoord->st[ 1 ] = _pico_little_float( texCoord->st[ 1 ] ); } /* swap xyz/normals */ vertex = (mdcVertex_t*) ((picoByte_t*) surface + surface->ofsXyzNormals); for( j = 0; j < (surface->numVerts * surface->numBaseFrames); j++, vertex++) { vertex->xyz[ 0 ] = _pico_little_short( vertex->xyz[ 0 ] ); vertex->xyz[ 1 ] = _pico_little_short( vertex->xyz[ 1 ] ); vertex->xyz[ 2 ] = _pico_little_short( vertex->xyz[ 2 ] ); vertex->normal = _pico_little_short( vertex->normal ); } /* swap xyz/compressed */ vertexComp = (mdcXyzCompressed_t*) ((picoByte_t*) surface + surface->ofsXyzCompressed); for( j = 0; j < (surface->numVerts * surface->numCompFrames); j++, vertexComp++) { vertexComp->ofsVec = _pico_little_long( vertexComp->ofsVec ); } /* swap base frames */ mdcShort = (short *) ((picoByte_t*) surface + surface->ofsFrameBaseFrames); for( j = 0; j < mdc->numFrames; j++, mdcShort++) { *mdcShort = _pico_little_short( *mdcShort ); } /* swap compressed frames */ mdcShort = (short *) ((picoByte_t*) surface + surface->ofsFrameCompFrames); for( j = 0; j < mdc->numFrames; j++, mdcShort++) { *mdcShort = _pico_little_short( *mdcShort ); } /* get next surface */ surface = (mdcSurface_t*) ((picoByte_t*) surface + surface->ofsEnd); } /* ------------------------------------------------- pico model creation ------------------------------------------------- */ /* create new pico model */ picoModel = PicoNewModel(); if( picoModel == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model" ); return NULL; } /* do model setup */ PicoSetModelFrameNum( picoModel, frameNum ); PicoSetModelNumFrames( picoModel, mdc->numFrames ); /* sea */ PicoSetModelName( picoModel, fileName ); PicoSetModelFileName( picoModel, fileName ); /* mdc surfaces become picomodel surfaces */ surface = (mdcSurface_t*) (bb + mdc->ofsSurfaces); /* run through mdc surfaces */ for( i = 0; i < mdc->numSurfaces; i++ ) { /* allocate new pico surface */ picoSurface = PicoNewSurface( picoModel ); if( picoSurface == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model surface" ); PicoFreeModel( picoModel ); /* sea */ return NULL; } /* mdc model surfaces are all triangle meshes */ PicoSetSurfaceType( picoSurface, PICO_TRIANGLES ); /* set surface name */ PicoSetSurfaceName( picoSurface, surface->name ); /* create new pico shader -sea */ picoShader = PicoNewShader( picoModel ); if( picoShader == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model shader" ); PicoFreeModel( picoModel ); return NULL; } /* detox and set shader name */ shader = (mdcShader_t*) ((picoByte_t*) surface + surface->ofsShaders); _pico_setfext( shader->name, "" ); _pico_unixify( shader->name ); PicoSetShaderName( picoShader, shader->name ); /* associate current surface with newly created shader */ PicoSetSurfaceShader( picoSurface, picoShader ); /* copy indexes */ triangle = (mdcTriangle_t *) ((picoByte_t*) surface + surface->ofsTriangles); for( j = 0; j < surface->numTriangles; j++, triangle++ ) { PicoSetSurfaceIndex( picoSurface, (j * 3 + 0), (picoIndex_t) triangle->indexes[ 0 ] ); PicoSetSurfaceIndex( picoSurface, (j * 3 + 1), (picoIndex_t) triangle->indexes[ 1 ] ); PicoSetSurfaceIndex( picoSurface, (j * 3 + 2), (picoIndex_t) triangle->indexes[ 2 ] ); } /* copy vertexes */ texCoord = (mdcTexCoord_t*) ((picoByte_t *) surface + surface->ofsSt); mdcShort = (short *) ((picoByte_t *) surface + surface->ofsXyzNormals) + ((int)*((short *) ((picoByte_t *) surface + surface->ofsFrameBaseFrames) + frameNum) * surface->numVerts * 4); if( surface->numCompFrames > 0 ) { mdcCompVert = (short *) ((picoByte_t *) surface + surface->ofsFrameCompFrames) + frameNum; if( *mdcCompVert >= 0 ) vertexComp = (mdcXyzCompressed_t *) ((picoByte_t *) surface + surface->ofsXyzCompressed) + (*mdcCompVert * surface->numVerts); } _pico_set_color( color, 255, 255, 255, 255 ); for( j = 0; j < surface->numVerts; j++, texCoord++, mdcShort+=4 ) { /* set vertex origin */ xyz[ 0 ] = MDC_SCALE * mdcShort[ 0 ]; xyz[ 1 ] = MDC_SCALE * mdcShort[ 1 ]; xyz[ 2 ] = MDC_SCALE * mdcShort[ 2 ]; /* add compressed ofsVec */ if( surface->numCompFrames > 0 && *mdcCompVert >= 0 ) { xyz[ 0 ] += ((float) ((vertexComp->ofsVec) & 255) - MDC_MAX_OFS) * MDC_DIST_SCALE; xyz[ 1 ] += ((float) ((vertexComp->ofsVec >> 8) & 255) - MDC_MAX_OFS) * MDC_DIST_SCALE; xyz[ 2 ] += ((float) ((vertexComp->ofsVec >> 16) & 255) - MDC_MAX_OFS) * MDC_DIST_SCALE; PicoSetSurfaceXYZ( picoSurface, j, xyz ); normal[ 0 ] = (float) mdcNormals[ (vertexComp->ofsVec >> 24) ][ 0 ]; normal[ 1 ] = (float) mdcNormals[ (vertexComp->ofsVec >> 24) ][ 1 ]; normal[ 2 ] = (float) mdcNormals[ (vertexComp->ofsVec >> 24) ][ 2 ]; PicoSetSurfaceNormal( picoSurface, j, normal ); vertexComp++; } else { PicoSetSurfaceXYZ( picoSurface, j, xyz ); /* decode lat/lng normal to 3 float normal */ lat = (float) ((*(mdcShort + 3) >> 8) & 0xff); lng = (float) (*(mdcShort + 3) & 0xff); lat *= PICO_PI / 128; lng *= PICO_PI / 128; normal[ 0 ] = (picoVec_t) cos( lat ) * (picoVec_t) sin( lng ); normal[ 1 ] = (picoVec_t) sin( lat ) * (picoVec_t) sin( lng ); normal[ 2 ] = (picoVec_t) cos( lng ); PicoSetSurfaceNormal( picoSurface, j, normal ); } /* set st coords */ st[ 0 ] = texCoord->st[ 0 ]; st[ 1 ] = texCoord->st[ 1 ]; PicoSetSurfaceST( picoSurface, 0, j, st ); /* set color */ PicoSetSurfaceColor( picoSurface, 0, j, color ); } /* get next surface */ surface = (mdcSurface_t*) ((picoByte_t*) surface + surface->ofsEnd); } /* return the new pico model */ return picoModel; } /* pico file format module definition */ const picoModule_t picoModuleMDC = { "1.3", /* module version string */ "RtCW MDC", /* module display name */ "Arnout van Meer", /* author's name */ "2002 Arnout van Meer", /* module copyright */ { "mdc", NULL, NULL, NULL /* default extensions to use */ }, _mdc_canload, /* validation routine */ _mdc_load, /* load routine */ NULL, /* save validation routine */ NULL /* save routine */ }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DarkRadiant-2.0.2/libs/picomodel/pm_ms3d.c����������������������������������������������������������0000664�0000000�0000000�00000031703�12454246557�0020333�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ----------------------------------------------------------------------------- PicoModel Library Copyright (c) 2002, Randy Reddig & seaw0lf All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* marker */ #define PM_MS3D_C /* dependencies */ #include "picointernal.h" /* disable warnings */ #ifdef WIN32 #pragma warning( disable:4100 ) /* unref param */ #endif /* remarks: * - loader seems stable * todo: * - fix uv coordinate problem * - check for buffer overflows ('bufptr' accesses) */ /* uncomment when debugging this module */ #define DEBUG_PM_MS3D #define DEBUG_PM_MS3D_EX /* plain white */ static picoColor_t white = { 255,255,255,255 }; /* ms3d limits */ #define MS3D_MAX_VERTS 8192 #define MS3D_MAX_TRIS 16384 #define MS3D_MAX_GROUPS 128 #define MS3D_MAX_MATERIALS 128 #define MS3D_MAX_JOINTS 128 #define MS3D_MAX_KEYFRAMES 216 /* ms3d flags */ #define MS3D_SELECTED 1 #define MS3D_HIDDEN 2 #define MS3D_SELECTED2 4 #define MS3D_DIRTY 8 /* this freaky loader needs byte alignment */ #pragma pack(push, 1) /* ms3d header */ typedef struct SMsHeader { char magic[10]; int version; } TMsHeader; /* ms3d vertex */ typedef struct SMsVertex { unsigned char flags; /* sel, sel2, or hidden */ float xyz[3]; char boneID; /* -1 means 'no bone' */ unsigned char refCount; } TMsVertex; /* ms3d triangle */ typedef struct SMsTriangle { unsigned short flags; /* sel, sel2, or hidden */ unsigned short vertexIndices[3]; float vertexNormals[3][3]; float s[3]; float t[3]; unsigned char smoothingGroup; /* 1 - 32 */ unsigned char groupIndex; } TMsTriangle; /* ms3d material */ typedef struct SMsMaterial { char name[32]; float ambient[4]; float diffuse[4]; float specular[4]; float emissive[4]; float shininess; /* range 0..128 */ float transparency; /* range 0..1 */ unsigned char mode; char texture [128]; /* texture.bmp */ char alphamap[128]; /* alpha.bmp */ } TMsMaterial; // ms3d group (static part) // followed by a variable size block (see below) typedef struct SMsGroup { unsigned char flags; // sel, hidden char name[32]; unsigned short numTriangles; /* unsigned short triangleIndices[ numTriangles ]; char materialIndex; // -1 means 'no material' */ } TMsGroup; // ms3d joint typedef struct SMsJoint { unsigned char flags; char name[32]; char parentName[32]; float rotation[3]; float translation[3]; unsigned short numRotationKeyframes; unsigned short numTranslationKeyframes; } TMsJoint; // ms3d keyframe typedef struct SMsKeyframe { float time; float parameter[3]; } TMsKeyframe; /* restore previous data alignment */ #pragma pack(pop) /* _ms3d_canload: * validates a milkshape3d model file. */ static int _ms3d_canload( PM_PARAMS_CANLOAD ) { TMsHeader *hdr; /* to keep the compiler happy */ *fileName = *fileName; /* sanity check */ if (bufSize < sizeof(TMsHeader)) return PICO_PMV_ERROR_SIZE; /* get ms3d header */ hdr = (TMsHeader *)buffer; /* check ms3d magic */ if (strncmp(hdr->magic,"MS3D000000",10) != 0) return PICO_PMV_ERROR_IDENT; /* check ms3d version */ if (_pico_little_long(hdr->version) < 3 || _pico_little_long(hdr->version) > 4) { _pico_printf( PICO_ERROR,"MS3D file ignored. Only MS3D 1.3 and 1.4 is supported." ); return PICO_PMV_ERROR_VERSION; } /* file seems to be a valid ms3d */ return PICO_PMV_OK; } static unsigned char *GetWord( unsigned char *bufptr, int *out ) { if (bufptr == NULL) { *out = 0; return NULL; } *out = _pico_little_short( *(unsigned short *)bufptr ); return( bufptr + 2 ); } /* _ms3d_load: * loads a milkshape3d model file. */ static picoModel_t *_ms3d_load( PM_PARAMS_LOAD ) { picoModel_t *model; unsigned char *bufptr; int shaderRefs[ MS3D_MAX_GROUPS ]; int numGroups; int numMaterials; // unsigned char *ptrToGroups; int numVerts; unsigned char *ptrToVerts; int numTris; unsigned char *ptrToTris; int i,k,m; /* create new pico model */ model = PicoNewModel(); if (model == NULL) return NULL; /* do model setup */ PicoSetModelFrameNum( model, frameNum ); PicoSetModelName( model, fileName ); PicoSetModelFileName( model, fileName ); /* skip header */ bufptr = (unsigned char *)buffer + sizeof(TMsHeader); /* get number of vertices */ bufptr = GetWord( bufptr,&numVerts ); ptrToVerts = bufptr; #ifdef DEBUG_PM_MS3D printf("NumVertices: %d\n",numVerts); #endif /* swap verts */ for (i=0; ixyz[ 0 ] = _pico_little_float( vertex->xyz[ 0 ] ); vertex->xyz[ 1 ] = _pico_little_float( vertex->xyz[ 1 ] ); vertex->xyz[ 2 ] = _pico_little_float( vertex->xyz[ 2 ] ); #ifdef DEBUG_PM_MS3D_EX_ printf("Vertex: x: %f y: %f z: %f\n", msvd[i]->vertex[0], msvd[i]->vertex[1], msvd[i]->vertex[2]); #endif } /* get number of triangles */ bufptr = GetWord( bufptr,&numTris ); ptrToTris = bufptr; #ifdef DEBUG_PM_MS3D printf("NumTriangles: %d\n",numTris); #endif /* swap tris */ for (i=0; iflags = _pico_little_short( triangle->flags ); /* run through all tri verts */ for (k=0; k<3; k++) { /* swap tex coords */ triangle->s[ k ] = _pico_little_float( triangle->s[ k ] ); triangle->t[ k ] = _pico_little_float( triangle->t[ k ] ); /* swap fields */ triangle->vertexIndices[ k ] = _pico_little_short( triangle->vertexIndices[ k ] ); triangle->vertexNormals[ 0 ][ k ] = _pico_little_float( triangle->vertexNormals[ 0 ][ k ] ); triangle->vertexNormals[ 1 ][ k ] = _pico_little_float( triangle->vertexNormals[ 1 ][ k ] ); triangle->vertexNormals[ 2 ][ k ] = _pico_little_float( triangle->vertexNormals[ 2 ][ k ] ); /* check for out of range indices */ if (triangle->vertexIndices[ k ] >= numVerts) { _pico_printf( PICO_ERROR,"Vertex %d index %d out of range (%d, max %d)",i,k,triangle->vertexIndices[k],numVerts-1); PicoFreeModel( model ); return NULL; /* yuck */ } } } /* get number of groups */ bufptr = GetWord( bufptr,&numGroups ); // ptrToGroups = bufptr; #ifdef DEBUG_PM_MS3D printf("NumGroups: %d\n",numGroups); #endif /* run through all groups in model */ for (i=0; i='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS DarkRadiant-2.0.2/m4/ltoptions.m4000066400000000000000000000300731245424655700165350ustar00rootroot00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) DarkRadiant-2.0.2/m4/ltsugar.m4000066400000000000000000000104241245424655700161610ustar00rootroot00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) DarkRadiant-2.0.2/m4/ltversion.m4000066400000000000000000000012621245424655700165250ustar00rootroot00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) DarkRadiant-2.0.2/m4/lt~obsolete.m4000066400000000000000000000137561245424655700170650ustar00rootroot00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) DarkRadiant-2.0.2/m4/nls.m4000066400000000000000000000023151245424655700152740ustar00rootroot00000000000000# nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) DarkRadiant-2.0.2/m4/po.m4000066400000000000000000000446161245424655700151300ustar00rootroot00000000000000# po.m4 serial 17 (gettext-0.18) dnl Copyright (C) 1995-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.18]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT]) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. AC_PREREQ([2.50]) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL([ac_cv_path_$1], [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$][$1]) else AC_MSG_RESULT([no]) fi AC_SUBST([$1])dnl ]) DarkRadiant-2.0.2/m4/wxwin.m4000077500000000000000000001171611245424655700156650ustar00rootroot00000000000000dnl --------------------------------------------------------------------------- dnl Author: wxWidgets development team, dnl Francesco Montorsi, dnl Bob McCown (Mac-testing) dnl Creation date: 24/11/2001 dnl --------------------------------------------------------------------------- dnl =========================================================================== dnl Table of Contents of this macro file: dnl ------------------------------------- dnl dnl SECTION A: wxWidgets main macros dnl - WX_CONFIG_OPTIONS dnl - WX_CONFIG_CHECK dnl - WXRC_CHECK dnl - WX_STANDARD_OPTIONS dnl - WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS dnl - WX_DETECT_STANDARD_OPTION_VALUES dnl dnl SECTION B: wxWidgets-related utilities dnl - WX_LIKE_LIBNAME dnl - WX_ARG_ENABLE_YESNOAUTO dnl - WX_ARG_WITH_YESNOAUTO dnl dnl SECTION C: messages to the user dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG_END dnl - WX_BOOLOPT_SUMMARY dnl dnl The special "WX_DEBUG_CONFIGURE" variable can be set to 1 to enable extra dnl debug output on stdout from these macros. dnl =========================================================================== dnl --------------------------------------------------------------------------- dnl Macros for wxWidgets detection. Typically used in configure.in as: dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl WX_CONFIG_OPTIONS dnl ... dnl ... dnl WX_CONFIG_CHECK([2.6.0], [wxWin=1]) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.3.4 or above. dnl ]) dnl fi dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LIBS="$LIBS $WX_LIBS" dnl dnl If you want to support standard --enable-debug/unicode/shared options, you dnl may do the following: dnl dnl ... dnl AC_CANONICAL_SYSTEM dnl dnl # define configure options dnl WX_CONFIG_OPTIONS dnl WX_STANDARD_OPTIONS([debug,unicode,shared,toolkit,wxshared]) dnl dnl # basic configure checks dnl ... dnl dnl # we want to always have DEBUG==WX_DEBUG and UNICODE==WX_UNICODE dnl WX_DEBUG=$DEBUG dnl WX_UNICODE=$UNICODE dnl dnl WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS dnl WX_CONFIG_CHECK([2.8.0], [wxWin=1],,[html,core,net,base],[$WXCONFIG_FLAGS]) dnl WX_DETECT_STANDARD_OPTION_VALUES dnl dnl # write the output files dnl AC_CONFIG_FILES([Makefile ...]) dnl AC_OUTPUT dnl dnl # optional: just to show a message to the user dnl WX_STANDARD_OPTIONS_SUMMARY_MSG dnl dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl WX_CONFIG_OPTIONS dnl dnl adds support for --wx-prefix, --wx-exec-prefix, --with-wxdir and dnl --wx-config command line options dnl --------------------------------------------------------------------------- AC_DEFUN([WX_CONFIG_OPTIONS], [ AC_ARG_WITH(wxdir, [ --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH], [ wx_config_name="$withval/wx-config" wx_config_args="--inplace"]) AC_ARG_WITH(wx-config, [ --with-wx-config=CONFIG wx-config script to use (optional)], wx_config_name="$withval" ) AC_ARG_WITH(wx-prefix, [ --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional)], wx_config_prefix="$withval", wx_config_prefix="") AC_ARG_WITH(wx-exec-prefix, [ --with-wx-exec-prefix=PREFIX Exec prefix where wxWidgets is installed (optional)], wx_config_exec_prefix="$withval", wx_config_exec_prefix="") ]) dnl Helper macro for checking if wx version is at least $1.$2.$3, set's dnl wx_ver_ok=yes if it is: AC_DEFUN([_WX_PRIVATE_CHECK_VERSION], [ wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $1; then wx_ver_ok=yes else if test $wx_config_major_version -eq $1; then if test $wx_config_minor_version -gt $2; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $2; then if test $wx_config_micro_version -ge $3; then wx_ver_ok=yes fi fi fi fi fi fi ]) dnl --------------------------------------------------------------------------- dnl WX_CONFIG_CHECK(VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND dnl [, WX-LIBS [, ADDITIONAL-WX-CONFIG-FLAGS]]]]) dnl dnl Test for wxWidgets, and define WX_C*FLAGS, WX_LIBS and WX_LIBS_STATIC dnl (the latter is for static linking against wxWidgets). Set WX_CONFIG_NAME dnl environment variable to override the default name of the wx-config script dnl to use. Set WX_CONFIG_PATH to specify the full path to wx-config - in this dnl case the macro won't even waste time on tests for its existence. dnl dnl Optional WX-LIBS argument contains comma- or space-separated list of dnl wxWidgets libraries to link against. If it is not specified then WX_LIBS dnl and WX_LIBS_STATIC will contain flags to link with all of the core dnl wxWidgets libraries. dnl dnl Optional ADDITIONAL-WX-CONFIG-FLAGS argument is appended to wx-config dnl invocation command in present. It can be used to fine-tune lookup of dnl best wxWidgets build available. dnl dnl Example use: dnl WX_CONFIG_CHECK([2.6.0], [wxWin=1], [wxWin=0], [html,core,net] dnl [--unicode --debug]) dnl --------------------------------------------------------------------------- dnl dnl Get the cflags and libraries from the wx-config script dnl AC_DEFUN([WX_CONFIG_CHECK], [ dnl do we have wx-config name: it can be wx-config or wxd-config or ... if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi dnl deal with optional prefixes if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi dnl don't search the PATH if WX_CONFIG_NAME is absolute filename if test -x "$WX_CONFIG_NAME" ; then AC_MSG_CHECKING(for wx-config) WX_CONFIG_PATH="$WX_CONFIG_NAME" AC_MSG_RESULT($WX_CONFIG_PATH) else AC_PATH_PROG(WX_CONFIG_PATH, $WX_CONFIG_NAME, no, "$WX_LOOKUP_PATH:$PATH") fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=ifelse([$1], ,2.2.1,$1) if test -z "$5" ; then AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version]) else AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version ($5)]) fi dnl don't add the libraries ($4) to this variable as this would result in dnl an error when it's used with --version below WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args $5" WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` _WX_PRIVATE_CHECK_VERSION([$wx_requested_major_version], [$wx_requested_minor_version], [$wx_requested_micro_version]) if test -n "$wx_ver_ok"; then AC_MSG_RESULT(yes (version $WX_VERSION)) WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs $4` dnl is this even still appropriate? --static is a real option now dnl and WX_CONFIG_WITH_ARGS is likely to contain it if that is dnl what the user actually wants, making this redundant at best. dnl For now keep it in case anyone actually used it in the past. AC_MSG_CHECKING([for wxWidgets static library]) WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs $4 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi dnl starting with version 2.2.6 wx-config has --cppflags argument wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi dnl starting with version 2.7.0 wx-config has --rescomp option wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then dnl cannot give any useful info for resource compiler WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then dnl no choice but to define all flags like CFLAGS WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags $4` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else dnl we have CPPFLAGS included in CFLAGS included in CXXFLAGS WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags $4` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags $4` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags $4` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi ifelse([$2], , :, [$2]) else if test "x$WX_VERSION" = x; then dnl no wx-config at all AC_MSG_RESULT(no) else AC_MSG_RESULT(no (version $WX_VERSION is not new enough)) fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" if test ! -z "$5"; then wx_error_message=" The configuration you asked for $PACKAGE_NAME requires a wxWidgets build with the following settings: $5 but such build is not available. To see the wxWidgets builds available on this system, please use 'wx-config --list' command. To use the default build, returned by 'wx-config --selected-config', use the options with their 'auto' default values." fi wx_error_message=" The requested wxWidgets build couldn't be found. $wx_error_message If you still get this error, then check that 'wx-config' is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is $1 or above." ifelse([$3], , AC_MSG_ERROR([$wx_error_message]), [$3]) fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" ifelse([$3], , :, [$3]) fi AC_SUBST(WX_CPPFLAGS) AC_SUBST(WX_CFLAGS) AC_SUBST(WX_CXXFLAGS) AC_SUBST(WX_CFLAGS_ONLY) AC_SUBST(WX_CXXFLAGS_ONLY) AC_SUBST(WX_LIBS) AC_SUBST(WX_LIBS_STATIC) AC_SUBST(WX_VERSION) AC_SUBST(WX_RESCOMP) dnl need to export also WX_VERSION_MINOR and WX_VERSION_MAJOR symbols dnl to support wxpresets bakefiles (we export also WX_VERSION_MICRO for completeness): WX_VERSION_MAJOR="$wx_config_major_version" WX_VERSION_MINOR="$wx_config_minor_version" WX_VERSION_MICRO="$wx_config_micro_version" AC_SUBST(WX_VERSION_MAJOR) AC_SUBST(WX_VERSION_MINOR) AC_SUBST(WX_VERSION_MICRO) ]) dnl --------------------------------------------------------------------------- dnl Get information on the wxrc program for making C++, Python and xrs dnl resource files. dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl WX_CONFIG_OPTIONS dnl ... dnl WX_CONFIG_CHECK(2.6.0, wxWin=1) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.6.0 or above. dnl ]) dnl fi dnl dnl WXRC_CHECK([HAVE_WXRC=1], [HAVE_WXRC=0]) dnl if test "x$HAVE_WXRC" != x1; then dnl AC_MSG_ERROR([ dnl The wxrc program was not installed or not found. dnl dnl Please check the wxWidgets installation. dnl ]) dnl fi dnl dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LDFLAGS="$LDFLAGS $WX_LIBS" dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl WXRC_CHECK([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl dnl Test for wxWidgets' wxrc program for creating either C++, Python or XRS dnl resources. The variable WXRC will be set and substituted in the configure dnl script and Makefiles. dnl dnl Example use: dnl WXRC_CHECK([wxrc=1], [wxrc=0]) dnl --------------------------------------------------------------------------- dnl dnl wxrc program from the wx-config script dnl AC_DEFUN([WXRC_CHECK], [ AC_ARG_VAR([WXRC], [Path to wxWidget's wxrc resource compiler]) if test "x$WX_CONFIG_NAME" = x; then AC_MSG_ERROR([The wxrc tests must run after wxWidgets test.]) else AC_MSG_CHECKING([for wxrc]) if test "x$WXRC" = x ; then dnl wx-config --utility is a new addition to wxWidgets: _WX_PRIVATE_CHECK_VERSION(2,5,3) if test -n "$wx_ver_ok"; then WXRC=`$WX_CONFIG_WITH_ARGS --utility=wxrc` fi fi if test "x$WXRC" = x ; then AC_MSG_RESULT([not found]) ifelse([$2], , :, [$2]) else AC_MSG_RESULT([$WXRC]) ifelse([$1], , :, [$1]) fi AC_SUBST(WXRC) fi ]) dnl --------------------------------------------------------------------------- dnl WX_LIKE_LIBNAME([output-var] [prefix], [name]) dnl dnl Sets the "output-var" variable to the name of a library named with same dnl wxWidgets rule. dnl E.g. for output-var=='lib', name=='test', prefix='mine', sets dnl the $lib variable to: dnl 'mine_gtk2ud_test-2.8' dnl if WX_PORT=gtk2, WX_UNICODE=1, WX_DEBUG=1 and WX_RELEASE=28 dnl --------------------------------------------------------------------------- AC_DEFUN([WX_LIKE_LIBNAME], [ wx_temp="$2""_""$WX_PORT" dnl add the [u][d] string if test "$WX_UNICODE" = "1"; then wx_temp="$wx_temp""u" fi if test "$WX_DEBUG" = "1"; then wx_temp="$wx_temp""d" fi dnl complete the name of the lib wx_temp="$wx_temp""_""$3""-$WX_VERSION_MAJOR.$WX_VERSION_MINOR" dnl save it in the user's variable $1=$wx_temp ]) dnl --------------------------------------------------------------------------- dnl WX_ARG_ENABLE_YESNOAUTO/WX_ARG_WITH_YESNOAUTO dnl dnl Two little custom macros which define the ENABLE/WITH configure arguments. dnl Macro arguments: dnl $1 = the name of the --enable / --with feature dnl $2 = the name of the variable associated dnl $3 = the description of that feature dnl $4 = the default value for that feature dnl $5 = additional action to do in case option is given with "yes" value dnl --------------------------------------------------------------------------- AC_DEFUN([WX_ARG_ENABLE_YESNOAUTO], [AC_ARG_ENABLE($1, AC_HELP_STRING([--enable-$1], [$3 (default is $4)]), [], [enableval="$4"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --enable-$1 option]) if test "$enableval" = "yes" ; then AC_MSG_RESULT([yes]) $2=1 $5 elif test "$enableval" = "no" ; then AC_MSG_RESULT([no]) $2=0 elif test "$enableval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) $2="auto" else AC_MSG_ERROR([ Unrecognized option value (allowed values: yes, no, auto) ]) fi ]) AC_DEFUN([WX_ARG_WITH_YESNOAUTO], [AC_ARG_WITH($1, AC_HELP_STRING([--with-$1], [$3 (default is $4)]), [], [withval="$4"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --with-$1 option]) if test "$withval" = "yes" ; then AC_MSG_RESULT([yes]) $2=1 $5 dnl NB: by default we don't allow --with-$1=no option dnl since it does not make much sense ! elif test "$6" = "1" -a "$withval" = "no" ; then AC_MSG_RESULT([no]) $2=0 elif test "$withval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) $2="auto" else AC_MSG_ERROR([ Unrecognized option value (allowed values: yes, auto) ]) fi ]) dnl --------------------------------------------------------------------------- dnl WX_STANDARD_OPTIONS([options-to-add]) dnl dnl Adds to the configure script one or more of the following options: dnl --enable-[debug|unicode|shared|wxshared|wxdebug] dnl --with-[gtk|msw|motif|x11|mac|dfb] dnl --with-wxversion dnl Then checks for their presence and eventually set the DEBUG, UNICODE, SHARED, dnl PORT, WX_SHARED, WX_DEBUG, variables to one of the "yes", "no", "auto" values. dnl dnl Note that e.g. UNICODE != WX_UNICODE; the first is the value of the dnl --enable-unicode option (in boolean format) while the second indicates dnl if wxWidgets was built in Unicode mode (and still is in boolean format). dnl --------------------------------------------------------------------------- AC_DEFUN([WX_STANDARD_OPTIONS], [ dnl the following lines will expand to WX_ARG_ENABLE_YESNOAUTO calls if and only if dnl the $1 argument contains respectively the debug,unicode or shared options. dnl be careful here not to set debug flag if only "wxdebug" was specified ifelse(regexp([$1], [\bdebug]), [-1],, [WX_ARG_ENABLE_YESNOAUTO([debug], [DEBUG], [Build in debug mode], [auto])]) ifelse(index([$1], [unicode]), [-1],, [WX_ARG_ENABLE_YESNOAUTO([unicode], [UNICODE], [Build in Unicode mode], [auto])]) ifelse(regexp([$1], [\bshared]), [-1],, [WX_ARG_ENABLE_YESNOAUTO([shared], [SHARED], [Build as shared library], [auto])]) dnl WX_ARG_WITH_YESNOAUTO cannot be used for --with-toolkit since it's an option dnl which must be able to accept the auto|gtk1|gtk2|msw|... values ifelse(index([$1], [toolkit]), [-1],, [ AC_ARG_WITH([toolkit], AC_HELP_STRING([--with-toolkit], [Build against a specific wxWidgets toolkit (default is auto)]), [], [withval="auto"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --with-toolkit option]) if test "$withval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) TOOLKIT="auto" else TOOLKIT="$withval" dnl PORT must be one of the allowed values if test "$TOOLKIT" != "gtk1" -a "$TOOLKIT" != "gtk2" -a \ "$TOOLKIT" != "msw" -a "$TOOLKIT" != "motif" -a \ "$TOOLKIT" != "osx_carbon" -a "$TOOLKIT" != "osx_cocoa" -a \ "$TOOLKIT" != "dfb" -a "$TOOLKIT" != "x11"; then AC_MSG_ERROR([ Unrecognized option value (allowed values: auto, gtk1, gtk2, msw, motif, osx_carbon, osx_cocoa, dfb, x11) ]) fi AC_MSG_RESULT([$TOOLKIT]) fi ]) dnl ****** IMPORTANT ******* dnl Unlike for the UNICODE setting, you can build your program in dnl shared mode against a static build of wxWidgets. Thus we have the dnl following option which allows these mixtures. E.g. dnl dnl ./configure --disable-shared --with-wxshared dnl dnl will build your library in static mode against the first available dnl shared build of wxWidgets. dnl dnl Note that's not possible to do the viceversa: dnl dnl ./configure --enable-shared --without-wxshared dnl dnl Doing so you would try to build your library in shared mode against a static dnl build of wxWidgets. This is not possible (you would mix PIC and non PIC code) ! dnl A check for this combination of options is in WX_DETECT_STANDARD_OPTION_VALUES dnl (where we know what 'auto' should be expanded to). dnl dnl If you try to build something in ANSI mode against a UNICODE build dnl of wxWidgets or in RELEASE mode against a DEBUG build of wxWidgets, dnl then at best you'll get ton of linking errors ! dnl ************************ ifelse(index([$1], [wxshared]), [-1],, [ WX_ARG_WITH_YESNOAUTO( [wxshared], [WX_SHARED], [Force building against a shared build of wxWidgets, even if --disable-shared is given], [auto], [], [1]) ]) dnl Just like for SHARED and WX_SHARED it may happen that some adventurous dnl peoples will want to mix a wxWidgets release build with a debug build of dnl his app/lib. So, we have both DEBUG and WX_DEBUG variables. ifelse(index([$1], [wxdebug]), [-1],, [ WX_ARG_WITH_YESNOAUTO( [wxdebug], [WX_DEBUG], [Force building against a debug build of wxWidgets, even if --disable-debug is given], [auto], [], [1]) ]) dnl WX_ARG_WITH_YESNOAUTO cannot be used for --with-wxversion since it's an option dnl which accepts the "auto|2.6|2.7|2.8|2.9|3.0" etc etc values ifelse(index([$1], [wxversion]), [-1],, [ AC_ARG_WITH([wxversion], AC_HELP_STRING([--with-wxversion], [Build against a specific version of wxWidgets (default is auto)]), [], [withval="auto"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --with-wxversion option]) if test "$withval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) WX_RELEASE="auto" else wx_requested_major_version=`echo $withval | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).*/\1/'` wx_requested_minor_version=`echo $withval | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).*/\2/'` dnl both vars above must be exactly 1 digit if test "${#wx_requested_major_version}" != "1" -o \ "${#wx_requested_minor_version}" != "1" ; then AC_MSG_ERROR([ Unrecognized option value (allowed values: auto, 2.6, 2.7, 2.8, 2.9, 3.0) ]) fi WX_RELEASE="$wx_requested_major_version"".""$wx_requested_minor_version" AC_MSG_RESULT([$WX_RELEASE]) fi ]) if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] DEBUG: $DEBUG, WX_DEBUG: $WX_DEBUG" echo "[[dbg]] UNICODE: $UNICODE, WX_UNICODE: $WX_UNICODE" echo "[[dbg]] SHARED: $SHARED, WX_SHARED: $WX_SHARED" echo "[[dbg]] TOOLKIT: $TOOLKIT, WX_TOOLKIT: $WX_TOOLKIT" echo "[[dbg]] VERSION: $VERSION, WX_RELEASE: $WX_RELEASE" fi ]) dnl --------------------------------------------------------------------------- dnl WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS dnl dnl Sets the WXCONFIG_FLAGS string using the SHARED,DEBUG,UNICODE variable values dnl which are different from "auto". dnl Thus this macro needs to be called only once all options have been set. dnl --------------------------------------------------------------------------- AC_DEFUN([WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS], [ if test "$WX_SHARED" = "1" ; then WXCONFIG_FLAGS="--static=no " elif test "$WX_SHARED" = "0" ; then WXCONFIG_FLAGS="--static=yes " fi if test "$WX_DEBUG" = "1" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=yes " elif test "$WX_DEBUG" = "0" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=no " fi dnl The user should have set WX_UNICODE=UNICODE if test "$WX_UNICODE" = "1" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=yes " elif test "$WX_UNICODE" = "0" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=no " fi if test "$TOOLKIT" != "auto" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--toolkit=$TOOLKIT " fi if test "$WX_RELEASE" != "auto" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--version=$WX_RELEASE " fi dnl strip out the last space of the string WXCONFIG_FLAGS=${WXCONFIG_FLAGS% } if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] WXCONFIG_FLAGS: $WXCONFIG_FLAGS" fi ]) dnl --------------------------------------------------------------------------- dnl _WX_SELECTEDCONFIG_CHECKFOR([RESULTVAR], [STRING], [MSG] dnl [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl dnl Outputs the given MSG. Then searches the given STRING in the wxWidgets dnl additional CPP flags and put the result of the search in WX_$RESULTVAR dnl also adding the "yes" or "no" message result to MSG. dnl --------------------------------------------------------------------------- AC_DEFUN([_WX_SELECTEDCONFIG_CHECKFOR], [ if test "$$1" = "auto" ; then dnl The user does not have particular preferences for this option; dnl so we will detect the wxWidgets relative build setting and use it AC_MSG_CHECKING([$3]) dnl set WX_$1 variable to 1 if the $WX_SELECTEDCONFIG contains the $2 dnl string or to 0 otherwise. dnl NOTE: 'expr match STRING REGEXP' cannot be used since on Mac it dnl doesn't work; we use 'expr STRING : REGEXP' instead WX_$1=$(expr "$WX_SELECTEDCONFIG" : ".*$2.*") if test "$WX_$1" != "0"; then WX_$1=1 AC_MSG_RESULT([yes]) ifelse([$4], , :, [$4]) else WX_$1=0 AC_MSG_RESULT([no]) ifelse([$5], , :, [$5]) fi else dnl Use the setting given by the user WX_$1=$$1 fi ]) dnl --------------------------------------------------------------------------- dnl WX_DETECT_STANDARD_OPTION_VALUES dnl dnl Detects the values of the following variables: dnl 1) WX_RELEASE dnl 2) WX_UNICODE dnl 3) WX_DEBUG dnl 4) WX_SHARED (and also WX_STATIC) dnl 5) WX_PORT dnl from the previously selected wxWidgets build; this macro in fact must be dnl called *after* calling the WX_CONFIG_CHECK macro. dnl dnl Note that the WX_VERSION_MAJOR, WX_VERSION_MINOR symbols are already set dnl by WX_CONFIG_CHECK macro dnl --------------------------------------------------------------------------- AC_DEFUN([WX_DETECT_STANDARD_OPTION_VALUES], [ dnl IMPORTANT: WX_VERSION contains all three major.minor.micro digits, dnl while WX_RELEASE only the major.minor ones. WX_RELEASE="$WX_VERSION_MAJOR""$WX_VERSION_MINOR" if test $WX_RELEASE -lt 26 ; then AC_MSG_ERROR([ Cannot detect the wxWidgets configuration for the selected wxWidgets build since its version is $WX_VERSION < 2.6.0; please install a newer version of wxWidgets. ]) fi dnl The wx-config we are using understands the "--selected_config" dnl option which returns an easy-parseable string ! WX_SELECTEDCONFIG=$($WX_CONFIG_WITH_ARGS --selected_config) if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] Using wx-config --selected-config" echo "[[dbg]] WX_SELECTEDCONFIG: $WX_SELECTEDCONFIG" fi dnl we could test directly for WX_SHARED with a line like: dnl _WX_SELECTEDCONFIG_CHECKFOR([SHARED], [shared], dnl [if wxWidgets was built in SHARED mode]) dnl but wx-config --selected-config DOES NOT outputs the 'shared' dnl word when wx was built in shared mode; it rather outputs the dnl 'static' word when built in static mode. if test $WX_SHARED = "1"; then STATIC=0 elif test $WX_SHARED = "0"; then STATIC=1 elif test $WX_SHARED = "auto"; then STATIC="auto" fi dnl Now set the WX_UNICODE, WX_DEBUG, WX_STATIC variables _WX_SELECTEDCONFIG_CHECKFOR([UNICODE], [unicode], [if wxWidgets was built with UNICODE enabled]) _WX_SELECTEDCONFIG_CHECKFOR([DEBUG], [debug], [if wxWidgets was built in DEBUG mode]) _WX_SELECTEDCONFIG_CHECKFOR([STATIC], [static], [if wxWidgets was built in STATIC mode]) dnl init WX_SHARED from WX_STATIC if test "$WX_STATIC" != "0"; then WX_SHARED=0 else WX_SHARED=1 fi AC_SUBST(WX_UNICODE) AC_SUBST(WX_DEBUG) AC_SUBST(WX_SHARED) dnl detect the WX_PORT to use if test "$TOOLKIT" = "auto" ; then dnl The user does not have particular preferences for this option; dnl so we will detect the wxWidgets relative build setting and use it AC_MSG_CHECKING([which wxWidgets toolkit was selected]) WX_GTKPORT1=$(expr "$WX_SELECTEDCONFIG" : ".*gtk1.*") WX_GTKPORT2=$(expr "$WX_SELECTEDCONFIG" : ".*gtk2.*") WX_MSWPORT=$(expr "$WX_SELECTEDCONFIG" : ".*msw.*") WX_MOTIFPORT=$(expr "$WX_SELECTEDCONFIG" : ".*motif.*") WX_OSXCOCOAPORT=$(expr "$WX_SELECTEDCONFIG" : ".*osx_cocoa.*") WX_OSXCARBONPORT=$(expr "$WX_SELECTEDCONFIG" : ".*osx_carbon.*") WX_X11PORT=$(expr "$WX_SELECTEDCONFIG" : ".*x11.*") WX_DFBPORT=$(expr "$WX_SELECTEDCONFIG" : ".*dfb.*") WX_PORT="unknown" if test "$WX_GTKPORT1" != "0"; then WX_PORT="gtk1"; fi if test "$WX_GTKPORT2" != "0"; then WX_PORT="gtk2"; fi if test "$WX_MSWPORT" != "0"; then WX_PORT="msw"; fi if test "$WX_MOTIFPORT" != "0"; then WX_PORT="motif"; fi if test "$WX_OSXCOCOAPORT" != "0"; then WX_PORT="osx_cocoa"; fi if test "$WX_OSXCARBONPORT" != "0"; then WX_PORT="osx_carbon"; fi if test "$WX_X11PORT" != "0"; then WX_PORT="x11"; fi if test "$WX_DFBPORT" != "0"; then WX_PORT="dfb"; fi dnl NOTE: backward-compatible check for wx2.8; in wx2.9 the mac dnl ports are called 'osx_cocoa' and 'osx_carbon' (see above) WX_MACPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mac.*") if test "$WX_MACPORT" != "0"; then WX_PORT="mac"; fi dnl check at least one of the WX_*PORT has been set ! if test "$WX_PORT" = "unknown" ; then AC_MSG_ERROR([ Cannot detect the currently installed wxWidgets port ! Please check your 'wx-config --cxxflags'... ]) fi AC_MSG_RESULT([$WX_PORT]) else dnl Use the setting given by the user if test -z "$TOOLKIT" ; then WX_PORT=$TOOLKIT else dnl try with PORT WX_PORT=$PORT fi fi AC_SUBST(WX_PORT) if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] Values of all WX_* options after final detection:" echo "[[dbg]] WX_DEBUG: $WX_DEBUG" echo "[[dbg]] WX_UNICODE: $WX_UNICODE" echo "[[dbg]] WX_SHARED: $WX_SHARED" echo "[[dbg]] WX_RELEASE: $WX_RELEASE" echo "[[dbg]] WX_PORT: $WX_PORT" fi dnl Avoid problem described in the WX_STANDARD_OPTIONS which happens when dnl the user gives the options: dnl ./configure --enable-shared --without-wxshared dnl or just do dnl ./configure --enable-shared dnl but there is only a static build of wxWidgets available. if test "$WX_SHARED" = "0" -a "$SHARED" = "1"; then AC_MSG_ERROR([ Cannot build shared library against a static build of wxWidgets ! This error happens because the wxWidgets build which was selected has been detected as static while you asked to build $PACKAGE_NAME as shared library and this is not possible. Use the '--disable-shared' option to build $PACKAGE_NAME as static library or '--with-wxshared' to use wxWidgets as shared library. ]) fi dnl now we can finally update the DEBUG,UNICODE,SHARED options dnl to their final values if they were set to 'auto' if test "$DEBUG" = "auto"; then DEBUG=$WX_DEBUG fi if test "$UNICODE" = "auto"; then UNICODE=$WX_UNICODE fi if test "$SHARED" = "auto"; then SHARED=$WX_SHARED fi if test "$TOOLKIT" = "auto"; then TOOLKIT=$WX_PORT fi dnl in case the user needs a BUILD=debug/release var... if test "$DEBUG" = "1"; then BUILD="debug" elif test "$DEBUG" = "0" -o "$DEBUG" = ""; then BUILD="release" fi dnl respect the DEBUG variable adding the optimize/debug flags dnl NOTE: the CXXFLAGS are merged together with the CPPFLAGS so we dnl don't need to set them, too if test "$DEBUG" = "1"; then CXXFLAGS="$CXXFLAGS -g -O0" CFLAGS="$CFLAGS -g -O0" else CXXFLAGS="$CXXFLAGS -O2" CFLAGS="$CFLAGS -O2" fi ]) dnl --------------------------------------------------------------------------- dnl WX_BOOLOPT_SUMMARY([name of the boolean variable to show summary for], dnl [what to print when var is 1], dnl [what to print when var is 0]) dnl dnl Prints $2 when variable $1 == 1 and prints $3 when variable $1 == 0. dnl This macro mainly exists just to make configure.ac scripts more readable. dnl dnl NOTE: you need to use the [" my message"] syntax for 2nd and 3rd arguments dnl if you want that m4 avoid to throw away the spaces prefixed to the dnl argument value. dnl --------------------------------------------------------------------------- AC_DEFUN([WX_BOOLOPT_SUMMARY], [ if test "x$$1" = "x1" ; then echo $2 elif test "x$$1" = "x0" ; then echo $3 else echo "$1 is $$1" fi ]) dnl --------------------------------------------------------------------------- dnl WX_STANDARD_OPTIONS_SUMMARY_MSG dnl dnl Shows a summary message to the user about the WX_* variable contents. dnl This macro is used typically at the end of the configure script. dnl --------------------------------------------------------------------------- AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG], [ echo echo " The wxWidgets build which will be used by $PACKAGE_NAME $PACKAGE_VERSION" echo " has the following settings:" WX_BOOLOPT_SUMMARY([WX_DEBUG], [" - DEBUG build"], [" - RELEASE build"]) WX_BOOLOPT_SUMMARY([WX_UNICODE], [" - UNICODE mode"], [" - ANSI mode"]) WX_BOOLOPT_SUMMARY([WX_SHARED], [" - SHARED mode"], [" - STATIC mode"]) echo " - VERSION: $WX_VERSION" echo " - PORT: $WX_PORT" ]) dnl --------------------------------------------------------------------------- dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN, WX_STANDARD_OPTIONS_SUMMARY_MSG_END dnl dnl Like WX_STANDARD_OPTIONS_SUMMARY_MSG macro but these two macros also gives info dnl about the configuration of the package which used the wxpresets. dnl dnl Typical usage: dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN dnl echo " - Package setting 1: $SETTING1" dnl echo " - Package setting 2: $SETTING1" dnl ... dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_END dnl dnl --------------------------------------------------------------------------- AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN], [ echo echo " ----------------------------------------------------------------" echo " Configuration for $PACKAGE_NAME $PACKAGE_VERSION successfully completed." echo " Summary of main configuration settings for $PACKAGE_NAME:" WX_BOOLOPT_SUMMARY([DEBUG], [" - DEBUG build"], [" - RELEASE build"]) WX_BOOLOPT_SUMMARY([UNICODE], [" - UNICODE mode"], [" - ANSI mode"]) WX_BOOLOPT_SUMMARY([SHARED], [" - SHARED mode"], [" - STATIC mode"]) ]) AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG_END], [ WX_STANDARD_OPTIONS_SUMMARY_MSG echo echo " Now, just run make." echo " ----------------------------------------------------------------" echo ]) dnl --------------------------------------------------------------------------- dnl Deprecated macro wrappers dnl --------------------------------------------------------------------------- AC_DEFUN([AM_OPTIONS_WXCONFIG], [WX_CONFIG_OPTIONS]) AC_DEFUN([AM_PATH_WXCONFIG], [ WX_CONFIG_CHECK([$1],[$2],[$3],[$4],[$5]) ]) AC_DEFUN([AM_PATH_WXRC], [WXRC_CHECK([$1],[$2])]) DarkRadiant-2.0.2/man/000077500000000000000000000000001245424655700144705ustar00rootroot00000000000000DarkRadiant-2.0.2/man/darkradiant.1000066400000000000000000000034221245424655700170370ustar00rootroot00000000000000.TH DarkRadiant 1 2010-10-31 .ad l .SH NAME DarkRadiant \- the level editor for The Dark Mod .SH SYNOPSIS \fBdarkradiant\ \fR[\ options\ ]\ \fIfilename .SH DESCRIPTION DarkRadiant is a level editor for The Dark Mod. It loads and saves Doom 3-format *.map files, making use of assets within a game installation tree. .SH OPTIONS .TP 6 .B --disable-sound Disable the sound manager module. This may be useful if there are problems with sound devices on the system. .TP .BI fs_game= game Override the configured fs_game value. .TP .BI fs_game_base= game_base Override the configured fs_game_base value. .IP In order to allow maximum customisability by after-market mods, the \fBid software\fR game engines use a three-directory system: the .I base directory, which is where the core game assets are installed, and then two mod-specific directories known as .I fs_game and .IR fs_game_base . The intention is that .I fs_game_base is used for the common mod assets, and .I fs_game is available for individual map authors to further customise assets used in their own releases. .IP When editing Dark Mod missions, typically .I fs_game_base would be set to "darkmod", with .I fs_game either left blank or set to the value associated with a particular map author's own release. .IP These values are normally configured in preferences, but they can be overridden on the command line if required. .TP .I filename Path to a map file to load. This may be either an absolute filesystem path, or a mod-local path. .SH BUGS The lighting render mode is very limited compared to the Doom 3 rendering system. In particular, there are no stencil shadows, foglights or any other complex lighting effects. It's too big and too slow. .SH AUTHOR .nh DarkRadiant is developed by the Dark Mod team, at \fIhttp://www.thedarkmod.com .hy DarkRadiant-2.0.2/missing000077500000000000000000000255771245424655700153340ustar00rootroot00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2006-05-10.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case $1 in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $1 in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: DarkRadiant-2.0.2/plugins/000077500000000000000000000000001245424655700153765ustar00rootroot00000000000000DarkRadiant-2.0.2/plugins/Makefile.am000066400000000000000000000013351245424655700174340ustar00rootroot00000000000000SUBDIRS = eventmanager \ archivezip \ commandsystem \ eclassmgr \ eclasstree \ entity \ entitylist \ filetypes \ filters \ fonts \ grid \ image \ mapdoom3 \ md5model \ model \ particles \ scenegraph \ shaders \ skins \ uimanager \ undo \ vfspk3 \ wavefront \ xmlregistry # Conditional modules SUBDIRS += @sound_module@ @script_module@ # Optional plugins SUBDIRS += @sr_plugin@ \ @obj_plugin@ \ @difficulty_plugin@ \ @conv_plugin@ \ @gui_plugin@ \ @editing_plugin@ DarkRadiant-2.0.2/plugins/Makefile.in000066400000000000000000000517131245424655700174520ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Conditional modules # Optional plugins SUBDIRS = eventmanager archivezip commandsystem eclassmgr eclasstree \ entity entitylist filetypes filters fonts grid image mapdoom3 \ md5model model particles scenegraph shaders skins uimanager \ undo vfspk3 wavefront xmlregistry @sound_module@ \ @script_module@ @sr_plugin@ @obj_plugin@ @difficulty_plugin@ \ @conv_plugin@ @gui_plugin@ @editing_plugin@ $(am__empty) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/plugins/archivezip/000077500000000000000000000000001245424655700175425ustar00rootroot00000000000000DarkRadiant-2.0.2/plugins/archivezip/DeflatedArchiveFile.h000066400000000000000000000016621245424655700235320ustar00rootroot00000000000000#ifndef DEFLATEDARCHIVEFILE_H_ #define DEFLATEDARCHIVEFILE_H_ #include "iarchive.h" #include "stream/filestream.h" class DeflatedArchiveFile : public ArchiveFile { std::string m_name; FileInputStream m_istream; SubFileInputStream m_substream; DeflatedInputStream m_zipstream; FileInputStream::size_type m_size; public: typedef FileInputStream::size_type size_type; typedef FileInputStream::position_type position_type; DeflatedArchiveFile(const std::string& name, const std::string& archiveName, position_type position, size_type stream_size, size_type file_size) : m_name(name), m_istream(archiveName), m_substream(m_istream, position, stream_size), m_zipstream(m_substream), m_size(file_size) {} size_type size() const { return m_size; } const std::string& getName() const { return m_name; } InputStream& getInputStream() { return m_zipstream; } }; #endif /*DEFLATEDARCHIVEFILE_H_*/ DarkRadiant-2.0.2/plugins/archivezip/DeflatedArchiveTextFile.h000066400000000000000000000030351245424655700243730ustar00rootroot00000000000000#ifndef DEFLATEDARCHIVETEXTFILE_H_ #define DEFLATEDARCHIVETEXTFILE_H_ #include "iarchive.h" #include "iregistry.h" /** * ArchiveFile stored in a ZIP in DEFLATE format. */ class DeflatedArchiveTextFile : public ArchiveTextFile { std::string m_name; FileInputStream m_istream; SubFileInputStream m_substream; DeflatedInputStream m_zipstream; BinaryToTextInputStream m_textStream; // Mod directory containing this file const std::string _modDir; public: typedef FileInputStream::size_type size_type; typedef FileInputStream::position_type position_type; /** * Constructor. * * @param modDir * The name of the mod directory this file's archive is located in. */ DeflatedArchiveTextFile(const std::string& name, const std::string& archiveName, const std::string& modDir, position_type position, size_type stream_size) : m_name(name), m_istream(archiveName), m_substream(m_istream, position, stream_size), m_zipstream(m_substream), m_textStream(m_zipstream), _modDir(os::getRelativePathMinusFilename(modDir, GlobalRegistry().get(RKEY_ENGINE_PATH))) {} TextInputStream& getInputStream() { return m_textStream; } const std::string& getName() const { return m_name; } /** * Return mod directory of this file. */ std::string getModName() const { return _modDir; } }; #endif /*DEFLATEDARCHIVETEXTFILE_H_*/ DarkRadiant-2.0.2/plugins/archivezip/Makefile.am000066400000000000000000000004521245424655700215770ustar00rootroot00000000000000AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs $(LIBSIGC_CFLAGS) modulesdir = $(pkglibdir)/modules modules_LTLIBRARIES = archivezip.la archivezip_la_LDFLAGS = -module -avoid-version $(Z_LIBS) $(LIBSIGC_LIBS) archivezip_la_SOURCES = ZipArchive.cpp pkzip.cpp plugin.cpp zlibstream.cpp DarkRadiant-2.0.2/plugins/archivezip/Makefile.in000066400000000000000000000562441245424655700216220ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/archivezip DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(modulesdir)" LTLIBRARIES = $(modules_LTLIBRARIES) archivezip_la_LIBADD = am_archivezip_la_OBJECTS = ZipArchive.lo pkzip.lo plugin.lo \ zlibstream.lo archivezip_la_OBJECTS = $(am_archivezip_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = archivezip_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(archivezip_la_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(archivezip_la_SOURCES) DIST_SOURCES = $(archivezip_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs $(LIBSIGC_CFLAGS) modulesdir = $(pkglibdir)/modules modules_LTLIBRARIES = archivezip.la archivezip_la_LDFLAGS = -module -avoid-version $(Z_LIBS) $(LIBSIGC_LIBS) archivezip_la_SOURCES = ZipArchive.cpp pkzip.cpp plugin.cpp zlibstream.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/archivezip/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/archivezip/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-modulesLTLIBRARIES: $(modules_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(modules_LTLIBRARIES)'; test -n "$(modulesdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(modulesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(modulesdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulesdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulesdir)"; \ } uninstall-modulesLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(modules_LTLIBRARIES)'; test -n "$(modulesdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulesdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulesdir)/$$f"; \ done clean-modulesLTLIBRARIES: -test -z "$(modules_LTLIBRARIES)" || rm -f $(modules_LTLIBRARIES) @list='$(modules_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } archivezip.la: $(archivezip_la_OBJECTS) $(archivezip_la_DEPENDENCIES) $(EXTRA_archivezip_la_DEPENDENCIES) $(AM_V_CXXLD)$(archivezip_la_LINK) -rpath $(modulesdir) $(archivezip_la_OBJECTS) $(archivezip_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ZipArchive.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pkzip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlibstream.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(modulesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-modulesLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-modulesLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-modulesLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-modulesLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-modulesLTLIBRARIES \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-modulesLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/plugins/archivezip/ZipArchive.cpp000066400000000000000000000125541245424655700223210ustar00rootroot00000000000000#include "ZipArchive.h" #include "iarchive.h" #include "archivelib.h" #include "pkzip.h" #include "zlibstream.h" #include "DeflatedArchiveFile.h" #include "DeflatedArchiveTextFile.h" ZipArchive::ZipArchive(const std::string& name) : m_name(name), m_istream(name) { if (!m_istream.failed()) { if (!read_pkzip()) { rError() << "ERROR: invalid zip-file " << name.c_str() << '\n'; } } } ZipArchive::~ZipArchive() { for (ZipFileSystem::iterator i = m_filesystem.begin(); i != m_filesystem.end(); ++i) { delete i->second.file(); } } bool ZipArchive::failed() { return m_istream.failed(); } ArchiveFilePtr ZipArchive::openFile(const std::string& name) { ZipFileSystem::iterator i = m_filesystem.find(name); if (i != m_filesystem.end() && !i->second.is_directory()) { ZipRecord* file = i->second.file(); m_istream.seek(file->m_position); zip_file_header file_header; istream_read_zip_file_header(m_istream, file_header); if (file_header.z_magic != zip_file_header_magic) { rError() << "error reading zip file " << m_name.c_str(); return ArchiveFilePtr(); } switch (file->m_mode) { case ZipRecord::eStored: return ArchiveFilePtr(new StoredArchiveFile(name, m_name, m_istream.tell(), file->m_stream_size, file->m_file_size)); case ZipRecord::eDeflated: return ArchiveFilePtr(new DeflatedArchiveFile(name, m_name, m_istream.tell(), file->m_stream_size, file->m_file_size)); } } return ArchiveFilePtr(); } ArchiveTextFilePtr ZipArchive::openTextFile(const std::string& name) { ZipFileSystem::iterator i = m_filesystem.find(name); if (i != m_filesystem.end() && !i->second.is_directory()) { ZipRecord* file = i->second.file(); m_istream.seek(file->m_position); zip_file_header file_header; istream_read_zip_file_header(m_istream, file_header); if (file_header.z_magic != zip_file_header_magic) { rError() << "error reading zip file " << m_name.c_str(); return ArchiveTextFilePtr(); } switch (file->m_mode) { case ZipRecord::eStored: return ArchiveTextFilePtr(new StoredArchiveTextFile(name, m_name, m_name, m_istream.tell(), file->m_stream_size)); case ZipRecord::eDeflated: return ArchiveTextFilePtr(new DeflatedArchiveTextFile(name, m_name, m_name, m_istream.tell(), file->m_stream_size)); } } return ArchiveTextFilePtr(); } bool ZipArchive::containsFile(const std::string& name) { ZipFileSystem::iterator i = m_filesystem.find(name); return i != m_filesystem.end() && !i->second.is_directory(); } void ZipArchive::forEachFile(VisitorFunc visitor, const std::string& root) { m_filesystem.traverse(visitor, root); } bool ZipArchive::read_record() { zip_magic magic; istream_read_zip_magic(m_istream, magic); if (!(magic == zip_root_dirent_magic)) { return false; } zip_version version_encoder; istream_read_zip_version(m_istream, version_encoder); zip_version version_extract; istream_read_zip_version(m_istream, version_extract); //unsigned short flags = istream_read_int16_le(m_istream); unsigned short compression_mode = istream_read_int16_le(m_istream); if (compression_mode != Z_DEFLATED && compression_mode != 0) { return false; } zip_dostime dostime; istream_read_zip_dostime(m_istream, dostime); //unsigned int crc32 = istream_read_int32_le(m_istream); unsigned int compressed_size = istream_read_uint32_le(m_istream); unsigned int uncompressed_size = istream_read_uint32_le(m_istream); unsigned int namelength = istream_read_uint16_le(m_istream); unsigned short extras = istream_read_uint16_le(m_istream); unsigned short comment = istream_read_uint16_le(m_istream); //unsigned short diskstart = istream_read_int16_le(m_istream); //unsigned short filetype = istream_read_int16_le(m_istream); //unsigned int filemode = istream_read_int32_le(m_istream); unsigned int position = istream_read_int32_le(m_istream); // greebo: Read the filename directly into a newly constructed std::string. // I'm not entirely happy about this brute-force casting, but I wanted to // avoid reading the filename into a temporary char[] array // only to let its contents end up being copied by the std::string anyway. // Alternative: use a static boost::shared_array here, resized to fit? std::string path(namelength, '\0'); m_istream.read( reinterpret_cast(const_cast(path.data())), namelength); m_istream.seek(extras + comment, FileInputStream::cur); if (path_is_directory(path.c_str())) { m_filesystem[path] = 0; } else { ZipFileSystem::entry_type& file = m_filesystem[path]; if (!file.is_directory()) { rMessage() << "Warning: zip archive " << m_name << " contains duplicated file: " << path << std::endl; } else { file = new ZipRecord(position, compressed_size, uncompressed_size, (compression_mode == Z_DEFLATED) ? ZipRecord::eDeflated : ZipRecord::eStored); } } return true; } bool ZipArchive::read_pkzip() { SeekableStream::position_type pos = pkzip_find_disk_trailer(m_istream); if (pos != 0) { zip_disk_trailer disk_trailer; m_istream.seek(pos); istream_read_zip_disk_trailer(m_istream, disk_trailer); if (!(disk_trailer.z_magic == zip_disk_trailer_magic)) { return false; } m_istream.seek(disk_trailer.z_rootseek); for (unsigned int i = 0; i < disk_trailer.z_entries; ++i) { if (!read_record()) { return false; } } return true; } return false; } DarkRadiant-2.0.2/plugins/archivezip/ZipArchive.h000066400000000000000000000022471245424655700217640ustar00rootroot00000000000000#ifndef ZIPARCHIVE_H_ #define ZIPARCHIVE_H_ #include "iarchive.h" #include "fs_filesystem.h" #include "stream/filestream.h" class ZipRecord { public: enum ECompressionMode { eStored, eDeflated, }; ZipRecord(unsigned int position, unsigned int compressed_size, unsigned int uncompressed_size, ECompressionMode mode) : m_position(position), m_stream_size(compressed_size), m_file_size(uncompressed_size), m_mode(mode) {} unsigned int m_position; unsigned int m_stream_size; unsigned int m_file_size; ECompressionMode m_mode; }; typedef GenericFileSystem ZipFileSystem; class ZipArchive : public Archive { ZipFileSystem m_filesystem; std::string m_name; FileInputStream m_istream; public: ZipArchive(const std::string& name); virtual ~ZipArchive(); bool failed(); virtual ArchiveFilePtr openFile(const std::string& name); virtual ArchiveTextFilePtr openTextFile(const std::string& name); bool containsFile(const std::string& name); void forEachFile(VisitorFunc visitor, const std::string& root); private: bool read_record(); bool read_pkzip(); }; typedef std::shared_ptr ZipArchivePtr; #endif /*ZIPARCHIVE_H_*/ DarkRadiant-2.0.2/plugins/archivezip/archivezip.def000066400000000000000000000002311245424655700223620ustar00rootroot00000000000000; archivezip.def : Declares the module parameters for the DLL. LIBRARY "ARCHIVEZIP" EXPORTS ; Explicit exports can go here RegisterModule @1 DarkRadiant-2.0.2/plugins/archivezip/pkzip.cpp000066400000000000000000000014331245424655700214040ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "pkzip.h" DarkRadiant-2.0.2/plugins/archivezip/pkzip.h000066400000000000000000000233651245424655700210610ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_PKZIP_H) #define INCLUDED_PKZIP_H #include "bytestreamutils.h" #include "idatastream.h" #include class zip_magic { public: zip_magic() {} zip_magic(char c0, char c1, char c2, char c3) { m_value[0] = c0; m_value[1] = c1; m_value[2] = c2; m_value[3] = c3; } bool operator==(const zip_magic& other) const { return m_value[0] == other.m_value[0] && m_value[1] == other.m_value[1] && m_value[2] == other.m_value[2] && m_value[3] == other.m_value[3]; } bool operator!=(const zip_magic& other) const { return !(*this == other); } char m_value[4]; }; inline void istream_read_zip_magic(InputStream& istream, zip_magic& magic) { istream.read(reinterpret_cast(magic.m_value), 4); } struct zip_version { char version; char ostype; }; inline void istream_read_zip_version(InputStream& istream, zip_version& version) { version.version = istream_read_byte(istream); version.ostype = istream_read_byte(istream); } struct zip_dostime { unsigned short time; unsigned short date; }; inline void istream_read_zip_dostime(InputStream& istream, zip_dostime& dostime) { dostime.time = istream_read_int16_le(istream); dostime.date = istream_read_int16_le(istream); } const zip_magic zip_file_header_magic('P', 'K', 0x03, 0x04); /* A. Local file header */ struct zip_file_header { zip_magic z_magic; /* local file header signature (0x04034b50) */ zip_version z_extract; /* version needed to extract */ unsigned short z_flags; /* general purpose bit flag */ unsigned short z_compr; /* compression method */ zip_dostime z_dostime; /* last mod file time (dos format) */ unsigned int z_crc32; /* crc-32 */ unsigned int z_csize; /* compressed size */ unsigned int z_usize; /* uncompressed size */ unsigned short z_namlen; /* filename length (null if stdin) */ unsigned short z_extras; /* extra field length */ /* followed by filename (of variable size) */ /* followed by extra field (of variable size) */ }; inline void istream_read_zip_file_header(SeekableInputStream& istream, zip_file_header& file_header) { istream_read_zip_magic(istream, file_header.z_magic); istream_read_zip_version(istream, file_header.z_extract); file_header.z_flags = istream_read_uint16_le(istream); file_header.z_compr = istream_read_uint16_le(istream); istream_read_zip_dostime(istream, file_header.z_dostime); file_header.z_crc32 = istream_read_uint32_le(istream); file_header.z_csize = istream_read_uint32_le(istream); file_header.z_usize = istream_read_uint32_le(istream); file_header.z_namlen = istream_read_uint16_le(istream); file_header.z_extras = istream_read_uint16_le(istream); istream.seek(file_header.z_namlen + file_header.z_extras, SeekableInputStream::cur); }; /* B. data descriptor * the data descriptor exists only if bit 3 of z_flags is set. It is byte aligned * and immediately follows the last byte of compressed data. It is only used if * the output media of the compressor was not seekable, eg. standard output. */ const zip_magic zip_file_trailer_magic('P', 'K', 0x07, 0x08); struct zip_file_trailer { zip_magic z_magic; unsigned int z_crc32; /* crc-32 */ unsigned int z_csize; /* compressed size */ unsigned int z_usize; /* uncompressed size */ }; inline void istream_read_zip_file_trailer(InputStream& istream, zip_file_trailer& file_trailer) { istream_read_zip_magic(istream, file_trailer.z_magic); file_trailer.z_crc32 = istream_read_uint32_le(istream); file_trailer.z_csize = istream_read_uint32_le(istream); file_trailer.z_usize = istream_read_uint32_le(istream); }; /* C. central directory structure: [file header] . . . end of central dir record */ /* directory file header * - a single entry including filename, extras and comment may not exceed 64k. */ const zip_magic zip_root_dirent_magic('P', 'K', 0x01, 0x02); struct zip_root_dirent { zip_magic z_magic; zip_version z_encoder; /* version made by */ zip_version z_extract; /* version need to extract */ unsigned short z_flags; /* general purpose bit flag */ unsigned short z_compr; /* compression method */ zip_dostime z_dostime; /* last mod file time&date (dos format) */ unsigned int z_crc32; /* crc-32 */ unsigned int z_csize; /* compressed size */ unsigned int z_usize; /* uncompressed size */ unsigned short z_namlen; /* filename length (null if stdin) */ unsigned short z_extras; /* extra field length */ unsigned short z_comment; /* file comment length */ unsigned short z_diskstart; /* disk number of start (if spanning zip over multiple disks) */ unsigned short z_filetype; /* internal file attributes, bit0 = ascii */ unsigned int z_filemode; /* extrnal file attributes, eg. msdos attrib byte */ unsigned int z_off; /* relative offset of local file header, seekval if singledisk */ /* followed by filename (of variable size) */ /* followed by extra field (of variable size) */ /* followed by file comment (of variable size) */ }; inline void istream_read_zip_root_dirent(SeekableInputStream& istream, zip_root_dirent& root_dirent) { istream_read_zip_magic(istream, root_dirent.z_magic); istream_read_zip_version(istream, root_dirent.z_encoder); istream_read_zip_version(istream, root_dirent.z_extract); root_dirent.z_flags = istream_read_uint16_le(istream); root_dirent.z_compr = istream_read_uint16_le(istream); istream_read_zip_dostime(istream, root_dirent.z_dostime); root_dirent.z_crc32 = istream_read_uint32_le(istream); root_dirent.z_csize = istream_read_uint32_le(istream); root_dirent.z_usize = istream_read_uint32_le(istream); root_dirent.z_namlen = istream_read_uint16_le(istream); root_dirent.z_extras = istream_read_uint16_le(istream); root_dirent.z_comment = istream_read_uint16_le(istream); root_dirent.z_diskstart = istream_read_uint16_le(istream); root_dirent.z_filetype = istream_read_uint16_le(istream); root_dirent.z_filemode = istream_read_uint32_le(istream); root_dirent.z_off = istream_read_uint32_le(istream); istream.seek(root_dirent.z_namlen + root_dirent.z_extras + root_dirent.z_comment, SeekableInputStream::cur); } /* end of central dir record */ const zip_magic zip_disk_trailer_magic('P', 'K', 0x05, 0x06); const unsigned int disk_trailer_length = 22; struct zip_disk_trailer { zip_magic z_magic; unsigned short z_disk; /* number of this disk */ unsigned short z_finaldisk; /* number of the disk with the start of the central dir */ unsigned short z_entries; /* total number of entries in the central dir on this disk */ unsigned short z_finalentries; /* total number of entries in the central dir */ unsigned int z_rootsize; /* size of the central directory */ unsigned int z_rootseek; /* offset of start of central directory with respect to * * the starting disk number */ unsigned short z_comment; /* zipfile comment length */ /* followed by zipfile comment (of variable size) */ }; inline void istream_read_zip_disk_trailer(SeekableInputStream& istream, zip_disk_trailer& disk_trailer) { istream_read_zip_magic(istream, disk_trailer.z_magic); disk_trailer.z_disk = istream_read_uint16_le(istream); disk_trailer.z_finaldisk = istream_read_uint16_le(istream); disk_trailer.z_entries = istream_read_uint16_le(istream); disk_trailer.z_finalentries = istream_read_uint16_le(istream); disk_trailer.z_rootsize = istream_read_uint32_le(istream); disk_trailer.z_rootseek = istream_read_uint32_le(istream); disk_trailer.z_comment = istream_read_uint16_le(istream); istream.seek(disk_trailer.z_comment, SeekableInputStream::cur); } inline SeekableStream::position_type pkzip_find_disk_trailer(SeekableInputStream& istream) { istream.seek(0, SeekableInputStream::end); SeekableStream::position_type start_position = istream.tell(); if(start_position < disk_trailer_length) return 0; start_position -= disk_trailer_length; zip_magic magic; istream.seek(start_position); istream_read_zip_magic(istream, magic); if(magic == zip_disk_trailer_magic) return start_position; else { const SeekableStream::position_type max_comment = 0x10000; const SeekableStream::position_type bufshift = 6; const SeekableStream::position_type bufsize = max_comment >> bufshift; unsigned char buffer[bufsize]; SeekableStream::position_type search_end = (max_comment < start_position) ? start_position - max_comment : 0; SeekableStream::position_type position = start_position; while(position != search_end) { StreamBase::size_type to_read = std::min(bufsize, position - search_end); position -= to_read; istream.seek(position); StreamBase::size_type size = istream.read(buffer, to_read); unsigned char* p = buffer + size; while(p != buffer) { --p; magic.m_value[3] = magic.m_value[2]; magic.m_value[2] = magic.m_value[1]; magic.m_value[1] = magic.m_value[0]; magic.m_value[0] = *p; if(magic == zip_disk_trailer_magic) { return position + (p - buffer); } } } return 0; } } #endif DarkRadiant-2.0.2/plugins/archivezip/plugin.cpp000066400000000000000000000043631245424655700215520ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "plugin.h" #include "imodule.h" #include "iarchive.h" #include "debugging/debugging.h" #include "iregistry.h" #include #include "ZipArchive.h" class ArchivePK4API : public ArchiveLoader { public: // greebo: Returns the opened file or NULL if failed. virtual ArchivePtr openArchive(const std::string& name) { return ZipArchivePtr(new ZipArchive(name)); } virtual const std::string& getExtension() { static std::string _ext("pk4"); return _ext; } // RegisterableModule implementation virtual const std::string& getName() const { static std::string _name("ArchivePK4"); return _name; } virtual const StringSet& getDependencies() const { static StringSet _dependencies; if (_dependencies.empty()) { _dependencies.insert(MODULE_XMLREGISTRY); } return _dependencies; } virtual void initialiseModule(const ApplicationContext& ctx) { rMessage() << "ArchivePK4::initialiseModule called\n"; } }; typedef std::shared_ptr ArchivePK4APIPtr; extern "C" void DARKRADIANT_DLLEXPORT RegisterModule(IModuleRegistry& registry) { registry.registerModule(ArchivePK4APIPtr(new ArchivePK4API)); // Initialise the streams using the given application context module::initialiseStreams(registry.getApplicationContext()); // Remember the reference to the ModuleRegistry module::RegistryReference::Instance().setRegistry(registry); // Set up the assertion handler GlobalErrorHandler() = registry.getApplicationContext().getErrorHandlingFunction(); } DarkRadiant-2.0.2/plugins/archivezip/plugin.h000066400000000000000000000015111245424655700212070ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_PLUGIN_H) #define INCLUDED_PLUGIN_H #endif DarkRadiant-2.0.2/plugins/archivezip/zlibstream.cpp000066400000000000000000000014401245424655700224210ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "zlibstream.h" DarkRadiant-2.0.2/plugins/archivezip/zlibstream.h000066400000000000000000000041241245424655700220700ustar00rootroot00000000000000/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(INCLUDED_ZLIBSTREAM_H) #define INCLUDED_ZLIBSTREAM_H #include "zlib.h" #include "idatastream.h" /// \brief A wrapper around an InputStream of data compressed with the zlib deflate algorithm. /// /// - Uses z_stream to decompress the data stream on the fly. /// - Uses a buffer to reduce the number of times the wrapped stream must be read. class DeflatedInputStream : public InputStream { InputStream& m_istream; z_stream m_zipstream; enum unnamed0 { m_bufsize = 1024 }; unsigned char m_buffer[m_bufsize]; public: DeflatedInputStream(InputStream& istream) : m_istream(istream) { m_zipstream.zalloc = 0; m_zipstream.zfree = 0; m_zipstream.opaque = 0; m_zipstream.avail_in = 0; inflateInit2(&m_zipstream, -MAX_WBITS); } ~DeflatedInputStream() { inflateEnd(&m_zipstream); } size_type read(byte_type* buffer, size_type length) { m_zipstream.next_out = buffer; m_zipstream.avail_out = static_cast(length); while(m_zipstream.avail_out != 0) { if(m_zipstream.avail_in == 0) { m_zipstream.next_in = m_buffer; m_zipstream.avail_in = static_cast(m_istream.read(m_buffer, m_bufsize)); } if(inflate(&m_zipstream, Z_SYNC_FLUSH) != Z_OK) { break; } } return length - m_zipstream.avail_out; } }; #endif DarkRadiant-2.0.2/plugins/commandsystem/000077500000000000000000000000001245424655700202615ustar00rootroot00000000000000DarkRadiant-2.0.2/plugins/commandsystem/CaseInsensitiveCompare.h000066400000000000000000000010701245424655700250330ustar00rootroot00000000000000#ifndef _CASE_INSENSITIVE_COMPARE_FUNCTOR_H_ #define _CASE_INSENSITIVE_COMPARE_FUNCTOR_H_ #include #include #include namespace cmd { /** * Compare-functor to allow case-insensitive lookups of commands. */ struct CaseInsensitiveCompare : public std::binary_function { bool operator()(const std::string &s1, const std::string &s2) const { return boost::algorithm::ilexicographical_compare(s1, s2); } }; } // namespace cmd #endif /* _CASE_INSENSITIVE_COMPARE_FUNCTOR_H_ */ DarkRadiant-2.0.2/plugins/commandsystem/Command.h000066400000000000000000000034511245424655700220130ustar00rootroot00000000000000#ifndef _COMMAND_H_ #define _COMMAND_H_ #include "itextstream.h" #include "Executable.h" namespace cmd { class Command : public Executable { // The actual function to call Function _function; // The number and types of arguments to use Signature _signature; public: Command(const Function& function, const Signature& signature) : _function(function), _signature(signature) {} Signature getSignature() { return _signature; } virtual void execute(const ArgumentList& args) { // Check arguments if (_signature.size() < args.size()) { // Too many arguments, that's for sure rError() << "Cannot execute command: Too many arguments. " << "(max. " << _signature.size() << " arguments required)" << std::endl; return; } // Check matching arguments ArgumentList::const_iterator arg = args.begin(); for (Signature::const_iterator cur = _signature.begin(); cur != _signature.end(); ++cur) { std::size_t curFlags = *cur; bool curIsOptional = ((curFlags & ARGTYPE_OPTIONAL) != 0); // If arguments have run out, all remaining parts of the signature must be optional if (arg == args.end()) { // Non-optional arguments will cause an error if (!curIsOptional) { rError() << "Cannot execute command: Missing arguments. " << std::endl; return; } } else { // We have incoming arguments to match our signature if ((curFlags & arg->getType()) == 0) { // Type mismatch rError() << "Cannot execute command: Type mismatch at argument: " << arg->getString() << std::endl; return; } } // Increase argument iterator if possible if (arg != args.end()) { ++arg; } } // Checks passed, call the command _function(args); } }; typedef std::shared_ptr CommandPtr; } // namespace cmd #endif /* _COMMAND_H_ */ DarkRadiant-2.0.2/plugins/commandsystem/CommandSystem.cpp000066400000000000000000000247271245424655700235640ustar00rootroot00000000000000#include "CommandSystem.h" #include "itextstream.h" #include "iregistry.h" #include "ieventmanager.h" #include "debugging/debugging.h" #include "CommandTokeniser.h" #include "Command.h" #include "Statement.h" #include #include namespace cmd { namespace { const std::string RKEY_COMMANDSYSTEM_BINDS = "user/ui/commandsystem/binds"; } // RegisterableModule implementation const std::string& CommandSystem::getName() const { static std::string _name(MODULE_COMMANDSYSTEM); return _name; } const StringSet& CommandSystem::getDependencies() const { static StringSet _dependencies; if (_dependencies.empty()) { _dependencies.insert(MODULE_XMLREGISTRY); } return _dependencies; } void CommandSystem::initialiseModule(const ApplicationContext& ctx) { rMessage() << "CommandSystem::initialiseModule called." << std::endl; // Add the built-in commands addCommand("bind", std::bind(&CommandSystem::bindCmd, this, std::placeholders::_1), Signature(ARGTYPE_STRING, ARGTYPE_STRING)); addCommand("unbind", std::bind(&CommandSystem::unbindCmd, this, std::placeholders::_1), ARGTYPE_STRING); addCommand("listCmds", std::bind(&CommandSystem::listCmds, this, std::placeholders::_1)); addCommand("print", std::bind(&CommandSystem::printCmd, this, std::placeholders::_1), ARGTYPE_STRING); loadBinds(); } void CommandSystem::shutdownModule() { rMessage() << "CommandSystem: shutting down." << std::endl; // Save binds to registry saveBinds(); // Free all commands _commands.clear(); } void CommandSystem::printCmd(const ArgumentList& args) { for (ArgumentList::const_iterator i = args.begin(); i != args.end(); ++i) { rMessage() << i->getString() << (i != args.begin() ? " " : ""); } rMessage() << std::endl; } void CommandSystem::loadBinds() { // Find all accelerators xml::NodeList nodeList = GlobalRegistry().findXPath(RKEY_COMMANDSYSTEM_BINDS + "//bind"); if (nodeList.empty()) { return; } // Load all bind commands from the nodes for (std::size_t i = 0; i < nodeList.size(); ++i) { xml::Node& node = nodeList[i]; std::string name = node.getAttributeValue("name"); std::string statement = node.getAttributeValue("value"); // remove all whitespace from the front and the tail boost::algorithm::trim(statement); // Create a new statement StatementPtr st(new Statement( statement, (node.getAttributeValue("readonly") == "1") )); std::pair result = _commands.insert( CommandMap::value_type(name, st) ); if (!result.second) { rWarning() << "Duplicate statement detected: " << name << std::endl; } } } void CommandSystem::saveBinds() { // Delete all previous binds GlobalRegistry().deleteXPath(RKEY_COMMANDSYSTEM_BINDS + "//bind"); for (CommandMap::const_iterator i = _commands.begin(); i != _commands.end(); ++i) { // Check if this is actually a statement StatementPtr st = std::dynamic_pointer_cast(i->second); if (st == NULL || st->isReadonly()) continue; // not a statement or readonly xml::Node node = GlobalRegistry().createKeyWithName(RKEY_COMMANDSYSTEM_BINDS, "bind", i->first); node.setAttributeValue("value", st->getValue()); } } void CommandSystem::bindCmd(const ArgumentList& args) { // Sanity check if (args.size() != 2) return; // First argument is the command name // Second argument is the command to be called plus its arguments // Use a tokeniser to split the second argument into its pieces // and trim all unnecessary whitespace std::string input = args[1].getString(); // Add the statement - bind complete addStatement(args[0].getString(), input); // To enable this statement to be triggered via UI, register it as new event GlobalEventManager().addCommand(args[0].getString(), args[0].getString()); } void CommandSystem::unbindCmd(const ArgumentList& args) { // Sanity check if (args.size() != 1) return; // First argument is the statement to unbind CommandMap::iterator found = _commands.find(args[0].getString()); if (found == _commands.end()) { rError() << "Cannot unbind: " << args[0].getString() << ": no such command." << std::endl; return; } // Check if this is actually a statement StatementPtr st = std::dynamic_pointer_cast(found->second); if (st != NULL && !st->isReadonly()) { // This is a user-statement _commands.erase(found); // Unregister this as event too GlobalEventManager().removeEvent(args[0].getString()); } else { rError() << "Cannot unbind built-in command: " << args[0].getString() << std::endl; return; } } void CommandSystem::listCmds(const ArgumentList& args) { // Dump all commands for (CommandMap::const_iterator i = _commands.begin(); i != _commands.end(); ++i) { rMessage() << i->first; StatementPtr st = std::dynamic_pointer_cast(i->second); if (st != NULL) { rMessage() << " => " << st->getValue(); } rMessage() << std::endl; } } void CommandSystem::foreachCommand(const std::function& functor) { std::for_each(_commands.begin(), _commands.end(), [&] (const CommandMap::value_type& i) { functor(i.first); }); } void CommandSystem::addCommand(const std::string& name, Function func, const Signature& signature) { // Create a new command CommandPtr cmd(new Command(func, signature)); std::pair result = _commands.insert( CommandMap::value_type(name, cmd) ); if (!result.second) { rError() << "Cannot register command " << name << ", this command is already registered." << std::endl; } } void CommandSystem::removeCommand(const std::string& name) { CommandMap::iterator i = _commands.find(name); if (i != _commands.end()) { _commands.erase(i); } } void CommandSystem::addStatement(const std::string& statementName, const std::string& str, bool saveStatementToRegistry) { // Remove all whitespace at the front and the tail StatementPtr st(new Statement( boost::algorithm::trim_copy(str), !saveStatementToRegistry // read-only if we should not save this statement )); std::pair result = _commands.insert( CommandMap::value_type(statementName, st) ); if (!result.second) { rError() << "Cannot register statement " << statementName << ", this statement is already registered." << std::endl; } } void CommandSystem::foreachStatement(const std::function& functor, bool customStatementsOnly) { std::for_each(_commands.begin(), _commands.end(), [&] (const CommandMap::value_type& i) { StatementPtr statement = std::dynamic_pointer_cast(i.second); if (statement && (!customStatementsOnly || !statement->isReadonly())) { functor(i.first); } }); } Signature CommandSystem::getSignature(const std::string& name) { // Lookup the named command CommandMap::iterator i = _commands.find(name); if (i == _commands.end()) { return Signature(); // not found => empty signature } return i->second->getSignature(); } namespace local { // A statement consists of a command and a set of arguments struct Statement { // The command to invoke std::string command; // The arguments to pass ArgumentList args; }; } void CommandSystem::execute(const std::string& input) { // Instantiate a CommandTokeniser to analyse the given input string CommandTokeniser tokeniser(input); if (!tokeniser.hasMoreTokens()) return; // nothing to do! std::vector statements; local::Statement curStatement; while (tokeniser.hasMoreTokens()) { // Inspect the next token std::string token = tokeniser.nextToken(); if (token.empty()) { continue; // skip empty tokens } else if (token == ";") { // Finish the current statement if (!curStatement.command.empty()) { // Add the non-empty statement to our list statements.push_back(curStatement); } // Clear the statement curStatement = local::Statement(); continue; } // Token is not a semicolon else if (curStatement.command.empty()) { // The statement is still without command name, take this one curStatement.command = token; continue; } else { // Non-empty token, command name is already known, so // this must be an argument curStatement.args.push_back(token); } } // Check if we have an unfinished statement if (!curStatement.command.empty()) { // Add the non-empty statement to our list statements.push_back(curStatement); } // Now execute the statements for (std::vector::iterator i = statements.begin(); i != statements.end(); ++i) { // Attempt ordinary command execution executeCommand(i->command, i->args); } } void CommandSystem::executeCommand(const std::string& name) { executeCommand(name, ArgumentList()); } void CommandSystem::executeCommand(const std::string& name, const Argument& arg1) { ArgumentList args(1); args[0] = arg1; executeCommand(name, args); } void CommandSystem::executeCommand(const std::string& name, const Argument& arg1, const Argument& arg2) { ArgumentList args(2); args[0] = arg1; args[1] = arg2; executeCommand(name, args); } void CommandSystem::executeCommand(const std::string& name, const Argument& arg1, const Argument& arg2, const Argument& arg3) { ArgumentList args(2); args[0] = arg1; args[1] = arg2; args[2] = arg3; executeCommand(name, args); } void CommandSystem::executeCommand(const std::string& name, const ArgumentList& args) { // Find the named command CommandMap::const_iterator i = _commands.find(name); if (i == _commands.end()) { rError() << "Cannot execute command " << name << ": Command not found." << std::endl; return; } i->second->execute(args); } AutoCompletionInfo CommandSystem::getAutoCompletionInfo(const std::string& prefix) { AutoCompletionInfo returnValue; returnValue.prefix = prefix; for (CommandMap::const_iterator i = _commands.begin(); i != _commands.end(); ++i) { // Check if the command matches the given prefix if (boost::algorithm::istarts_with(i->first, prefix)) { returnValue.candidates.push_back(i->first); } } return returnValue; } } // namespace cmd extern "C" void DARKRADIANT_DLLEXPORT RegisterModule(IModuleRegistry& registry) { registry.registerModule(cmd::CommandSystemPtr(new cmd::CommandSystem)); // Initialise the streams using the given application context module::initialiseStreams(registry.getApplicationContext()); // Remember the reference to the ModuleRegistry module::RegistryReference::Instance().setRegistry(registry); // Set up the assertion handler GlobalErrorHandler() = registry.getApplicationContext().getErrorHandlingFunction(); } DarkRadiant-2.0.2/plugins/commandsystem/CommandSystem.h000066400000000000000000000041331245424655700232160ustar00rootroot00000000000000#pragma once #include "icommandsystem.h" #include #include "CaseInsensitiveCompare.h" #include "Executable.h" namespace cmd { class CommandSystem : public ICommandSystem { // The named executables (case-insensitive lookup) typedef std::map CommandMap; CommandMap _commands; public: void foreachCommand(const std::function& functor); void addCommand(const std::string& name, Function func, const Signature& signature = Signature()); void removeCommand(const std::string& name); void addStatement(const std::string& statementName, const std::string& string, bool saveStatementToRegistry = true); void foreachStatement(const std::function& functor, bool customStatementsOnly); // Retrieve the signature for the given command Signature getSignature(const std::string& name); // Execute the given command sequence void execute(const std::string& input); void executeCommand(const std::string& name); void executeCommand(const std::string& name, const Argument& arg1); void executeCommand(const std::string& name, const Argument& arg1, const Argument& arg2); void executeCommand(const std::string& name, const Argument& arg1, const Argument& arg2, const Argument& arg3); // For more than 3 arguments, use this method to pass a vector of arguments void executeCommand(const std::string& name, const ArgumentList& args); // Get autocompletion suggestions for the given prefix AutoCompletionInfo getAutoCompletionInfo(const std::string& prefix); // The "bind" command void bindCmd(const ArgumentList& args); void unbindCmd(const ArgumentList& args); void listCmds(const ArgumentList& args); void printCmd(const ArgumentList& args); // RegisterableModule implementation const std::string& getName() const; const StringSet& getDependencies() const; void initialiseModule(const ApplicationContext& ctx); void shutdownModule(); private: // Save/load bind strings from Registry void loadBinds(); void saveBinds(); }; typedef std::shared_ptr CommandSystemPtr; } // namespace cmd DarkRadiant-2.0.2/plugins/commandsystem/CommandTokeniser.h000066400000000000000000000145731245424655700237060ustar00rootroot00000000000000#ifndef _COMMAND_TOKENISER_H_ #define _COMMAND_TOKENISER_H_ #include "parser/Tokeniser.h" namespace cmd { class CommandTokeniserFunc { // Enumeration of states enum States { SEARCHING, // haven't found anything yet TOKEN_STARTED, // found the start of a possible multi-char token DOUBLEQUOTE, // inside double-quoted text, no tokenising SINGLEQUOTE, // Inside single-quoted text, no tokenising } _state; // List of delimiters to skip const char* _delims; // Test if a character is a delimiter bool isDelim(char c) { const char* curDelim = _delims; while (*curDelim != 0) { if (*(curDelim++) == c) { return true; } } return false; } public: // Constructor CommandTokeniserFunc(const char* delims) : _state(SEARCHING), _delims(delims) {} /* REQUIRED. Operator() is called by the boost::tokenizer. This function * must search for a token between the two iterators next and end, and if * a token is found, set tok to the token, set next to position to start * parsing on the next call, and return true. */ template bool operator() (InputIterator& next, InputIterator end, Token& tok) { // Initialise state, no persistence between calls _state = SEARCHING; // Clear out the token, no guarantee that it is empty tok = ""; while (next != end) { switch (_state) { case SEARCHING: // If we have a delimiter, just advance to the next character if (isDelim(*next)) { ++next; continue; } // If we have a KEPT delimiter, this is the token to return. if (*next == ';') { tok = *(next++); return true; } // Otherwise fall through into TOKEN_STARTED, saving the state for the // next iteration _state = TOKEN_STARTED; case TOKEN_STARTED: // Here a delimiter indicates a successful token match if (isDelim(*next) || *next == ';') { return true; } // Now next is pointing at a non-delimiter. Switch on this // character. switch (*next) { // Found a quote, enter DOUBLEQUOTE state, or return the // current token if we are in the process of building // one. case '\"': if (tok != "") { return true; } else { _state = DOUBLEQUOTE; ++next; continue; // skip the quote } // Found a quote, enter SINGLEQUOTE state, or return the // current token if we are in the process of building // one. case '\'': if (tok != "") { return true; } else { _state = SINGLEQUOTE; ++next; continue; // skip the quote } // General case. Token lasts until next delimiter. default: tok += *next; ++next; continue; } case DOUBLEQUOTE: // In the quoted state, just advance until the closing // quote. No delimiter splitting is required. if (*next == '\"') { ++next; return true; } else { tok += *next; ++next; continue; } case SINGLEQUOTE: // In the quoted state, just advance until the closing // quote. No delimiter splitting is required. if (*next == '\'') { ++next; return true; } else { tok += *next; ++next; continue; } } // end of state switch } // end of for loop // Return true if we have added anything to the token return (tok != ""); } // REQUIRED. Reset function to clear internal state void reset() { _state = SEARCHING; } }; /** * greebo: A Command Tokeniser splits the given input strings into * pieces, delimited by whitespace characters. The tokeniser is respecting * quoted content, which will be treated as one string token (excluding the actual quotes). */ class CommandTokeniser : public parser::StringTokeniser { typedef boost::tokenizer Tokeniser; Tokeniser _tok; Tokeniser::iterator _tokIter; public: CommandTokeniser(const std::string& str) : _tok(str, CommandTokeniserFunc(" \n\t\v\r")), _tokIter(_tok.begin()) {} // Documentation: see base class bool hasMoreTokens() { return _tokIter != _tok.end(); } // Documentation: see base class std::string nextToken() { if (hasMoreTokens()) { return *(_tokIter++); } else { throw parser::ParseException("CommandTokeniser: no more tokens"); } } void assertNextToken(const std::string& val) { const std::string tok = nextToken(); if (tok != val) throw parser::ParseException("CommandTokeniser: Assertion failed: Required \"" + val + "\", found \"" + tok + "\""); } void skipTokens(unsigned int n) { for (unsigned int i = 0; i < n; i++) { if (hasMoreTokens()) { _tokIter++; } else { throw parser::ParseException("CommandTokeniser: no more tokens"); } } } }; } // namespace cmd #endif /* _COMMAND_TOKENISER_H_ */ DarkRadiant-2.0.2/plugins/commandsystem/Executable.h000066400000000000000000000010411245424655700225070ustar00rootroot00000000000000#ifndef _EXECUTABLE_H_ #define _EXECUTABLE_H_ #include "icommandsystem.h" #include namespace cmd { class Executable { public: /** * Destructor */ virtual ~Executable() {} /** * greebo: Execute this object with the given set of arguments. */ virtual void execute(const ArgumentList& args) = 0; /** * Returns the function signature (argumen types) of this executable. */ virtual Signature getSignature() = 0; }; typedef std::shared_ptr ExecutablePtr; } // namespace cmd #endif /* _EXECUTABLE_H_ */ DarkRadiant-2.0.2/plugins/commandsystem/Makefile.am000066400000000000000000000006461245424655700223230ustar00rootroot00000000000000AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs \ $(XML_CFLAGS) $(LIBSIGC_CFLAGS) modulesdir = $(pkglibdir)/modules modules_LTLIBRARIES = commandsystem.la commandsystem_la_LDFLAGS = -module -avoid-version commandsystem_la_LIBADD = $(top_builddir)/libs/xmlutil/libxmlutil.la \ $(XML_LIBS) \ $(LIBSIGC_LIBS) commandsystem_la_SOURCES = CommandSystem.cpp DarkRadiant-2.0.2/plugins/commandsystem/Makefile.in000066400000000000000000000563341245424655700223410ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/commandsystem DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(modulesdir)" LTLIBRARIES = $(modules_LTLIBRARIES) am__DEPENDENCIES_1 = commandsystem_la_DEPENDENCIES = \ $(top_builddir)/libs/xmlutil/libxmlutil.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_commandsystem_la_OBJECTS = CommandSystem.lo commandsystem_la_OBJECTS = $(am_commandsystem_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = commandsystem_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(commandsystem_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(commandsystem_la_SOURCES) DIST_SOURCES = $(commandsystem_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs \ $(XML_CFLAGS) $(LIBSIGC_CFLAGS) modulesdir = $(pkglibdir)/modules modules_LTLIBRARIES = commandsystem.la commandsystem_la_LDFLAGS = -module -avoid-version commandsystem_la_LIBADD = $(top_builddir)/libs/xmlutil/libxmlutil.la \ $(XML_LIBS) \ $(LIBSIGC_LIBS) commandsystem_la_SOURCES = CommandSystem.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/commandsystem/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/commandsystem/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-modulesLTLIBRARIES: $(modules_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(modules_LTLIBRARIES)'; test -n "$(modulesdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(modulesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(modulesdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulesdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulesdir)"; \ } uninstall-modulesLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(modules_LTLIBRARIES)'; test -n "$(modulesdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulesdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulesdir)/$$f"; \ done clean-modulesLTLIBRARIES: -test -z "$(modules_LTLIBRARIES)" || rm -f $(modules_LTLIBRARIES) @list='$(modules_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } commandsystem.la: $(commandsystem_la_OBJECTS) $(commandsystem_la_DEPENDENCIES) $(EXTRA_commandsystem_la_DEPENDENCIES) $(AM_V_CXXLD)$(commandsystem_la_LINK) -rpath $(modulesdir) $(commandsystem_la_OBJECTS) $(commandsystem_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CommandSystem.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(modulesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-modulesLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-modulesLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-modulesLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-modulesLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-modulesLTLIBRARIES \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-modulesLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/plugins/commandsystem/Statement.h000066400000000000000000000016251245424655700224020ustar00rootroot00000000000000#ifndef _STATEMENT_H_ #define _STATEMENT_H_ #include "itextstream.h" #include "Executable.h" namespace cmd { class Statement : public Executable { // The input string to execute std::string _string; // Whether this statement is a default one (won't be saved or deleted) bool _isReadOnly; public: Statement(const std::string& str, bool isReadOnly = false) : _string(str), _isReadOnly(isReadOnly) {} virtual void execute(const ArgumentList& args) { // Execution means parsing another string GlobalCommandSystem().execute(_string); } Signature getSignature() { return Signature(); // signature is always empty } const std::string& getValue() const { return _string; } // Whether this statement is a default one (won't be saved or deleted) bool isReadonly() { return _isReadOnly; } }; typedef std::shared_ptr StatementPtr; } // namespace cmd #endif /* _STATEMENT_H_ */ DarkRadiant-2.0.2/plugins/commandsystem/commandsystem.def000066400000000000000000000002371245424655700236260ustar00rootroot00000000000000; commandsystem.def : Declares the module parameters for the DLL. LIBRARY "COMMANDSYSTEM" EXPORTS ; Explicit exports can go here RegisterModule @1 DarkRadiant-2.0.2/plugins/dm.conversation/000077500000000000000000000000001245424655700205075ustar00rootroot00000000000000DarkRadiant-2.0.2/plugins/dm.conversation/CommandArgumentItem.cpp000066400000000000000000000055351245424655700251230ustar00rootroot00000000000000#include "CommandArgumentItem.h" #include "i18n.h" #include "string/convert.h" #include #include #include #include #include "wxutil/ChoiceHelper.h" #include namespace ui { CommandArgumentItem::CommandArgumentItem(wxWindow* parent, const conversation::ArgumentInfo& argInfo) : _argInfo(argInfo) { // Pack the label into an eventbox _labelBox = new wxStaticText(parent, wxID_ANY, _argInfo.title + ":"); _labelBox->SetToolTip(argInfo.description); // Pack the description widget into an eventbox _descBox = new wxStaticText(parent, wxID_ANY, "?"); _descBox->SetFont(_descBox->GetFont().Bold()); _descBox->SetToolTip(argInfo.description); } // Retrieve the label widget wxWindow* CommandArgumentItem::getLabelWidget() { return _labelBox; } wxWindow* CommandArgumentItem::getHelpWidget() { return _descBox; } // StringArgument StringArgument::StringArgument(wxWindow* parent, const conversation::ArgumentInfo& argInfo) : CommandArgumentItem(parent, argInfo) { _entry = new wxTextCtrl(parent, wxID_ANY); } wxWindow* StringArgument::getEditWidget() { return _entry; } std::string StringArgument::getValue() { return _entry->GetValue().ToStdString(); } void StringArgument::setValueFromString(const std::string& value) { _entry->SetValue(value); } // Boolean argument BooleanArgument::BooleanArgument(wxWindow* parent, const conversation::ArgumentInfo& argInfo) : CommandArgumentItem(parent, argInfo) { _checkButton = new wxCheckBox(parent, wxID_ANY, argInfo.title); } wxWindow* BooleanArgument::getEditWidget() { return _checkButton; } std::string BooleanArgument::getValue() { return _checkButton->GetValue() ? "1" : ""; } void BooleanArgument::setValueFromString(const std::string& value) { _checkButton->SetValue(value == "1"); } // Actor Argument ActorArgument::ActorArgument(wxWindow* parent, const conversation::ArgumentInfo& argInfo, const conversation::Conversation::ActorMap& actors) : CommandArgumentItem(parent, argInfo) { _comboBox = new wxChoice(parent, wxID_ANY); // Fill the actor list conversation::Conversation::ActorMap dummy = actors; for (conversation::Conversation::ActorMap::const_iterator i = dummy.begin(); i != dummy.end(); ++i) { std::string actorStr = (boost::format(_("Actor %d (%s)")) % i->first % i->second).str(); // Store the actor ID into a client data object and pass it along _comboBox->Append(actorStr, new wxStringClientData(string::to_string(i->first))); } } std::string ActorArgument::getValue() { return string::to_string(wxutil::ChoiceHelper::GetSelectionId(_comboBox)); } void ActorArgument::setValueFromString(const std::string& value) { wxutil::ChoiceHelper::SelectItemByStoredId(_comboBox, string::convert(value, wxNOT_FOUND)); } wxWindow* ActorArgument::getEditWidget() { return _comboBox; } } // namespace ui DarkRadiant-2.0.2/plugins/dm.conversation/CommandArgumentItem.h000066400000000000000000000054431245424655700245660ustar00rootroot00000000000000#pragma once #include "ConversationCommandInfo.h" #include "Conversation.h" #include class wxWindow; class wxStaticText; class wxTextCtrl; class wxCheckBox; class wxChoice; namespace ui { class CommandArgumentItem { protected: // The argument this row is referring to const conversation::ArgumentInfo& _argInfo; wxStaticText* _labelBox; wxStaticText* _descBox; public: CommandArgumentItem(wxWindow* parent, const conversation::ArgumentInfo& argInfo); // destructor virtual ~CommandArgumentItem() {} /** * greebo: This retrieves the string representation of the current * value of this row. This has to be implemented by the subclasses. */ virtual std::string getValue() = 0; /** * greebo: Loads the given value into the widgets, passed in string form. */ virtual void setValueFromString(const std::string& value) = 0; // Retrieve the label widget virtual wxWindow* getLabelWidget(); // Retrieve the edit widgets (abstract) virtual wxWindow* getEditWidget() = 0; // Retrieves the help widget (a question mark with a tooltip) virtual wxWindow* getHelpWidget(); }; typedef std::shared_ptr CommandArgumentItemPtr; /** * greebo: This is an item querying a simple string */ class StringArgument : public CommandArgumentItem { protected: wxTextCtrl* _entry; public: StringArgument(wxWindow* parent, const conversation::ArgumentInfo& argInfo); virtual wxWindow* getEditWidget(); virtual std::string getValue(); virtual void setValueFromString(const std::string& value); }; /** * greebo: This is an item querying a float (derives from string) */ class FloatArgument : public StringArgument { public: FloatArgument(wxWindow* parent, const conversation::ArgumentInfo& argInfo) : StringArgument(parent, argInfo) {} }; /** * greebo: This is an item querying a vector (derives from string) */ class VectorArgument : public StringArgument { public: VectorArgument(wxWindow* parent, const conversation::ArgumentInfo& argInfo) : StringArgument(parent, argInfo) {} }; class BooleanArgument : public CommandArgumentItem { protected: wxCheckBox* _checkButton; public: BooleanArgument(wxWindow* parent, const conversation::ArgumentInfo& argInfo); virtual wxWindow* getEditWidget(); virtual std::string getValue(); virtual void setValueFromString(const std::string& value); }; /** * greebo: This is an item querying an actor (dropdown combo) */ class ActorArgument : public CommandArgumentItem { protected: wxChoice* _comboBox; public: // Pass the reference to the helper class ActorArgument(wxWindow* parent, const conversation::ArgumentInfo& argInfo, const conversation::Conversation::ActorMap& actors); virtual wxWindow* getEditWidget(); virtual std::string getValue(); virtual void setValueFromString(const std::string& value); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.conversation/CommandEditor.cpp000066400000000000000000000220251245424655700237410ustar00rootroot00000000000000#include "CommandEditor.h" #include "i18n.h" #include "string/string.h" #include "string/convert.h" #include #include "itextstream.h" #include #include #include #include #include #include "wxutil/ChoiceHelper.h" #include "ConversationCommandLibrary.h" namespace ui { namespace { const char* const WINDOW_TITLE = N_("Edit Command"); } CommandEditor::CommandEditor(wxWindow* parent, conversation::ConversationCommand& command, const conversation::Conversation& conv) : DialogBase(_(WINDOW_TITLE), parent), _conversation(conv), _command(command), // copy the conversation command to a local object _targetCommand(command) { // Create all widgets populateWindow(); // Fill the actor dropdown for (conversation::Conversation::ActorMap::const_iterator i = _conversation.actors.begin(); i != _conversation.actors.end(); ++i) { std::string actorStr = (boost::format(_("Actor %d (%s)")) % i->first % i->second).str(); // Store the actor ID into a client data object and pass it along findNamedObject(this, "ConvCmdEditorActorChoice")->Append(actorStr, new wxStringClientData(string::to_string(i->first))); } // Let the command library fill the command dropdown conversation::ConversationCommandLibrary::Instance().populateChoice( findNamedObject(this, "ConvCmdEditorCommandChoice")); // Fill the values updateWidgets(); } void CommandEditor::updateWidgets() { // Select the actor passed from the command wxutil::ChoiceHelper::SelectItemByStoredId( findNamedObject(this, "ConvCmdEditorActorChoice"), _command.actor); // Select the command type wxutil::ChoiceHelper::SelectItemByStoredId( findNamedObject(this, "ConvCmdEditorCommandChoice"), _command.type); // Populate the correct command argument widgets createArgumentWidgets(_command.type); // Pre-fill the values for (conversation::ConversationCommand::ArgumentMap::const_iterator i = _command.arguments.begin(); i != _command.arguments.end(); ++i) { int argIndex = i->first; if (argIndex > static_cast(_argumentItems.size()) || argIndex < 0) { // Invalid command argument index rError() << "Invalid command argument index " << argIndex << std::endl; continue; } // Load the value into the argument item _argumentItems[argIndex - 1]->setValueFromString(i->second); } // Update the "wait until finished" flag findNamedObject(this, "ConvCmdEditorWaitUntilFinished")->SetValue(_command.waitUntilFinished); // Update the sensitivity of the correct flag upateWaitUntilFinished(_command.type); } void CommandEditor::save() { _command.actor = wxutil::ChoiceHelper::GetSelectionId( findNamedObject(this, "ConvCmdEditorActorChoice")); _command.type = wxutil::ChoiceHelper::GetSelectionId( findNamedObject(this, "ConvCmdEditorCommandChoice")); // Clear the existing arguments _command.arguments.clear(); int index = 1; for (ArgumentItemList::iterator i = _argumentItems.begin(); i != _argumentItems.end(); ++i, ++index) { _command.arguments[index] = (*i)->getValue(); } // Get the value of the "wait until finished" flag try { const conversation::ConversationCommandInfo& cmdInfo = conversation::ConversationCommandLibrary::Instance().findCommandInfo(_command.type); if (cmdInfo.waitUntilFinishedAllowed) { // Load the value _command.waitUntilFinished = findNamedObject(this, "ConvCmdEditorWaitUntilFinished")->GetValue(); } else { // Command doesn't support "wait until finished", set to default == true _command.waitUntilFinished = true; } } catch (std::runtime_error&) { rError() << "Cannot find conversation command info for index " << _command.type << std::endl; } // Copy the command over the target object _targetCommand = _command; } void CommandEditor::populateWindow() { loadNamedPanel(this, "ConvCmdEditorMainPanel"); makeLabelBold(this, "ConvCmdEditorActorLabel"); makeLabelBold(this, "ConvCmdEditorCommandLabel"); makeLabelBold(this, "ConvCmdEditorCmdArgLabel"); makeLabelBold(this, "ConvCmdEditorPropertiesLabel"); wxChoice* cmdDropDown = findNamedObject(this, "ConvCmdEditorCommandChoice"); cmdDropDown->Connect(wxEVT_CHOICE, wxCommandEventHandler(CommandEditor::onCommandTypeChange), NULL, this); // Wire up button events findNamedObject(this, "ConvCmdEditorCancelButton")->Connect( wxEVT_BUTTON, wxCommandEventHandler(CommandEditor::onCancel), NULL, this); findNamedObject(this, "ConvCmdEditorOkButton")->Connect( wxEVT_BUTTON, wxCommandEventHandler(CommandEditor::onSave), NULL, this); } void CommandEditor::commandTypeChanged() { int newCommandTypeID = -1; wxChoice* cmdDropDown = findNamedObject(this, "ConvCmdEditorCommandChoice"); int selectedItem = cmdDropDown->GetSelection(); wxStringClientData* cmdIdStr = static_cast(cmdDropDown->GetClientObject(selectedItem)); newCommandTypeID = string::convert(cmdIdStr->GetData().ToStdString(), -1); // Create the argument widgets for this new command type createArgumentWidgets(newCommandTypeID); // Update the sensitivity of the correct flag upateWaitUntilFinished(newCommandTypeID); } void CommandEditor::upateWaitUntilFinished(int commandTypeID) { // Update the sensitivity of the correct flag try { const conversation::ConversationCommandInfo& cmdInfo = conversation::ConversationCommandLibrary::Instance().findCommandInfo(commandTypeID); findNamedObject(this, "ConvCmdEditorWaitUntilFinished")->Enable(cmdInfo.waitUntilFinishedAllowed); } catch (std::runtime_error&) { rError() << "Cannot find conversation command info for index " << commandTypeID << std::endl; } } void CommandEditor::createArgumentWidgets(int commandTypeID) { try { const conversation::ConversationCommandInfo& cmdInfo = conversation::ConversationCommandLibrary::Instance().findCommandInfo(commandTypeID); // Remove all possible previous items from the list _argumentItems.clear(); // Clear the panel and add a new table wxPanel* argPanel = findNamedObject(this, "ConvCmdEditorArgPanel"); argPanel->DestroyChildren(); // Create the table wxFlexGridSizer* table = new wxFlexGridSizer(static_cast(cmdInfo.arguments.size()), 3, 6, 12); table->AddGrowableCol(1); argPanel->SetSizer(table); if (cmdInfo.arguments.empty()) { wxStaticText* noneText = new wxStaticText(argPanel, wxID_ANY, _("None")); noneText->SetFont(noneText->GetFont().Italic()); argPanel->GetSizer()->Add(noneText, 0, wxLEFT, 6); return; } // Setup the table with default spacings typedef conversation::ConversationCommandInfo::ArgumentInfoList::const_iterator ArgumentIter; int index = 1; for (ArgumentIter i = cmdInfo.arguments.begin(); i != cmdInfo.arguments.end(); ++i, ++index) { const conversation::ArgumentInfo& argInfo = *i; CommandArgumentItemPtr item; switch (argInfo.type) { case conversation::ArgumentInfo::ARGTYPE_BOOL: // Create a new bool argument item item = CommandArgumentItemPtr(new BooleanArgument(argPanel, argInfo)); break; case conversation::ArgumentInfo::ARGTYPE_INT: case conversation::ArgumentInfo::ARGTYPE_FLOAT: case conversation::ArgumentInfo::ARGTYPE_STRING: // Create a new string argument item item = CommandArgumentItemPtr(new StringArgument(argPanel, argInfo)); break; case conversation::ArgumentInfo::ARGTYPE_VECTOR: case conversation::ArgumentInfo::ARGTYPE_SOUNDSHADER: // Create a new string argument item item = CommandArgumentItemPtr(new StringArgument(argPanel, argInfo)); break; case conversation::ArgumentInfo::ARGTYPE_ACTOR: // Create a new actor argument item item = CommandArgumentItemPtr(new ActorArgument(argPanel, argInfo, _conversation.actors)); break; case conversation::ArgumentInfo::ARGTYPE_ENTITY: // Create a new string argument item item = CommandArgumentItemPtr(new StringArgument(argPanel, argInfo)); break; default: rError() << "Unknown command argument type: " << argInfo.type << std::endl; break; }; if (item != NULL) { _argumentItems.push_back(item); // The label table->Add(item->getLabelWidget(), 0, wxALIGN_CENTER_VERTICAL | wxLEFT, 6); // The edit widgets table->Add(item->getEditWidget(), 1, wxEXPAND, wxALIGN_CENTER_VERTICAL); // The help widgets table->Add(item->getHelpWidget(), 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxRIGHT, 6); } } } catch (std::runtime_error&) { rError() << "Cannot find conversation command info for index " << commandTypeID << std::endl; } wxPanel* mainPanel = findNamedObject(this, "ConvCmdEditorMainPanel"); mainPanel->Fit(); mainPanel->Layout(); Fit(); } void CommandEditor::onSave(wxCommandEvent& ev) { save(); EndModal(wxID_OK); } void CommandEditor::onCancel(wxCommandEvent& ev) { // Just close the window without writing the values EndModal(wxID_CANCEL); } void CommandEditor::onCommandTypeChange(wxCommandEvent& ev) { commandTypeChanged(); } } // namespace ui DarkRadiant-2.0.2/plugins/dm.conversation/CommandEditor.h000066400000000000000000000024051245424655700234060ustar00rootroot00000000000000#pragma once #include "wxutil/TreeModel.h" #include "wxutil/dialog/DialogBase.h" #include "wxutil/XmlResourceBasedWidget.h" #include "Conversation.h" #include "ConversationCommand.h" #include "ConversationCommandLibrary.h" #include "CommandArgumentItem.h" namespace ui { class CommandEditor : public wxutil::DialogBase, private wxutil::XmlResourceBasedWidget { private: // The conversation (read-only) const conversation::Conversation& _conversation; // The command we're editing (working copy) conversation::ConversationCommand _command; // The actual command we're saving to on "OK" conversation::ConversationCommand& _targetCommand; typedef std::vector ArgumentItemList; ArgumentItemList _argumentItems; public: // Pass the parent window, the command and the conversation to edit CommandEditor(wxWindow* parent, conversation::ConversationCommand& command, const conversation::Conversation& conv); private: void populateWindow(); void updateWidgets(); void save(); void commandTypeChanged(); void createArgumentWidgets(int commandTypeID); void upateWaitUntilFinished(int commandTypeID); void onSave(wxCommandEvent& ev); void onCancel(wxCommandEvent& ev); void onCommandTypeChange(wxCommandEvent& ev); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.conversation/Conversation.h000066400000000000000000000030261245424655700233330ustar00rootroot00000000000000#ifndef CONVERSATION_H_ #define CONVERSATION_H_ #include #include #include #include "ConversationCommand.h" namespace conversation { /** * Data object representing a single Conversation. */ class Conversation { public: // The (unique) name of this conversation std::string name; float talkDistance; bool actorsMustBeWithinTalkdistance; bool actorsAlwaysFaceEachOther; int maxPlayCount; // Indexed list of commands typedef std::map CommandMap; CommandMap commands; // Indexed list of actors (by name) typedef std::map ActorMap; ActorMap actors; // Constructor Conversation() : talkDistance(60), actorsMustBeWithinTalkdistance(true), actorsAlwaysFaceEachOther(true), maxPlayCount(-1) {} // Copy Constructor Conversation(const Conversation& other) : name(other.name), talkDistance(other.talkDistance), actorsMustBeWithinTalkdistance(other.actorsMustBeWithinTalkdistance), actorsAlwaysFaceEachOther(other.actorsAlwaysFaceEachOther), maxPlayCount(other.maxPlayCount), actors(other.actors) { // Copy all commands, one by one for (CommandMap::const_iterator i = other.commands.begin(); i != other.commands.end(); ++i) { // Copy-construct a new conversation command ConversationCommandPtr copy(new ConversationCommand(*i->second)); // Insert this into our own map commands[i->first] = copy; } } }; /** * Conversation map type. */ typedef std::map ConversationMap; } #endif /* CONVERSATION_H_ */ DarkRadiant-2.0.2/plugins/dm.conversation/ConversationCommand.cpp000066400000000000000000000025511245424655700251670ustar00rootroot00000000000000#include "ConversationCommand.h" #include "string/convert.h" #include #include "ConversationCommandLibrary.h" namespace conversation { ConversationCommand::ConversationCommand() : type(-1), // invalid id actor(-1), waitUntilFinished(true) {} std::string ConversationCommand::getArgument(int index) const { ArgumentMap::const_iterator i = arguments.find(index); return (i != arguments.end()) ? i->second : ""; } std::string ConversationCommand::getSentence() const { // Get the command description for this type try { const ConversationCommandInfo& cmdInfo = ConversationCommandLibrary::Instance().findCommandInfo(type); // Get the sentence and fill in the placeholders, if any std::string sentence = cmdInfo.sentence; int counter = 1; for (ConversationCommandInfo::ArgumentInfoList::const_iterator i = cmdInfo.arguments.begin(); i != cmdInfo.arguments.end(); ++i, ++counter) { std::string needle = "[arg" + string::to_string(counter) + "]"; std::string replacement = getArgument(counter); // Check for a bool /*if (i->second.type == "b") { replacement = (i->second.value.empty()) ? "no" : "yes"; }*/ boost::algorithm::replace_all(sentence, needle, replacement); } return sentence; } catch (std::runtime_error&) { return "Unrecognised command."; } } } // namespace conversation DarkRadiant-2.0.2/plugins/dm.conversation/ConversationCommand.h000066400000000000000000000017501245424655700246340ustar00rootroot00000000000000#ifndef CONVERSATION_COMMAND_H_ #define CONVERSATION_COMMAND_H_ #include #include #include namespace conversation { /** * Data object representing a single ConversationCommand. */ class ConversationCommand { public: // What kind of command this is (index of a certain ConversationCommandInfo structure) int type; // Which actor should perform this command. int actor; // whether the command must be finished before the next command can start bool waitUntilFinished; // The numbered arguments typedef std::map ArgumentMap; ArgumentMap arguments; // Constructor ConversationCommand(); /** * greebo: Returns a human-readable version of this command. */ std::string getSentence() const; // Returns the argument with the given index or "" if not found std::string getArgument(int index) const; }; typedef std::shared_ptr ConversationCommandPtr; } // namespace conversation #endif /* CONVERSATION_COMMAND_H_ */ DarkRadiant-2.0.2/plugins/dm.conversation/ConversationCommandInfo.cpp000066400000000000000000000044411245424655700260030ustar00rootroot00000000000000#include "ConversationCommandInfo.h" #include "string/string.h" #include "itextstream.h" #include "eclass.h" namespace conversation { // initialise the static member variable int ConversationCommandInfo::_highestId = 0; void ConversationCommandInfo::parseFromEntityClass(const IEntityClassPtr& eclass) { assert(eclass != NULL); // don't accept NULL pointers name = eclass->getAttribute("editor_cmdName").getValue(); waitUntilFinishedAllowed = (eclass->getAttribute("editor_waitUntilFinishedAllowed").getValue() == "1"); sentence = eclass->getAttribute("editor_sentence").getValue(); // Read the arguments // Find all attributes matching "argType", this spawnarg is mandatory eclass::AttributeList argTypes = eclass::getSpawnargsWithPrefix( *eclass, "editor_argType" ); for (eclass::AttributeList::const_iterator i = argTypes.begin(); i != argTypes.end(); ++i) { // Cut off the "editor_argType" part and retrieve the number std::string argIndex = i->getName().substr(14); ArgumentInfo info; info.required = (eclass->getAttribute("editor_argRequired" + argIndex).getValue() != "0"); info.description = eclass->getAttribute("editor_argDesc" + argIndex).getValue(); info.title = eclass->getAttribute("editor_argTitle" + argIndex).getValue(); std::string argTypeStr = eclass->getAttribute("editor_argType" + argIndex).getValue(); if (argTypeStr == "float") { info.type = ArgumentInfo::ARGTYPE_FLOAT; } else if (argTypeStr == "int") { info.type = ArgumentInfo::ARGTYPE_INT; } else if (argTypeStr == "string") { info.type = ArgumentInfo::ARGTYPE_STRING; } else if (argTypeStr == "vector") { info.type = ArgumentInfo::ARGTYPE_VECTOR; } else if (argTypeStr == "soundshader") { info.type = ArgumentInfo::ARGTYPE_SOUNDSHADER; } else if (argTypeStr == "actor") { info.type = ArgumentInfo::ARGTYPE_ACTOR; } else if (argTypeStr == "entity") { info.type = ArgumentInfo::ARGTYPE_ENTITY; } else if (argTypeStr == "bool") { info.type = ArgumentInfo::ARGTYPE_BOOL; } else { rError() << "Could not determine Conversation Command Argument type: " << argTypeStr << " on entityDef " << eclass->getName() << std::endl; } // add the argument to the local list arguments.push_back(info); } } } // namespace conversation DarkRadiant-2.0.2/plugins/dm.conversation/ConversationCommandInfo.h000066400000000000000000000033771245424655700254570ustar00rootroot00000000000000#ifndef CONVERSATION_COMMAND_INFO_H_ #define CONVERSATION_COMMAND_INFO_H_ #include "ieclass.h" #include namespace conversation { // Information about a single conversation command argument struct ArgumentInfo { enum ArgumentType { ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_STRING, ARGTYPE_VECTOR, ARGTYPE_SOUNDSHADER, ARGTYPE_ACTOR, ARGTYPE_ENTITY, ARGTYPE_BOOL, NUM_ARGTYPES, }; ArgumentType type; std::string description; std::string title; bool required; }; /** * greebo: This structure holds information about a certain * Conversation Command Type (e.g. "WaitSeconds") and its arguments. * * As the number and type of arguments varies, the CommandEditor GUI * needs this structure to build the variable interface. */ class ConversationCommandInfo { public: // The unique id of this conversation command. int id; // The internal name, like "WaitSeconds" or "InteractWithEntity" std::string name; // Whether the "wait until finished" checkbox is displayed bool waitUntilFinishedAllowed; // The "human readable" sentence format (with placeholders) std::string sentence; typedef std::vector ArgumentInfoList; ArgumentInfoList arguments; ConversationCommandInfo() : id(++_highestId), waitUntilFinishedAllowed(true) {} // Fills the member variables from the given entityDef void parseFromEntityClass(const IEntityClassPtr& eclass); private: // Highest ID so far static int _highestId; }; typedef std::shared_ptr ConversationCommandInfoPtr; // A mapping between command typenames ("WalkToActor") to actual information structures typedef std::map ConversationCommandInfoMap; } // namespace conversation #endif /* CONVERSATION_COMMAND_INFO_H_ */ DarkRadiant-2.0.2/plugins/dm.conversation/ConversationCommandLibrary.cpp000066400000000000000000000055111245424655700265130ustar00rootroot00000000000000#include "ConversationCommandLibrary.h" #include "ieclass.h" #include "iregistry.h" #include "gamelib.h" #include "string/convert.h" #include #include namespace conversation { /** greebo: The visitor class that stores all the relevant eclassptrs * into the given target map if the prefix matches. */ class ConversationCommandInfoLoader : public EntityClassVisitor { // The target map to populate ConversationCommandInfoMap& _map; // The entityDef prefix (e.g. "atdm:conversation_command_") std::string _prefix; public: /** * greebo: Pass the target map where all the eclassptrs should be stored into. */ ConversationCommandInfoLoader(ConversationCommandInfoMap& map) : _map(map), _prefix(game::current::getValue(GKEY_CONVERSATION_COMMAND_INFO_PREFIX)) {} void visit(const IEntityClassPtr& eclass) { if (boost::algorithm::starts_with(eclass->getName(), _prefix)) { // We have a match, create a new structure ConversationCommandInfoPtr commandInfo(new ConversationCommandInfo); // Fill the values from the found entityDef commandInfo->parseFromEntityClass(eclass); // Store the structure to the target map _map[commandInfo->name] = commandInfo; } } }; ConversationCommandLibrary::ConversationCommandLibrary() { loadConversationCommands(); } const ConversationCommandInfo& ConversationCommandLibrary::findCommandInfo(const std::string& name) { ConversationCommandInfoMap::const_iterator i = _commandInfo.find(name); if (i == _commandInfo.end()) { throw std::runtime_error(std::string("Could not find command info with the given name: ") + name); } return *(i->second); } const ConversationCommandInfo& ConversationCommandLibrary::findCommandInfo(int id) { for (ConversationCommandInfoMap::const_iterator i = _commandInfo.begin(); i != _commandInfo.end(); ++i) { if (i->second->id == id) { return *(i->second); } } throw std::runtime_error(std::string("Could not find command info with the given ID: ") + string::to_string(id)); } void ConversationCommandLibrary::loadConversationCommands() { // Load the possible command types ConversationCommandInfoLoader loader(_commandInfo); GlobalEntityClassManager().forEachEntityClass(loader); } void ConversationCommandLibrary::populateChoice(wxChoice* choice) { // Iterate over everything and push the data into the liststore for (ConversationCommandInfoMap::const_iterator i = _commandInfo.begin(); i != _commandInfo.end(); ++i) { // Store the actor ID into a client data object and pass it along choice->Append(i->second->name, new wxStringClientData(string::to_string(i->second->id))); } } // Static accessor ConversationCommandLibrary& ConversationCommandLibrary::Instance() { static ConversationCommandLibrary _instance; return _instance; } } // namespace conversation DarkRadiant-2.0.2/plugins/dm.conversation/ConversationCommandLibrary.h000066400000000000000000000027441245424655700261650ustar00rootroot00000000000000#pragma once #include "ConversationCommandInfo.h" class wxChoice; namespace conversation { namespace { const std::string GKEY_CONVERSATION_COMMAND_INFO_PREFIX = "/conversationSystem/conversationCommandPrefix"; } /** * greebo: This class holds all the possible conversation command types, * indexed by name. Each conversation commmand is parsed from an entityDef * matching a given prefix and holding a bunch of information about that command. * * The ConversationCommand editor is using this information to construct * the UI elements. */ class ConversationCommandLibrary { // The map containing the named information ConversationCommandInfoMap _commandInfo; // Private constructor, loads all matching entityDefs ConversationCommandLibrary(); public: // Accessor to the singleton instance static ConversationCommandLibrary& Instance(); /** * Returns the command info with the given typename or ID. Throws an exception if not found. * * @throws: std::runtime error if the named info structure could not be found. */ const ConversationCommandInfo& findCommandInfo(const std::string& name); const ConversationCommandInfo& findCommandInfo(int id); /** * greebo: This populates the given choice field with all available commands. The command ID * will be attached to the items as wxStringClientData. */ void populateChoice(wxChoice* choice); private: // Loads all entityDefs matching the given prefix void loadConversationCommands(); }; } // namespace conversation DarkRadiant-2.0.2/plugins/dm.conversation/ConversationDialog.cpp000066400000000000000000000252671245424655700250210ustar00rootroot00000000000000#include "ConversationDialog.h" #include "i18n.h" #include "iregistry.h" #include "iundo.h" #include "ieclass.h" #include "imainframe.h" #include "iscenegraph.h" #include "string/string.h" #include "wxutil/TreeModel.h" #include "wxutil/dialog/MessageBox.h" #include "RandomOrigin.h" #include "ConversationEntityFinder.h" #include "ConversationEditor.h" #include #include #include #include #include namespace ui { namespace { const char* const WINDOW_TITLE = N_("Conversation Editor"); const std::string CONVERSATION_ENTITY_CLASS = "atdm:conversation_info"; } ConversationDialog::ConversationDialog() : DialogBase(_(WINDOW_TITLE)), _entityList(new wxutil::TreeModel(_convEntityColumns, true)), _entityView(NULL), _convList(new wxutil::TreeModel(_convColumns, true)), _convView(NULL) { // Create the widgets populateWindow(); FitToScreen(0.3f, 0.5f); } void ConversationDialog::populateWindow() { wxPanel* mainPanel = loadNamedPanel(this, "ConvDialogMainPanel"); wxPanel* entityPanel = findNamedObject(this, "ConvDialogEntityPanel"); // Entity Tree View _entityView = wxutil::TreeView::CreateWithModel(entityPanel, _entityList, wxDV_NO_HEADER); entityPanel->GetSizer()->Add(_entityView, 1, wxEXPAND); _entityView->AppendTextColumn("", _convEntityColumns.displayName.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); _entityView->Connect(wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(ConversationDialog::onEntitySelectionChanged), NULL, this); // Wire up button signals _addEntityButton = findNamedObject(this, "ConvDialogAddEntityButton"); _addEntityButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationDialog::onAddEntity), NULL, this); _deleteEntityButton = findNamedObject(this, "ConvDialogDeleteEntityButton"); _deleteEntityButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationDialog::onDeleteEntity), NULL, this); _deleteEntityButton->Enable(false); wxPanel* convPanel = findNamedObject(this, "ConvDialogConversationPanel"); _convView = wxutil::TreeView::CreateWithModel(convPanel, _convList); // Key and value text columns _convView->AppendTextColumn("#", _convColumns.index.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); _convView->AppendTextColumn(_("Name"), _convColumns.name.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); _convView->Connect(wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(ConversationDialog::onConversationSelectionChanged), NULL, this); convPanel->GetSizer()->Add(_convView, 1, wxEXPAND); convPanel->Enable(false); // Wire up button signals _addConvButton = findNamedObject(this, "ConvDialogAddConvButton"); _addConvButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationDialog::onAddConversation), NULL, this); _addConvButton->Enable(false); // not enabled without selection _editConvButton = findNamedObject(this, "ConvDialogEditConvButton"); _editConvButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationDialog::onEditConversation), NULL, this); _editConvButton->Enable(false); // not enabled without selection _deleteConvButton = findNamedObject(this, "ConvDialogDeleteConvButton"); _deleteConvButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationDialog::onDeleteConversation), NULL, this); _deleteConvButton->Enable(false); // not enabled without selection _clearConvButton = findNamedObject(this, "ConvDialogClearConvButton"); _clearConvButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationDialog::onClearConversations), NULL, this); _clearConvButton->Enable(false); // requires >0 conversations // Boldify a few labels makeLabelBold(this, "ConvDialogEntityLabel"); makeLabelBold(this, "ConvDialogConvLabel"); // Connect dialog buttons findNamedObject(this, "ConvDialogCancelButton")->Connect( wxEVT_BUTTON, wxCommandEventHandler(ConversationDialog::onCancel), NULL, this); findNamedObject(this, "ConvDialogOkButton")->Connect( wxEVT_BUTTON, wxCommandEventHandler(ConversationDialog::onOK), NULL, this); } void ConversationDialog::save() { // Consistency check can go here // Scoped undo object UndoableCommand command("editConversations"); // Save the working set to the entity for (conversation::ConversationEntityMap::iterator i = _entities.begin(); i != _entities.end(); ++i) { i->second->writeToEntity(); } } void ConversationDialog::clear() { // Clear internal data _entities.clear(); _curEntity = _entities.end(); // Clear the list boxes _entityList->Clear(); _convList->Clear(); } void ConversationDialog::refreshConversationList() { // Clear and refresh the conversation list _convList->Clear(); _curEntity->second->populateListStore(*_convList, _convColumns); // If there is at least one conversation, make the Clear button available _clearConvButton->Enable(!_curEntity->second->isEmpty()); } void ConversationDialog::populateWidgets() { // First clear the data clear(); // Use an ConversationEntityFinder to walk the map and add any conversation // entities to the liststore and entity map conversation::ConversationEntityFinder finder( _entityList, _convEntityColumns, _entities, CONVERSATION_ENTITY_CLASS ); GlobalSceneGraph().root()->traverseChildren(finder); updateConversationPanelSensitivity(); } int ConversationDialog::ShowModal() { populateWidgets(); int returnCode = DialogBase::ShowModal(); if (returnCode == wxID_OK) { save(); } return returnCode; } // Static command target void ConversationDialog::ShowDialog(const cmd::ArgumentList& args) { // Construct a new instance, this enters the main loop ConversationDialog* editor = new ConversationDialog; editor->ShowModal(); editor->Destroy(); } void ConversationDialog::updateConversationPanelSensitivity() { // Clear the conversations list _convList->Clear(); wxDataViewItem item = _entityView->GetSelection(); if (item.IsOk()) { // Get name of the entity and find the corresponding ConversationEntity in the map wxutil::TreeModel::Row row(item, *_entityList); std::string name = row[_convEntityColumns.entityName]; // Save the current selection and refresh the conversation list _curEntity = _entities.find(name); refreshConversationList(); // Enable the delete button and conversation panel _deleteEntityButton->Enable(true); findNamedObject(this, "ConvDialogConversationPanel")->Enable(true); _addConvButton->Enable(true); } else { // No selection, disable the delete button and clear the conversation panel _deleteEntityButton->Enable(false); // Disable all the Conversation buttons findNamedObject(this, "ConvDialogConversationPanel")->Enable(false); _addConvButton->Enable(false); _editConvButton->Enable(false); _deleteConvButton->Enable(false); _clearConvButton->Enable(false); } } // Callback for conversation entity selection changed in list box void ConversationDialog::onEntitySelectionChanged(wxDataViewEvent& ev) { updateConversationPanelSensitivity(); } void ConversationDialog::onOK(wxCommandEvent& ev) { EndModal(wxID_OK); } void ConversationDialog::onCancel(wxCommandEvent& ev) { EndModal(wxID_CANCEL); } // Add a new conversations entity button void ConversationDialog::onAddEntity(wxCommandEvent& ev) { // Obtain the entity class object IEntityClassPtr eclass = GlobalEntityClassManager().findClass(CONVERSATION_ENTITY_CLASS); if (eclass) { // Construct a Node of this entity type IEntityNodePtr node(GlobalEntityCreator().createEntity(eclass)); // Create a random offset node->getEntity().setKeyValue( "origin", RandomOrigin::generate(128) ); // Insert the node into the scene graph assert(GlobalSceneGraph().root()); GlobalSceneGraph().root()->addChildNode(node); // Refresh the widgets populateWidgets(); } else { // conversation entityclass was not found wxutil::Messagebox::ShowError( (boost::format(_("Unable to create conversation Entity: class '%s' not found.")) % CONVERSATION_ENTITY_CLASS).str() ); } } // Delete entity button void ConversationDialog::onDeleteEntity(wxCommandEvent& ev) { // Get the Node* from the tree model and remove it from the scenegraph wxDataViewItem item = _entityView->GetSelection(); if (item) { // Get the name of the selected entity wxutil::TreeModel::Row row(item, *_entityList); std::string name = row[_convEntityColumns.entityName]; // Instruct the ConversationEntity to delete its world node, and then // remove it from the map _entities[name]->deleteWorldNode(); _entities.erase(name); // Update the widgets to remove the selection from the list populateWidgets(); } } // Callback for current conversation selection changed void ConversationDialog::onConversationSelectionChanged(wxDataViewEvent& ev) { // Get the selection _currentConversation = _convView->GetSelection(); if (_currentConversation.IsOk()) { // Enable the edit and delete buttons _editConvButton->Enable(true); _deleteConvButton->Enable(true); } else { // Disable the edit and delete buttons _editConvButton->Enable(false); _deleteConvButton->Enable(false); } } void ConversationDialog::onAddConversation(wxCommandEvent& ev) { // Add a new conversation to the ConversationEntity and refresh the list store _curEntity->second->addConversation(); refreshConversationList(); } void ConversationDialog::onEditConversation(wxCommandEvent& ev) { // Retrieve the index of the current conversation wxutil::TreeModel::Row row(_currentConversation, *_convList); int index = row[_convColumns.index].getInteger(); conversation::Conversation& conv = _curEntity->second->getConversation(index); // Display the edit dialog, blocks on construction ConversationEditor* editor = new ConversationEditor(this, conv); editor->ShowModal(); editor->Destroy(); // Repopulate the conversation list refreshConversationList(); } void ConversationDialog::onDeleteConversation(wxCommandEvent& ev) { // Get the index of the current conversation wxutil::TreeModel::Row row(_currentConversation, *_convList); int index = row[_convColumns.index].getInteger(); // Tell the ConversationEntity to delete this conversation _curEntity->second->deleteConversation(index); // Repopulate the conversation list refreshConversationList(); } void ConversationDialog::onClearConversations(wxCommandEvent& ev) { // Clear the entity and refresh the list _curEntity->second->clearConversations(); refreshConversationList(); } } // namespace ui DarkRadiant-2.0.2/plugins/dm.conversation/ConversationDialog.h000066400000000000000000000046011245424655700244530ustar00rootroot00000000000000#pragma once #include #include "ieventmanager.h" #include "ientity.h" #include "icommandsystem.h" #include "iradiant.h" #include "wxutil/dialog/DialogBase.h" #include "wxutil/XmlResourceBasedWidget.h" #include "wxutil/TreeView.h" #include "ConversationEntity.h" namespace ui { class ConversationDialog; typedef std::shared_ptr ConversationDialogPtr; /** * greebo: The conversation dialog is a modal top-level window providing * views and controls to facilitate the setup of inter-AI conversations. */ class ConversationDialog : public wxutil::DialogBase, private wxutil::XmlResourceBasedWidget { private: // List of conversation_info entities conversation::ConvEntityColumns _convEntityColumns; wxutil::TreeModel::Ptr _entityList; wxutil::TreeView* _entityView; // List of conversations on the selected entity conversation::ConversationColumns _convColumns; wxutil::TreeModel::Ptr _convList; wxutil::TreeView* _convView; // Map of ConversationEntity objects, indexed by the name of the world entity conversation::ConversationEntityMap _entities; // Iterators for current entity and current objective conversation::ConversationEntityMap::iterator _curEntity; wxDataViewItem _currentConversation; wxButton* _addConvButton; wxButton* _editConvButton; wxButton* _deleteConvButton; wxButton* _clearConvButton; wxButton* _addEntityButton; wxButton* _deleteEntityButton; public: ConversationDialog(); // Command target to toggle the dialog static void ShowDialog(const cmd::ArgumentList& args); // Override DialogBase virtual int ShowModal(); private: // greebo: Saves the current working set to the entity void save(); // Clears out all stored data void clear(); void populateWidgets(); // Re-loads the conversation from the selected entity void refreshConversationList(); void updateConversationPanelSensitivity(); // WIDGET POPULATION void populateWindow(); // Button callbacks void onOK(wxCommandEvent& ev); void onCancel(wxCommandEvent& ev); void onEntitySelectionChanged(wxDataViewEvent& ev); void onAddEntity(wxCommandEvent& ev); void onDeleteEntity(wxCommandEvent& ev); void onConversationSelectionChanged(wxDataViewEvent& ev); void onAddConversation(wxCommandEvent& ev); void onEditConversation(wxCommandEvent& ev); void onDeleteConversation(wxCommandEvent& ev); void onClearConversations(wxCommandEvent& ev); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.conversation/ConversationEditor.cpp000066400000000000000000000404161245424655700250410ustar00rootroot00000000000000#include "ConversationEditor.h" #include "i18n.h" #include "string/string.h" #include #include #include "CommandEditor.h" #include #include #include #include #include #include #include namespace ui { namespace { const char* const WINDOW_TITLE = N_("Edit Conversation"); } ConversationEditor::ConversationEditor(wxWindow* parent, conversation::Conversation& conversation) : DialogBase(_(WINDOW_TITLE), parent), _actorStore(new wxutil::TreeModel(_actorColumns, true)), _commandStore(new wxutil::TreeModel(_commandColumns, true)), _conversation(conversation), // copy the conversation to a local object _targetConversation(conversation), _updateInProgress(false) { // Create the widgets populateWindow(); // Load the conversation values into the widgets updateWidgets(); // Clear the button sensitivity in the command actions panel updateCmdActionSensitivity(false); SetSize(500, 680); } void ConversationEditor::populateWindow() { loadNamedPanel(this, "ConvEditorMainPanel"); makeLabelBold(this, "ConvEditorPropertyLabel"); makeLabelBold(this, "ConvEditorActorLabel"); makeLabelBold(this, "ConvEditorCommandLabel"); findNamedObject(this, "ConvEditorRepeatCheckbox")->Connect( wxEVT_CHECKBOX, wxCommandEventHandler(ConversationEditor::onMaxPlayCountEnabled), NULL, this); // Actor Panel wxPanel* actorPanel = findNamedObject(this, "ConvEditorActorPanel"); _actorView = wxutil::TreeView::CreateWithModel(actorPanel, _actorStore); _actorView->SetSize(wxSize(350, 160)); actorPanel->GetSizer()->Add(_actorView, 1, wxEXPAND); _actorView->AppendTextColumn("#", _actorColumns.actorNumber.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); _actorView->AppendTextColumn(_("Actor (click to edit)"), _actorColumns.displayName.getColumnIndex(), wxDATAVIEW_CELL_EDITABLE, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); _actorView->Connect(wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(ConversationEditor::onActorSelectionChanged), NULL, this); _actorView->Connect(wxEVT_DATAVIEW_ITEM_EDITING_DONE, wxDataViewEventHandler(ConversationEditor::onActorEdited), NULL, this); // Wire up button signals _addActorButton = findNamedObject(this, "ConvEditorAddActorButton"); _addActorButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationEditor::onAddActor), NULL, this); _delActorButton = findNamedObject(this, "ConvEditorDeleteActorButton"); _delActorButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationEditor::onDeleteActor), NULL, this); _delActorButton->Enable(false); // Command Panel wxPanel* commandPanel = findNamedObject(this, "ConvEditorCommandPanel"); _commandView = wxutil::TreeView::CreateWithModel(commandPanel, _commandStore); _commandView->SetSize(wxSize(350, 200)); commandPanel->GetSizer()->Add(_commandView, 1, wxEXPAND); _commandView->AppendTextColumn("#", _commandColumns.cmdNumber.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT); _commandView->AppendTextColumn(_("Actor"), _commandColumns.actorName.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT); _commandView->AppendTextColumn(_("Command"), _commandColumns.sentence.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT); _commandView->AppendTextColumn(_("Wait"), _commandColumns.wait.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT); _commandView->Connect(wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(ConversationEditor::onCommandSelectionChanged), NULL, this); // Wire up buttons _addCmdButton = findNamedObject(this, "ConvEditorAddCommandButton"); _addCmdButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationEditor::onAddCommand), NULL, this); _delCmdButton = findNamedObject(this, "ConvEditorDeleteCommandButton"); _delCmdButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationEditor::onDeleteCommand), NULL, this); _delCmdButton->Enable(false); _editCmdButton = findNamedObject(this, "ConvEditorEditCommandButton"); _editCmdButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationEditor::onEditCommand), NULL, this); _editCmdButton->Enable(false); _moveUpCmdButton = findNamedObject(this, "ConvEditorMoveUpCommandButton"); _moveUpCmdButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationEditor::onMoveUpCommand), NULL, this); _moveUpCmdButton->Enable(false); _moveDownCmdButton = findNamedObject(this, "ConvEditorMoveDownCommandButton"); _moveDownCmdButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationEditor::onMoveDownCommand), NULL, this); _moveDownCmdButton->Enable(false); // Dialog buttons findNamedObject(this, "ConvEditorCancelButton")->Connect( wxEVT_BUTTON, wxCommandEventHandler(ConversationEditor::onCancel), NULL, this); findNamedObject(this, "ConvEditorOkButton")->Connect( wxEVT_BUTTON, wxCommandEventHandler(ConversationEditor::onSave), NULL, this); } void ConversationEditor::updateWidgets() { _updateInProgress = true; // Clear the liststore first _actorStore->Clear(); _currentActor = wxDataViewItem(); _currentCommand = wxDataViewItem(); updateCmdActionSensitivity(false); _delActorButton->Enable(false); // Name findNamedObject(this, "ConvEditorNameEntry")->SetValue(_conversation.name); findNamedObject(this, "ConvEditorActorsWithinTalkDistance")->SetValue( _conversation.actorsMustBeWithinTalkdistance); findNamedObject(this, "ConvEditorActorsMustFace")->SetValue( _conversation.actorsAlwaysFaceEachOther); // Update the max play count if (_conversation.maxPlayCount != -1) { // Max play count is enabled findNamedObject(this, "ConvEditorRepeatTimes")->Enable(true); findNamedObject(this, "ConvEditorRepeatTimes")->SetValue(_conversation.maxPlayCount); findNamedObject(this, "ConvEditorRepeatAdditionalText")->Enable(true); findNamedObject(this, "ConvEditorRepeatCheckbox")->SetValue(true); } else { // Max play count disabled findNamedObject(this, "ConvEditorRepeatTimes")->Enable(false); findNamedObject(this, "ConvEditorRepeatTimes")->SetValue(-1); findNamedObject(this, "ConvEditorRepeatAdditionalText")->Enable(false); findNamedObject(this, "ConvEditorRepeatCheckbox")->SetValue(false); } // Actors for (conversation::Conversation::ActorMap::const_iterator i = _conversation.actors.begin(); i != _conversation.actors.end(); ++i) { wxutil::TreeModel::Row row = _actorStore->AddItem(); row[_actorColumns.actorNumber] = i->first; row[_actorColumns.displayName] = i->second; row.SendItemAdded(); } // Commands updateCommandList(); _updateInProgress = false; } void ConversationEditor::updateCommandList() { _commandStore->Clear(); // Commands for (conversation::Conversation::CommandMap::const_iterator i = _conversation.commands.begin(); i != _conversation.commands.end(); ++i) { const conversation::ConversationCommand& cmd = *(i->second); wxutil::TreeModel::Row row = _commandStore->AddItem(); row[_commandColumns.cmdNumber] = i->first; row[_commandColumns.actorName] = (boost::format(_("Actor %d")) % cmd.actor).str(); row[_commandColumns.sentence] = removeMarkup(cmd.getSentence()); row[_commandColumns.wait] = cmd.waitUntilFinished ? _("yes") : _("no"); row.SendItemAdded(); } } void ConversationEditor::selectCommand(int index) { // Select the actor passed from the command wxDataViewItem found = _commandStore->FindInteger(index, _commandColumns.cmdNumber); _commandView->Select(found); // Update sensitivity based on the new selection _currentCommand = _commandView->GetSelection(); updateCmdActionSensitivity(_currentCommand.IsOk()); } void ConversationEditor::moveSelectedCommand(int delta) { // Get the index of the currently selected command wxutil::TreeModel::Row row(_currentCommand, *_commandStore); int index = row[_commandColumns.cmdNumber].getInteger(); int targetIndex = index + delta; if (targetIndex <= 0) { return; // can't move any more upwards } // Try to look up the command indices in the conversation conversation::Conversation::CommandMap::iterator oldCmd = _conversation.commands.find(index); conversation::Conversation::CommandMap::iterator newCmd = _conversation.commands.find(targetIndex); if (oldCmd != _conversation.commands.end() && newCmd != _conversation.commands.end()) { // There is a command at this position, swap it conversation::ConversationCommandPtr temp = newCmd->second; newCmd->second = oldCmd->second; oldCmd->second = temp; updateWidgets(); // Select the moved command, for the user's convenience selectCommand(newCmd->first); } } void ConversationEditor::save() { // Name _conversation.name = findNamedObject(this, "ConvEditorNameEntry")->GetValue(); _conversation.actorsMustBeWithinTalkdistance = findNamedObject(this, "ConvEditorActorsWithinTalkDistance")->GetValue(); _conversation.actorsAlwaysFaceEachOther = findNamedObject(this, "ConvEditorActorsMustFace")->GetValue(); if (findNamedObject(this, "ConvEditorRepeatCheckbox")->GetValue()) { _conversation.maxPlayCount = findNamedObject(this, "ConvEditorRepeatTimes")->GetValue(); } else { _conversation.maxPlayCount = -1; } // Copy the working copy over the actual object _targetConversation = _conversation; } void ConversationEditor::onSave(wxCommandEvent& ev) { // First, save to the conversation object save(); // Then close the window EndModal(wxID_OK); } void ConversationEditor::onCancel(wxCommandEvent& ev) { EndModal(wxID_CANCEL); } void ConversationEditor::onActorSelectionChanged(wxDataViewEvent& ev) { if (_updateInProgress) return; // Get the selection _currentActor = _actorView->GetSelection(); // Enable the delete buttons if we have a selection _delActorButton->Enable(_currentActor.IsOk()); } void ConversationEditor::updateCmdActionSensitivity(bool hasSelection) { // Enable the edit and delete buttons if we have a selection _editCmdButton->Enable(hasSelection); _delCmdButton->Enable(hasSelection); if (hasSelection) { // Check if this is the first command in the list, get the ID of the selected item wxutil::TreeModel::Row row(_currentCommand, *_commandStore); int index = row[_commandColumns.cmdNumber].getInteger(); bool hasNext = _conversation.commands.find(index+1) != _conversation.commands.end(); bool hasPrev = index > 1; _moveUpCmdButton->Enable(hasPrev); _moveDownCmdButton->Enable(hasNext); } else { _moveUpCmdButton->Enable(false); _moveDownCmdButton->Enable(false); } } void ConversationEditor::onCommandSelectionChanged(wxDataViewEvent& ev) { if (_updateInProgress) return; // Get the selection _currentCommand = _commandView->GetSelection(); updateCmdActionSensitivity(_currentCommand.IsOk()); } void ConversationEditor::onMaxPlayCountEnabled(wxCommandEvent& ev) { if (_updateInProgress) return; if (findNamedObject(this, "ConvEditorRepeatCheckbox")->GetValue()) { // Enabled, write a new value in the spin button findNamedObject(this, "ConvEditorRepeatTimes")->SetValue(1); findNamedObject(this, "ConvEditorRepeatTimes")->Enable(true); findNamedObject(this, "ConvEditorRepeatAdditionalText")->Enable(true); } else { // Disabled, write a -1 in the spin button findNamedObject(this, "ConvEditorRepeatTimes")->SetValue(-1); findNamedObject(this, "ConvEditorRepeatTimes")->Enable(false); findNamedObject(this, "ConvEditorRepeatAdditionalText")->Enable(false); } } void ConversationEditor::onAddActor(wxCommandEvent& ev) { // Get the lowest available actor ID int idx = 1; for (idx = 1; idx < INT_MAX; idx++) { if (_conversation.actors.find(idx) == _conversation.actors.end()) { break; } } // Add the new actor to the map _conversation.actors[idx] = _("New Actor"); // Update the widgets updateWidgets(); } void ConversationEditor::onDeleteActor(wxCommandEvent& ev) { // Get the index of the currently selected actor wxutil::TreeModel::Row row(_currentActor, *_actorStore); int index = row[_actorColumns.actorNumber].getInteger(); // Add the new actor to the map conversation::Conversation::ActorMap::iterator i = _conversation.actors.find(index); if (i != _conversation.actors.end()) { // Remove the specified actor _conversation.actors.erase(index); } else { // Index not found, quit here return; } // Adjust the numbers of all other actors with higher numbers while (_conversation.actors.find(index + 1) != _conversation.actors.end()) { // Move the actor with the higher index "down" by one number... _conversation.actors[index] = _conversation.actors[index + 1]; // ...and remove it from the old location _conversation.actors.erase(index + 1); index++; } // Update the widgets updateWidgets(); } void ConversationEditor::onActorEdited(wxDataViewEvent& ev) { wxutil::TreeModel::Row row(ev.GetItem(), *_actorStore); // The iter points to the edited cell now, get the actor number int actorNum = row[_actorColumns.actorNumber].getInteger(); // Update the conversation _conversation.actors[actorNum] = static_cast(ev.GetValue()); // Update all command widgets updateCommandList(); } void ConversationEditor::onAddCommand(wxCommandEvent& ev) { conversation::Conversation& conv = _conversation; // shortcut // Create a new command conversation::ConversationCommandPtr command(new conversation::ConversationCommand); // Construct a command editor (blocks on construction) CommandEditor* editor = new CommandEditor(this, *command, conv); if (editor->ShowModal() == wxID_OK) { // The user hit ok, insert the command, find the first free index int index = 1; while (conv.commands.find(index) != conv.commands.end()) { index++; } // Insert the command at the new location conv.commands[index] = command; updateWidgets(); } editor->Destroy(); } void ConversationEditor::onEditCommand(wxCommandEvent& ev) { // Get the index of the currently selected command wxutil::TreeModel::Row row(_currentCommand, *_commandStore); int index = row[_commandColumns.cmdNumber].getInteger(); // Try to look up the command in the conversation conversation::Conversation::CommandMap::iterator i = _conversation.commands.find(index); if (i != _conversation.commands.end()) { // Get the command reference conversation::ConversationCommandPtr command = i->second; // Construct a command editor (blocks on construction) CommandEditor* editor = new CommandEditor(this, *command, _conversation); if (editor->ShowModal() == wxID_OK) { updateWidgets(); } editor->Destroy(); } } void ConversationEditor::onMoveUpCommand(wxCommandEvent& ev) { // Pass the call moveSelectedCommand(-1); } void ConversationEditor::onMoveDownCommand(wxCommandEvent& ev) { // Pass the call moveSelectedCommand(+1); } void ConversationEditor::onDeleteCommand(wxCommandEvent& ev) { // Get the index of the currently selected command wxutil::TreeModel::Row row(_currentCommand, *_commandStore); int index = row[_commandColumns.cmdNumber].getInteger(); // Add the new command to the map conversation::Conversation::CommandMap::iterator i = _conversation.commands.find(index); if (i != _conversation.commands.end()) { // Remove the specified command _conversation.commands.erase(index); } else { // Index not found, quit here return; } // Adjust the numbers of all other commands with higher numbers while (_conversation.commands.find(index + 1) != _conversation.commands.end()) { // Move the commands with the higher index "down" by one number... _conversation.commands[index] = _conversation.commands[index + 1]; // ...and remove it from the old location _conversation.commands.erase(index + 1); index++; } // Update the widgets updateWidgets(); } std::string ConversationEditor::removeMarkup(const std::string& input) { boost::regex expr("(<[A-Za-z]+>)|()"); return boost::regex_replace(input, expr, ""); } } // namespace ui DarkRadiant-2.0.2/plugins/dm.conversation/ConversationEditor.h000066400000000000000000000060201245424655700244770ustar00rootroot00000000000000#pragma once #include "wxutil/dialog/DialogBase.h" #include "wxutil/XmlResourceBasedWidget.h" #include "wxutil/TreeView.h" #include #include "Conversation.h" class wxButton; namespace ui { class ConversationEditor : public wxutil::DialogBase, private wxutil::XmlResourceBasedWidget { private: struct ActorListColumns : public wxutil::TreeModel::ColumnRecord { ActorListColumns() : actorNumber(add(wxutil::TreeModel::Column::Integer)), displayName(add(wxutil::TreeModel::Column::String)) {} wxutil::TreeModel::Column actorNumber; // actor number wxutil::TreeModel::Column displayName; // display name }; ActorListColumns _actorColumns; wxutil::TreeModel::Ptr _actorStore; wxutil::TreeView* _actorView; struct CommandListColumns : public wxutil::TreeModel::ColumnRecord { CommandListColumns() : cmdNumber(add(wxutil::TreeModel::Column::Integer)), actorName(add(wxutil::TreeModel::Column::String)), sentence(add(wxutil::TreeModel::Column::String)), wait(add(wxutil::TreeModel::Column::String)) {} wxutil::TreeModel::Column cmdNumber; // cmd number wxutil::TreeModel::Column actorName; // actor name wxutil::TreeModel::Column sentence; // sentence wxutil::TreeModel::Column wait; // wait yes/no }; CommandListColumns _commandColumns; wxutil::TreeModel::Ptr _commandStore; wxutil::TreeView* _commandView; wxDataViewItem _currentActor; wxDataViewItem _currentCommand; wxButton* _addActorButton; wxButton* _delActorButton; wxButton* _addCmdButton; wxButton* _delCmdButton; wxButton* _editCmdButton; wxButton* _moveUpCmdButton; wxButton* _moveDownCmdButton; // The conversation we're editing (the working copy) conversation::Conversation _conversation; // The actual conversation, where the changes will be saved to on "OK" conversation::Conversation& _targetConversation; // Mutex to avoid callback loops bool _updateInProgress; public: ConversationEditor(wxWindow* parent, conversation::Conversation& conversation); private: void save(); void populateWindow(); // Fills the conversation values into the widgets void updateWidgets(); void updateCommandList(); void updateCmdActionSensitivity(bool hasSelection); // Move the currently selected command about the given delta // (-1 is one upwards, +1 is one position downards) void moveSelectedCommand(int delta); // Highlight the command with the given index void selectCommand(int index); void onSave(wxCommandEvent& ev); void onCancel(wxCommandEvent& ev); void onMaxPlayCountEnabled(wxCommandEvent& ev); void onActorSelectionChanged(wxDataViewEvent& ev); void onCommandSelectionChanged(wxDataViewEvent& ev); void onAddActor(wxCommandEvent& ev); void onDeleteActor(wxCommandEvent& ev); void onActorEdited(wxDataViewEvent& ev); void onAddCommand(wxCommandEvent& ev); void onEditCommand(wxCommandEvent& ev); void onMoveUpCommand(wxCommandEvent& ev); void onMoveDownCommand(wxCommandEvent& ev); void onDeleteCommand(wxCommandEvent& ev); std::string removeMarkup(const std::string& input); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.conversation/ConversationEntity.cpp000066400000000000000000000120771245424655700250710ustar00rootroot00000000000000#include "ConversationEntity.h" #include "i18n.h" #include "itextstream.h" #include "ientity.h" #include "string/convert.h" #include #include "ConversationKeyExtractor.h" #include "ConversationCommandLibrary.h" namespace conversation { // Constructor ConversationEntity::ConversationEntity(const scene::INodePtr& node) : _entityNode(node) { Entity* entity = Node_getEntity(node); assert(entity != NULL); // Use an conversationKeyExtractor to populate the ConversationMap from the keys // on the entity ConversationKeyExtractor extractor(_conversations); entity->forEachKeyValue(extractor); } // Delete the entity's world node void ConversationEntity::deleteWorldNode() { // Try to convert the weak_ptr reference to a shared_ptr scene::INodePtr node = _entityNode.lock(); if (node != NULL && node->getParent() != NULL) { node->getParent()->removeChildNode(node); } } // Add a new conversation void ConversationEntity::addConversation() { // Locate the first unused id int index = 1; while (_conversations.find(index) != _conversations.end()) { ++index; } // Insert a new conversation at this ID. Conversation o; o.name = _("New Conversation"); _conversations.insert(ConversationMap::value_type(index, o)); } void ConversationEntity::deleteConversation(int index) { // Look up the conversation with the given index ConversationMap::iterator i = _conversations.find(index); if (i == _conversations.end()) { // not found, nothing to do return; } // Delete the found element _conversations.erase(i++); // Then iterate all the way to the highest index while (i != _conversations.end()) { // Decrease the index of this conversation int newIndex = i->first - 1; // Copy the conversation into a temporary object Conversation temp = i->second; // Remove the old one _conversations.erase(i++); // Re-insert with new index _conversations.insert( ConversationMap::value_type(newIndex, temp) ); } } // Populate a list store with conversations void ConversationEntity::populateListStore(wxutil::TreeModel& store, const ConversationColumns& columns) const { for (ConversationMap::const_iterator i = _conversations.begin(); i != _conversations.end(); ++i) { wxutil::TreeModel::Row row = store.AddItem(); row[columns.index] = i->first; row[columns.name] = i->second.name; row.SendItemAdded(); } } void ConversationEntity::clearEntity(Entity* entity) { // Get all keyvalues matching the "obj" prefix. Entity::KeyValuePairs keyValues = entity->getKeyValuePairs("conv_"); for (Entity::KeyValuePairs::const_iterator i = keyValues.begin(); i != keyValues.end(); ++i) { // Set the spawnarg to empty, which is equivalent to a removal entity->setKeyValue(i->first, ""); } } // Write out conversations to entity keyvals void ConversationEntity::writeToEntity() { // Try to convert the weak_ptr reference to a shared_ptr Entity* entity = Node_getEntity(_entityNode.lock()); assert(entity != NULL); // greebo: Remove all conversation-related spawnargs first clearEntity(entity); for (ConversationMap::const_iterator i = _conversations.begin(); i != _conversations.end(); ++i) { // Obtain the conversation and construct the key prefix from the index const Conversation& conv = i->second; std::string prefix = "conv_" + string::to_string(i->first) + "_"; // Set the entity keyvalues entity->setKeyValue(prefix + "name", conv.name); entity->setKeyValue(prefix + "actors_must_be_within_talkdistance", conv.actorsMustBeWithinTalkdistance ? "1" : "0"); entity->setKeyValue(prefix + "talk_distance", string::to_string(conv.talkDistance)); entity->setKeyValue(prefix + "actors_always_face_each_other_while_talking", conv.actorsAlwaysFaceEachOther ? "1" : "0"); entity->setKeyValue(prefix + "max_play_count", string::to_string(conv.maxPlayCount)); // Write the actor list for (Conversation::ActorMap::const_iterator a = conv.actors.begin(); a != conv.actors.end(); ++a) { std::string actorKey = prefix + "actor_" + string::to_string(a->first); entity->setKeyValue(actorKey, a->second); } // Write all the commands for (Conversation::CommandMap::const_iterator c = conv.commands.begin(); c != conv.commands.end(); ++c) { std::string cmdPrefix = prefix + "cmd_" + string::to_string(c->first) + "_"; try { const ConversationCommandInfo& cmdInfo = ConversationCommandLibrary::Instance().findCommandInfo(c->second->type); entity->setKeyValue(cmdPrefix + "type", cmdInfo.name); entity->setKeyValue(cmdPrefix + "actor", string::to_string(c->second->actor)); entity->setKeyValue(cmdPrefix + "wait_until_finished", c->second->waitUntilFinished ? "1" : "0"); for (ConversationCommand::ArgumentMap::const_iterator a = c->second->arguments.begin(); a != c->second->arguments.end(); ++a) { entity->setKeyValue(cmdPrefix + "arg_" + string::to_string(a->first), a->second); } } catch (std::runtime_error e) { rError() << "Unrecognised conversation command ID: " << c->second->type << std::endl; } } } } } // namespace conversations DarkRadiant-2.0.2/plugins/dm.conversation/ConversationEntity.h000066400000000000000000000073451245424655700245400ustar00rootroot00000000000000#pragma once #include "inode.h" #include "ientity.h" #include #include "wxutil/TreeModel.h" #include "Conversation.h" namespace conversation { struct ConvEntityColumns : public wxutil::TreeModel::ColumnRecord { ConvEntityColumns() : displayName(add(wxutil::TreeModel::Column::String)), entityName(add(wxutil::TreeModel::Column::String)) {} wxutil::TreeModel::Column displayName; wxutil::TreeModel::Column entityName; }; struct ConversationColumns : public wxutil::TreeModel::ColumnRecord { ConversationColumns() : index(add(wxutil::TreeModel::Column::Integer)), name(add(wxutil::TreeModel::Column::String)) {} wxutil::TreeModel::Column index; // conversation index wxutil::TreeModel::Column name; // conversation name }; /** * Representation of a single conversation entity (atdm:conversation_info). * * In The Dark Mod, conversations are stored as numbered spawnargs on a conversation * entity, e.g. conv_1_name. Each conversation entity can contain any number * of conversations described in this way. * * The ConversationEntity class provides an object-oriented view of the conversation * information, by wrapping a pointer to an Entity and providing methods to * retrieve and manipulate conversation information without seeing the spawnargs * directly. When changes are completed, the ConversationEntity::writeToEntity() * method is invoked to save all changes in the form of spawnargs. * * @see Entity */ class ConversationEntity { // The actual entity's world node and entity pointer scene::INodeWeakPtr _entityNode; // Indexed conversations ConversationMap _conversations; public: /** * Construct an ConversationEntity wrapper around the given Node. */ ConversationEntity(const scene::INodePtr& node); /** * Return an Conversation reference by numeric index. * * @param iIndex * The numberic index of the conversation to retrieve. * * @return * A non-const reference to an Conversation object, corresponding to the * given index. If the provided index did not previously exist, a new * Conversation object will be created and returned. */ Conversation& getConversation(int iIndex) { return _conversations[iIndex]; } /** * Add a new conversation, starting from the first unused conversation ID. */ void addConversation(); /** * Delete a numbered conversation. This re-orders all conversations so that the * numbering is consistent again (deleting obj 2 will re-number 3 => 2, 4 => 3, etc.) */ void deleteConversation(int index); /** * Clear all conversations. */ void clearConversations() { _conversations.clear(); } /** * Test whether this entity contains conversations or not. */ bool isEmpty() const { return _conversations.empty(); } /** * Delete the actual entity node from the map. This will render any further * operations on this ConversationEntity undefined, and it should immediately * be deleted. */ void deleteWorldNode(); /** * Populate the given list store with the conversations from this entity. * * @param store * The list store to populate. This must have 2 columns -- an integer * column for the conversation number, and a text column for the name. */ void populateListStore(wxutil::TreeModel& store, const ConversationColumns& columns) const; /** * Write all conversation data to keyvals on the underlying entity. */ void writeToEntity(); private: // Removes all conversation-related spawnargs from the given entity void clearEntity(Entity* entity); }; /** * Conversation entity pointer type. */ typedef std::shared_ptr ConversationEntityPtr; /** * Conversation entity named map type. */ typedef std::map ConversationEntityMap; } // namespace conversation DarkRadiant-2.0.2/plugins/dm.conversation/ConversationEntityFinder.h000066400000000000000000000053201245424655700256570ustar00rootroot00000000000000#pragma once #include "i18n.h" #include #include "ConversationEntity.h" namespace conversation { /** * Visitor class to locate and list any atdm:conversation_info entities in * the current map. * * The ConversationEntityFinder will visit each scenegraph node in turn, as per the * behaviour of a scenegraph walker. The classname of each entity visited is * tested against a given value (passed in during construction) which identifies * it as a Conversation entity, and if the test is successful, the entity's * details are added to the target ConversationEntityMap and TreeModel objects * to be populated. */ class ConversationEntityFinder : public scene::NodeVisitor { // Name of entity class we are looking for std::string _className; // ListStore to populate with results wxutil::TreeModel::Ptr _store; const ConvEntityColumns& _columns; // ConversationEntityMap which we also populate ConversationEntityMap& _map; public: /** * Construct a visitor to populate the given store and ConversationEntityMap. * * The TreeModel provided must contain two columns. The first column * is a string containing the display name of the conversation entity, * which is constructed from the real entity name plus the origin in * brackets for convenience purposes. The second column is a string * containing the raw entity name in the map. * * @param st * The TreeModel to populate. * * @param map * The ConversationEntityMap to populate. * * @param classname * The text classname used to identify a Conversation entity. */ ConversationEntityFinder(wxutil::TreeModel::Ptr st, const ConvEntityColumns& columns, ConversationEntityMap& map, const std::string& classname) : _className(classname), _store(st), _columns(columns), _map(map) {} /** * NodeVisitor implementation */ bool pre(const scene::INodePtr& node) { // Get the entity and check the classname Entity* entity = Node_getEntity(node); // Check for conversation entity or worldspawn if (entity != NULL && entity->getKeyValue("classname") == _className) { // Construct the display string std::string name = entity->getKeyValue("name"); std::string sDisplay = (boost::format(_("%s at [ %s ]")) % name % entity->getKeyValue("origin")).str(); // Add the entity to the list wxutil::TreeModel::Row row = _store->AddItem(); row[_columns.displayName] = sDisplay; row[_columns.entityName] = name; row.SendItemAdded(); // Construct an ObjectiveEntity with the node, and add to the map ConversationEntityPtr ce(new ConversationEntity(node)); _map.insert(ConversationEntityMap::value_type(name, ce)); } return true; } }; } // namespace conversation DarkRadiant-2.0.2/plugins/dm.conversation/ConversationKeyExtractor.cpp000066400000000000000000000067641245424655700262470ustar00rootroot00000000000000#include "ConversationKeyExtractor.h" #include "itextstream.h" #include #include #include #include #include #include #include "string/convert.h" #include "ConversationCommand.h" #include "ConversationCommandLibrary.h" namespace conversation { // Shortcut for boost::algorithm::split typedef std::vector StringParts; // Required entity visit function void ConversationKeyExtractor::visit(const std::string& key, const std::string& value) { // Quick discard of any non-conversation keys if (key.substr(0, 4) != "conv") return; // Extract the objective number static const boost::regex reConvNum("conv_(\\d+)_(.*)"); boost::smatch results; int iNum; if (!boost::regex_match(key, results, reConvNum)) { // No match, abort return; } // Get the conversation number iNum = string::convert(results[1]); // We now have the conversation number and the substring (everything after // "conv__" which applies to this conversation. std::string convSubString = results[2]; // Switch on the substring if (convSubString == "name") { _convMap[iNum].name = value; } else if (convSubString == "talk_distance") { _convMap[iNum].talkDistance = string::convert(value, 60); } else if (convSubString == "actors_must_be_within_talkdistance") { _convMap[iNum].actorsMustBeWithinTalkdistance = (value == "1"); } else if (convSubString == "actors_always_face_each_other_while_talking") { _convMap[iNum].actorsAlwaysFaceEachOther = (value == "1"); } else if (convSubString == "max_play_count") { _convMap[iNum].maxPlayCount = string::convert(value, -1); } else if (convSubString.substr(0, 6) == "actor_") { // This is an actor definition, extract the number int actorNum = string::convert(convSubString.substr(6), -1); if (actorNum == -1) { return; } // Store the actor in the map _convMap[iNum].actors.insert(Conversation::ActorMap::value_type(actorNum, value)); } else if (convSubString.substr(0, 4) == "cmd_") { // This is a conversation command, form a new regex static const boost::regex reCommand("cmd_(\\d+)_(.*)"); boost::smatch results; if (!boost::regex_match(convSubString, results, reCommand)) { return; // not matching } int cmdIndex = string::convert(results[1]); std::string cmdSubStr = results[2]; ConversationCommandPtr command; Conversation::CommandMap::iterator found = _convMap[iNum].commands.find(cmdIndex); if (found != _convMap[iNum].commands.end()) { // Command already exists command = found->second; } else { // Command with the given index does not exist yet, create it command = ConversationCommandPtr(new ConversationCommand); // Insert this into the map _convMap[iNum].commands[cmdIndex] = command; } if (cmdSubStr == "type") { try { command->type = ConversationCommandLibrary::Instance().findCommandInfo(value).id; } catch (std::runtime_error& e) { rError() << e.what() << std::endl; return; } } else if (cmdSubStr == "actor") { command->actor = string::convert(value); } else if (cmdSubStr == "wait_until_finished") { command->waitUntilFinished = (value == "1"); } else if (cmdSubStr.substr(0,4) == "arg_") { int cmdArgIndex = string::convert(cmdSubStr.substr(4)); command->arguments[cmdArgIndex] = value; } } } } // namespace conversation DarkRadiant-2.0.2/plugins/dm.conversation/ConversationKeyExtractor.h000066400000000000000000000014261245424655700257020ustar00rootroot00000000000000#ifndef CONVERSATIONKEYEXTRACTOR_H_ #define CONVERSATIONKEYEXTRACTOR_H_ #include "Conversation.h" #include "ientity.h" namespace conversation { /** * Entity Visitor which extracts conversation keyvalues (of the form "conv__yyyy") * and populates the given ConversationMap with the parsed conversation objects. */ class ConversationKeyExtractor : public Entity::Visitor { // Map of number->Conversation objects ConversationMap& _convMap; public: /** * Constructor. Sets the map to populate. */ ConversationKeyExtractor(ConversationMap& map) : _convMap(map) { assert(_convMap.empty()); } /** * Required visit function. */ void visit(const std::string& key, const std::string& value); }; } // namespace conversation #endif /* CONVERSATIONKEYEXTRACTOR_H_ */ DarkRadiant-2.0.2/plugins/dm.conversation/Makefile.am000066400000000000000000000016221245424655700225440ustar00rootroot00000000000000AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs \ $(XML_CFLAGS) pluginsdir = $(pkglibdir)/plugins plugins_LTLIBRARIES = dm_conversation.la dm_conversation_la_LIBADD = $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la dm_conversation_la_LDFLAGS = -module -avoid-version \ $(WX_LIBS) $(XML_LIBS) $(BOOST_REGEX_LIBS) dm_conversation_la_SOURCES = plugin.cpp \ ConversationKeyExtractor.cpp \ ConversationCommandInfo.cpp \ CommandArgumentItem.cpp \ ConversationEntity.cpp \ CommandEditor.cpp \ ConversationEditor.cpp \ ConversationCommand.cpp \ ConversationCommandLibrary.cpp \ ConversationDialog.cpp DarkRadiant-2.0.2/plugins/dm.conversation/Makefile.in000066400000000000000000000612451245424655700225640ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/dm.conversation DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pluginsdir)" LTLIBRARIES = $(plugins_LTLIBRARIES) dm_conversation_la_DEPENDENCIES = \ $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la am_dm_conversation_la_OBJECTS = plugin.lo ConversationKeyExtractor.lo \ ConversationCommandInfo.lo CommandArgumentItem.lo \ ConversationEntity.lo CommandEditor.lo ConversationEditor.lo \ ConversationCommand.lo ConversationCommandLibrary.lo \ ConversationDialog.lo dm_conversation_la_OBJECTS = $(am_dm_conversation_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = dm_conversation_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(dm_conversation_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(dm_conversation_la_SOURCES) DIST_SOURCES = $(dm_conversation_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs \ $(XML_CFLAGS) pluginsdir = $(pkglibdir)/plugins plugins_LTLIBRARIES = dm_conversation.la dm_conversation_la_LIBADD = $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la dm_conversation_la_LDFLAGS = -module -avoid-version \ $(WX_LIBS) $(XML_LIBS) $(BOOST_REGEX_LIBS) dm_conversation_la_SOURCES = plugin.cpp \ ConversationKeyExtractor.cpp \ ConversationCommandInfo.cpp \ CommandArgumentItem.cpp \ ConversationEntity.cpp \ CommandEditor.cpp \ ConversationEditor.cpp \ ConversationCommand.cpp \ ConversationCommandLibrary.cpp \ ConversationDialog.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/dm.conversation/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/dm.conversation/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginsLTLIBRARIES: $(plugins_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(plugins_LTLIBRARIES)'; test -n "$(pluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pluginsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pluginsdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pluginsdir)"; \ } uninstall-pluginsLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugins_LTLIBRARIES)'; test -n "$(pluginsdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pluginsdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pluginsdir)/$$f"; \ done clean-pluginsLTLIBRARIES: -test -z "$(plugins_LTLIBRARIES)" || rm -f $(plugins_LTLIBRARIES) @list='$(plugins_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } dm_conversation.la: $(dm_conversation_la_OBJECTS) $(dm_conversation_la_DEPENDENCIES) $(EXTRA_dm_conversation_la_DEPENDENCIES) $(AM_V_CXXLD)$(dm_conversation_la_LINK) -rpath $(pluginsdir) $(dm_conversation_la_OBJECTS) $(dm_conversation_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CommandArgumentItem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CommandEditor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConversationCommand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConversationCommandInfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConversationCommandLibrary.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConversationDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConversationEditor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConversationEntity.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConversationKeyExtractor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pluginsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginsLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginsLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginsLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginsLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pluginsLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pluginsLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/plugins/dm.conversation/dm.conversation.def000066400000000000000000000002021245424655700242720ustar00rootroot00000000000000; dm.conversation.def : Declares the module parameters for the DLL. EXPORTS ; Explicit exports can go here RegisterModule @1 DarkRadiant-2.0.2/plugins/dm.conversation/plugin.cpp000066400000000000000000000040261245424655700225130ustar00rootroot00000000000000#include "imodule.h" #include "i18n.h" #include "itextstream.h" #include "ieventmanager.h" #include "icommandsystem.h" #include "iuimanager.h" #include "generic/callback.h" #include "debugging/debugging.h" #include "ConversationDialog.h" /** * Module to register the menu commands for the Conversation Editor class. */ class ConversationEditorModule : public RegisterableModule { public: // RegisterableModule implementation virtual const std::string& getName() const { static std::string _name("ConversationEditor"); return _name; } virtual const StringSet& getDependencies() const { static StringSet _dependencies; if (_dependencies.empty()) { _dependencies.insert(MODULE_EVENTMANAGER); _dependencies.insert(MODULE_UIMANAGER); _dependencies.insert(MODULE_COMMANDSYSTEM); } return _dependencies; } virtual void initialiseModule(const ApplicationContext& ctx) { rMessage() << getName() << "::initialiseModule called.\n"; // Add the callback event GlobalCommandSystem().addCommand("ConversationEditor", ui::ConversationDialog::ShowDialog); GlobalEventManager().addCommand("ConversationEditor", "ConversationEditor"); // Add the menu item IMenuManager& mm = GlobalUIManager().getMenuManager(); mm.add("main/map", // menu location path "ConversationEditor", // name ui::menuItem, // type _("Conversations..."), // caption "stimresponse.png", // icon "ConversationEditor"); // event name } }; typedef std::shared_ptr ConversationEditorModulePtr; extern "C" void DARKRADIANT_DLLEXPORT RegisterModule(IModuleRegistry& registry) { registry.registerModule(ConversationEditorModulePtr(new ConversationEditorModule)); // Initialise the streams using the given application context module::initialiseStreams(registry.getApplicationContext()); // Remember the reference to the ModuleRegistry module::RegistryReference::Instance().setRegistry(registry); // Set up the assertion handler GlobalErrorHandler() = registry.getApplicationContext().getErrorHandlingFunction(); } DarkRadiant-2.0.2/plugins/dm.difficulty/000077500000000000000000000000001245424655700201375ustar00rootroot00000000000000DarkRadiant-2.0.2/plugins/dm.difficulty/ClassNameStore.cpp000066400000000000000000000014701245424655700235300ustar00rootroot00000000000000#include "ClassNameStore.h" namespace ui { ClassNameStore::ClassNameStore() { populateListStore(); } const wxArrayString& ClassNameStore::getStringList() const { return _classNames; } void ClassNameStore::destroy() { InstancePtr().reset(); } ClassNameStore& ClassNameStore::Instance() { if (InstancePtr() == NULL) { InstancePtr().reset(new ClassNameStore); } return *InstancePtr(); } ClassNameStorePtr& ClassNameStore::InstancePtr() { static ClassNameStorePtr _instancePtr; return _instancePtr; } // EntityClassVisitor implementation void ClassNameStore::visit(const IEntityClassPtr& eclass) { _classNames.Add(eclass->getName()); } void ClassNameStore::populateListStore() { // Visit each entity class using as visitor GlobalEntityClassManager().forEachEntityClass(*this); } } // namespace ui DarkRadiant-2.0.2/plugins/dm.difficulty/ClassNameStore.h000066400000000000000000000013051245424655700231720ustar00rootroot00000000000000#pragma once #include "ieclass.h" #include #include namespace ui { class ClassNameStore; typedef std::shared_ptr ClassNameStorePtr; class ClassNameStore : private EntityClassVisitor { private: wxArrayString _classNames; public: // Constructor, traverses the eclasses and fills the GtkListStore ClassNameStore(); const wxArrayString& getStringList() const; static ClassNameStore& Instance(); static void destroy(); private: static ClassNameStorePtr& InstancePtr(); // EntityClassVisitor implementation virtual void visit(const IEntityClassPtr& eclass); // Traverses all entities and fills the store void populateListStore(); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.difficulty/DifficultyDialog.cpp000066400000000000000000000061101245424655700240630ustar00rootroot00000000000000#include "DifficultyDialog.h" #include "i18n.h" #include "iundo.h" #include "imainframe.h" #include "iuimanager.h" #include "iscenegraph.h" #include "gamelib.h" #include "registry/registry.h" #include "string/string.h" #include #include #include #include #include #include namespace ui { namespace { const char* const WINDOW_TITLE = N_("Difficulty Editor"); } DifficultyDialog::DifficultyDialog() : DialogBase(_(WINDOW_TITLE)) { // Load the settings _settingsManager.loadSettings(); // Create the widgets populateWindow(); } void DifficultyDialog::createDifficultyEditors() { int numLevels = game::current::getValue(GKEY_DIFFICULTY_LEVELS); for (int i = 0; i < numLevels; i++) { // Acquire the settings object difficulty::DifficultySettingsPtr settings = _settingsManager.getSettings(i); if (settings != NULL) { _editors.push_back( DifficultyEditorPtr(new DifficultyEditor( _notebook, _settingsManager.getDifficultyName(i), settings) ) ); } } // A new image list for the notebook tab icons _imageList.reset(new wxImageList(16, 16)); // Pack the editors into the notebook for (std::size_t i = 0; i < _editors.size(); i++) { DifficultyEditor& editor = *_editors[i]; wxWindow* editorWidget = editor.getEditor(); std::string icon = editor.getNotebookIconName(); // Load the icon int imageId = icon.empty() ? -1 : _imageList->Add(wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + icon)); editorWidget->Reparent(_notebook); _notebook->AddPage(editorWidget, editor.getNotebookLabel(), false, imageId); } } void DifficultyDialog::populateWindow() { SetSizer(new wxBoxSizer(wxVERTICAL)); // Create the notebook and add it to the vbox _notebook = new wxNotebook(this, wxID_ANY); _notebook->SetMinClientSize(wxSize(800, 400)); // Create and pack the editors createDifficultyEditors(); GetSizer()->Add(_notebook, 1, wxEXPAND | wxALL, 12); wxButton* okButton = new wxButton(this, wxID_OK); wxButton* cancelButton = new wxButton(this, wxID_CANCEL); okButton->Bind(wxEVT_BUTTON, [&] (wxCommandEvent&) { EndModal(wxID_OK); }); cancelButton->Bind(wxEVT_BUTTON, [&] (wxCommandEvent&) { EndModal(wxID_CANCEL); }); wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); buttonSizer->Add(cancelButton, 0, wxRIGHT, 6); buttonSizer->Add(okButton, 0, wxRIGHT, 6); GetSizer()->Add(buttonSizer, 0, wxALIGN_RIGHT | wxALL, 12); Layout(); Fit(); } void DifficultyDialog::save() { // Consistency check can go here // Scoped undo object UndoableCommand command("editDifficulty"); // Save the working set to the entity _settingsManager.saveSettings(); } int DifficultyDialog::ShowModal() { int returnCode = DialogBase::ShowModal(); if (returnCode == wxID_OK) { save(); } return returnCode; } // Static command target void DifficultyDialog::ShowDialog(const cmd::ArgumentList& args) { // Construct a new instance, this enters the main loop DifficultyDialog* editor = new DifficultyDialog; editor->ShowModal(); editor->Destroy(); } } // namespace ui DarkRadiant-2.0.2/plugins/dm.difficulty/DifficultyDialog.h000066400000000000000000000023331245424655700235330ustar00rootroot00000000000000#pragma once #include "ientity.h" #include "iradiant.h" #include "icommandsystem.h" #include "wxutil/dialog/DialogBase.h" #include "DifficultyEditor.h" #include "DifficultySettingsManager.h" #include #include namespace ui { class DifficultyDialog; typedef std::shared_ptr DifficultyDialogPtr; /** * greebo: A difficulty dialog is a modal top-level window which provides * views and controls facilitating the editing of difficulty settings. * * Maintains a certain number of DifficultyEditors which get packed into the * notebook tabs. */ class DifficultyDialog : public wxutil::DialogBase { private: wxNotebook* _notebook; // The difficulty settings manager difficulty::DifficultySettingsManager _settingsManager; std::vector _editors; std::unique_ptr _imageList; public: DifficultyDialog(); int ShowModal(); // Command target to toggle the dialog static void ShowDialog(const cmd::ArgumentList& args); private: // greebo: Saves the current working set to the entity void save(); // WIDGET POPULATION void populateWindow(); // Main window void createDifficultyEditors(); }; // class DifficultyDialog } // namespace ui DarkRadiant-2.0.2/plugins/dm.difficulty/DifficultyEditor.cpp000066400000000000000000000211201245424655700241100ustar00rootroot00000000000000#include "DifficultyEditor.h" #include "i18n.h" #include "iuimanager.h" #include "wxutil/TreeView.h" #include "wxutil/ChoiceHelper.h" #include #include #include #include #include #include #include #include "ClassNameStore.h" namespace ui { namespace { const char* const DIFF_ICON = "sr_icon_custom.png"; } DifficultyEditor::DifficultyEditor(wxWindow* parent, const std::string& label, const difficulty::DifficultySettingsPtr& settings) : _settings(settings), _label(label), _classCombo(NULL), _settingsView(NULL), _spawnArgEntry(NULL), _argumentEntry(NULL), _appTypeCombo(NULL), _saveSettingButton(NULL), _deleteSettingButton(NULL), _createSettingButton(NULL), _refreshButton(NULL), _noteText(NULL), _updateActive(false) { // The actual editor pane _editor = loadNamedPanel(parent, "DifficultyEditorMainPanel"); _settings->updateTreeModel(); populateWindow(); updateEditorWidgets(); } wxWindow* DifficultyEditor::getEditor() { return _editor; } std::string DifficultyEditor::getNotebookLabel() { return _label; } std::string DifficultyEditor::getNotebookIconName() { return DIFF_ICON; } void DifficultyEditor::populateWindow() { wxPanel* viewPanel = findNamedObject(_editor, "DifficultyEditorTreeViewPanel"); _settingsView = wxutil::TreeView::CreateWithModel(viewPanel, _settings->getTreeStore()); _settingsView->Connect(wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(DifficultyEditor::onSettingSelectionChange), NULL, this); viewPanel->GetSizer()->Add(_settingsView, 1, wxEXPAND); _settingsView->AppendTextColumn(_("Setting"), _settings->getColumns().description.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT); // Save a few shortcuts _spawnArgEntry = findNamedObject(_editor, "DifficultyEditorSpawnarg"); _argumentEntry = findNamedObject(_editor, "DifficultyEditorArgument"); _classCombo = findNamedObject(_editor, "DifficultyEditorClassName"); _classCombo->Append(ClassNameStore::Instance().getStringList()); _classCombo->AutoComplete(ClassNameStore::Instance().getStringList()); // AppTypes _appTypeCombo = findNamedObject(_editor, "DifficultyEditorApplicationType"); _appTypeCombo->Append(_("Assign"), new wxStringClientData(string::to_string(difficulty::Setting::EAssign))); _appTypeCombo->Append(_("Add"), new wxStringClientData(string::to_string(difficulty::Setting::EAdd))); _appTypeCombo->Append(_("Multiply"), new wxStringClientData(string::to_string(difficulty::Setting::EMultiply))); _appTypeCombo->Append(_("Ignore"), new wxStringClientData(string::to_string(difficulty::Setting::EIgnore))); _appTypeCombo->Connect(wxEVT_CHOICE, wxCommandEventHandler(DifficultyEditor::onAppTypeChange), NULL, this); // Buttons _saveSettingButton = findNamedObject(_editor, "DifficultyEditorSaveSettingButton"); _saveSettingButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(DifficultyEditor::onSettingSave), NULL, this); _deleteSettingButton = findNamedObject(_editor, "DifficultyEditorDeleteSettingButton"); _deleteSettingButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(DifficultyEditor::onSettingDelete), NULL, this); _createSettingButton = findNamedObject(_editor, "DifficultyEditorAddSettingButton"); _createSettingButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(DifficultyEditor::onSettingCreate), NULL, this); _refreshButton = findNamedObject(_editor, "DifficultyEditorRefreshButton"); _refreshButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(DifficultyEditor::onRefresh), NULL, this); _noteText = findNamedObject(_editor, "DifficultyEditorNoteText"); makeLabelBold(_editor, "DifficultyEditorSettingLabel"); } int DifficultyEditor::getSelectedSettingId() { wxDataViewItem item = _settingsView->GetSelection(); if (item.IsOk()) { wxutil::TreeModel::Row row(item, *_settingsView->GetModel()); return row[_settings->getColumns().settingId].getInteger(); } return -1; } void DifficultyEditor::updateEditorWidgets() { _updateActive = true; int id = getSelectedSettingId(); bool editWidgetsSensitive = false; std::string noteText; if (id != -1) { // Lookup the setting using className/id combo difficulty::SettingPtr setting = _settings->getSettingById(id); if (setting != NULL) { // Activate editing pane editWidgetsSensitive = true; if (_settings->isOverridden(setting)) { editWidgetsSensitive = false; noteText += _("This default setting is overridden, cannot edit."); } _spawnArgEntry->SetValue(setting->spawnArg); _argumentEntry->SetValue(setting->argument); // Now select the eclass passed in the argument // Find the entity using a TreeModel traversor _classCombo->Select(_classCombo->FindString(setting->className)); wxutil::ChoiceHelper::SelectItemByStoredId(_appTypeCombo, static_cast(setting->appType)); // Set the sensitivity of the argument entry box _argumentEntry->Enable( (setting->appType == difficulty::Setting::EIgnore) ? false : true ); // We have a treeview selection, lock the classname _classCombo->Enable(false); // Disable the deletion of default settings _deleteSettingButton->Enable((setting->isDefault) ? false : true); _saveSettingButton->Enable(true); } } else { // Nothing selected, disable deletion _deleteSettingButton->Enable(false); _saveSettingButton->Enable(false); } // Set editing pane sensitivity findNamedObject(_editor, "DifficultyEditorSettingsPanel")->Enable(editWidgetsSensitive); // Set the note text in any case _noteText->SetLabelMarkup(noteText); _noteText->Wrap(_noteText->GetSize().GetWidth()); _updateActive = false; } void DifficultyEditor::createSetting() { // Unselect everything _settingsView->UnselectAll(); // Unlock editing widgets findNamedObject(_editor, "DifficultyEditorSettingsPanel")->Enable(true); // Unlock class combo _classCombo->Enable(true); _saveSettingButton->Enable(true); _spawnArgEntry->SetValue(""); _argumentEntry->SetValue(""); } void DifficultyEditor::saveSetting() { // Get the ID of the currently selected item (might be -1 if no selection) int id = getSelectedSettingId(); // Instantiate a new setting and fill the data in difficulty::SettingPtr setting(new difficulty::Setting); // Load the widget contents setting->className = _classCombo->GetStringSelection(); setting->spawnArg = _spawnArgEntry->GetValue(); setting->argument = _argumentEntry->GetValue(); // Get the apptype from the dropdown list setting->appType = difficulty::Setting::EAssign; if (_appTypeCombo->GetSelection() != wxNOT_FOUND) { int selected = wxutil::ChoiceHelper::GetSelectionId(_appTypeCombo); setting->appType = static_cast(selected); } // Pass the data to the DifficultySettings class to handle it id = _settings->save(id, setting); // Update the treemodel _settings->updateTreeModel(); // Highlight the setting, it might have been newly created selectSettingById(id); } void DifficultyEditor::deleteSetting() { // Get the ID of the currently selected item (might be -1 if no selection) int id = getSelectedSettingId(); // Instantiate a new setting and fill the data in difficulty::SettingPtr setting = _settings->getSettingById(id); if (setting == NULL || setting->isDefault) { // Don't delete NULL or default settings return; } // Remove the setting _settings->deleteSetting(id); } void DifficultyEditor::selectSettingById(int id) { wxDataViewItem found = _settings->getTreeStore()->FindInteger(id, _settings->getColumns().settingId); _settingsView->Select(found); _settingsView->EnsureVisible(found); } void DifficultyEditor::onSettingSelectionChange(wxDataViewEvent& ev) { // Update editor widgets updateEditorWidgets(); } void DifficultyEditor::onSettingSave(wxCommandEvent& ev) { saveSetting(); } void DifficultyEditor::onSettingDelete(wxCommandEvent& ev) { deleteSetting(); } void DifficultyEditor::onSettingCreate(wxCommandEvent& ev) { createSetting(); } void DifficultyEditor::onRefresh(wxCommandEvent& ev) { _settings->refreshTreeModel(); } void DifficultyEditor::onAppTypeChange(wxCommandEvent& ev) { if (_updateActive) return; // Update the sensitivity of the argument entry widget int selected = wxutil::ChoiceHelper::GetSelectionId(_appTypeCombo); difficulty::Setting::EApplicationType appType = static_cast(selected); _argumentEntry->Enable( (appType == difficulty::Setting::EIgnore) ? false : true ); } } // namespace ui DarkRadiant-2.0.2/plugins/dm.difficulty/DifficultyEditor.h000066400000000000000000000052401245424655700235620ustar00rootroot00000000000000#pragma once #include #include #include "DifficultySettings.h" #include "wxutil/XmlResourceBasedWidget.h" class wxPanel; class wxTextCtrl; class wxChoice; class wxButton; class wxStaticText; class wxComboBox; namespace wxutil { class TreeView; } namespace ui { /** * greebo: A Difficulty Editor provides the front-end for editing a * set of Difficulty Settings (e.g. "Easy" setting). The actual * data is stored in a DifficultySettings instance. */ class DifficultyEditor : public wxEvtHandler, private wxutil::XmlResourceBasedWidget { private: // The actual settings we're working with difficulty::DifficultySettingsPtr _settings; // GtkNotebook-related widgets wxPanel* _editor; std::string _label; // the actual label wxutil::TreeView* _settingsView; // The classname dropdown entry field wxComboBox* _classCombo; wxTextCtrl* _spawnArgEntry; wxTextCtrl* _argumentEntry; wxChoice* _appTypeCombo; wxButton* _saveSettingButton; wxButton* _deleteSettingButton; wxButton* _createSettingButton; wxButton* _refreshButton; // A label containing notes to the user wxStaticText* _noteText; // Mutex for avoiding loopbacks bool _updateActive; public: /** * greebo: Pass the label string and the difficulty settings object to the * constructor. The DifficultySettings should be populated first. */ DifficultyEditor(wxWindow* parent, const std::string& label, const difficulty::DifficultySettingsPtr& settings); // Returns the actual editor widget (contains all controls and views) wxWindow* getEditor(); // Returns the label for packing into a GtkNotebook tab. std::string getNotebookLabel(); std::string getNotebookIconName(); private: // Creates the widgets void populateWindow(); // Returns the ID of the selected setting (or -1) if no valid setting is selected int getSelectedSettingId(); // Loads the data from the treeview selection into the editor widgets void updateEditorWidgets(); // Prepares the widgets for addition of a new setting void createSetting(); // Saves the setting data from the widgets to the DifficultySettings object void saveSetting(); // Removes the setting selected in the treeview void deleteSetting(); // Highlights the setting (according to the given ) in the treeview void selectSettingById(int id); // Callback for treeview selection changes void onSettingSelectionChange(wxDataViewEvent& ev); void onSettingCreate(wxCommandEvent& ev); void onSettingSave(wxCommandEvent& ev); void onSettingDelete(wxCommandEvent& ev); void onRefresh(wxCommandEvent& ev); void onAppTypeChange(wxCommandEvent& ev); }; typedef std::shared_ptr DifficultyEditorPtr; } // namespace ui DarkRadiant-2.0.2/plugins/dm.difficulty/DifficultyEntity.cpp000066400000000000000000000020471245424655700241450ustar00rootroot00000000000000#include "DifficultyEntity.h" #include "ientity.h" #include "string/convert.h" namespace difficulty { DifficultyEntity::DifficultyEntity(Entity* source) : _entity(source), _curId(0) {} void DifficultyEntity::clear() { // Find all spawnargs starting with a "diff_" Entity::KeyValuePairs pairs = _entity->getKeyValuePairs("diff_"); // Remove all (set the value to the empty string "") for (Entity::KeyValuePairs::iterator i = pairs.begin(); i != pairs.end(); i++) { _entity->setKeyValue(i->first, ""); } _curId = 0; } void DifficultyEntity::writeSetting(const SettingPtr& setting, int _level) { // Construct the prefix and index strings std::string prefix = "diff_" + string::to_string(_level) + "_"; std::string idx = string::to_string(_curId); // Save the spawnargs _entity->setKeyValue(prefix + "class_" + idx, setting->className); _entity->setKeyValue(prefix + "change_" + idx, setting->spawnArg); _entity->setKeyValue(prefix + "arg_" + idx, setting->getArgumentKeyValue()); // Increase the ID _curId++; } } // namespace difficulty DarkRadiant-2.0.2/plugins/dm.difficulty/DifficultyEntity.h000066400000000000000000000014051245424655700236070ustar00rootroot00000000000000#ifndef DIFFICULTY_ENTITY_H_ #define DIFFICULTY_ENTITY_H_ #include "ientity.h" #include "Setting.h" namespace difficulty { /** * greebo: A DifficultyEntity encapsulates a doom3-compatible map entity * and provides methods to save/load difficulty settings to/from spawargs. */ class DifficultyEntity { // The actual entity we're working with Entity* _entity; // The unique ID needed to write the spawnargs int _curId; public: DifficultyEntity(Entity* source); // Removes all difficulty settings from the entity void clear(); // Write the setting to this entity void writeSetting(const SettingPtr& setting, int _level); }; typedef std::shared_ptr DifficultyEntityPtr; } // namespace difficulty #endif /* DIFFICULTY_ENTITY_H_ */ DarkRadiant-2.0.2/plugins/dm.difficulty/DifficultyEntityFinder.h000066400000000000000000000020641245424655700247410ustar00rootroot00000000000000#pragma once #include "ientity.h" #include "gamelib.h" #include "DifficultySettings.h" namespace difficulty { class DifficultyEntityFinder : public scene::NodeVisitor { public: // Found difficulty entities are stored in this list typedef std::vector EntityList; private: // The entityClass name to search for std::string _entityClassName; // The list of found entities EntityList _foundEntities; public: DifficultyEntityFinder() : _entityClassName(game::current::getValue(GKEY_DIFFICULTY_ENTITYDEF_MAP)) {} // Return the list of found entites const EntityList& getEntities() const { return _foundEntities; } // Walker implementation bool pre(const scene::INodePtr& node) { // Check if we have an entity Entity* entity = Node_getEntity(node); if (entity != NULL) { // Check for a classname match if (entity->getKeyValue("classname") == _entityClassName) { _foundEntities.push_back(entity); } // Don't traverse the children of entities return false; } return true; } }; } // namespace difficulty DarkRadiant-2.0.2/plugins/dm.difficulty/DifficultySettings.cpp000066400000000000000000000307411245424655700244730ustar00rootroot00000000000000#include "DifficultySettings.h" #include "i18n.h" #include "string/convert.h" #include "eclass.h" namespace difficulty { DifficultySettings::DifficultySettings(int level) : _level(level), _store(new wxutil::TreeModel(_columns)) {} DifficultySettings::~DifficultySettings() {} const DifficultySettings::TreeModelColumns& DifficultySettings::getColumns() const { return _columns; } wxutil::TreeModel::Ptr DifficultySettings::getTreeStore() const { return _store; } int DifficultySettings::getLevel() const { return _level; } void DifficultySettings::clear() { _settings.clear(); _settingIds.clear(); _iterMap.clear(); } SettingPtr DifficultySettings::getSettingById(int id) const { // Search all stored settings matching this classname SettingIdMap::const_iterator found = _settingIds.find(id); if (found != _settingIds.end()) { return found->second; } return SettingPtr(); // not found } SettingPtr DifficultySettings::findOrCreateOverrule(const SettingPtr& existing) { // Get the inheritancekey needed to lookup the classname std::string inheritanceKey = getInheritanceKey(existing->className); // Check if there is already an override active for the setting for (SettingsMap::iterator i = _settings.find(inheritanceKey); i != _settings.upper_bound(inheritanceKey) && i != _settings.end(); ++i) { // Avoid self==self comparisons if (i->second != existing && i->second->spawnArg == existing->spawnArg) { // spawnarg is set on a different setting, check if it is non-default if (!i->second->isDefault) { // non-default, overriding setting, return it return i->second; } } } // No overriding setting found, create a new one SettingPtr setting = createSetting(existing->className); setting->spawnArg = existing->spawnArg; setting->isDefault = false; setting->appType = Setting::EAssign; return setting; } int DifficultySettings::save(int id, const SettingPtr& setting) { if (id != -1) { // We're dealing with an existing setting, fetch it SettingPtr existing = getSettingById(id); if (existing == NULL) { return -1; } if (existing->isDefault) { // We're trying to save a default setting, go into override mode if (*setting == *existing) { // New settings are identical to the existing ones, skip return existing->id; } // Create a new setting SettingPtr overrule = findOrCreateOverrule(existing); // Transfer the argument/appType into the new setting overrule->argument = setting->argument; overrule->appType = setting->appType; return overrule->id; } else { // TODO: Check, if there is another, existing setting which we // override with this one and whether they are the same // Copy the settings over to the existing setting *existing = *setting; return existing->id; } } else { // No setting highlighted, create a new one SettingPtr newSetting = createSetting(setting->className); // Copy the settings over *newSetting = *setting; newSetting->isDefault = false; return newSetting->id; } } void DifficultySettings::deleteSetting(int id) { for (SettingsMap::iterator i = _settings.begin(); i != _settings.end(); ++i) { if (i->second->id == id) { // Found it, remove it from the tree and all maps _store->RemoveItem(i->second->iter); _settings.erase(i); _settingIds.erase(id); break; } } // Override settings might have been changed, update the model updateTreeModel(); } void DifficultySettings::updateTreeModel() { // Go through the settings and check the corresponding iters in the tree for (SettingsMap::iterator i = _settings.begin(); i != _settings.end(); ++i) { const std::string& className = i->second->className; Setting& setting = *i->second; // Ensure that the classname is in the map wxDataViewItem classIter = findOrInsertClassname(className); bool settingAdded = false; if (!setting.iter.IsOk()) { // No iter corresponding to this setting yet, insert it setting.iter = classIter.IsOk() ? _store->AddItem(classIter).getItem() : _store->AddItem().getItem(); settingAdded = true; } wxutil::TreeModel::Row row(setting.iter, *_store); bool overridden = isOverridden(i->second); wxDataViewItemAttr colour; colour.SetColour(setting.isDefault ? wxColor(112,112,112) : wxColor(0,0,0)); row[_columns.description] = setting.getDescString() + (overridden ? _(" (overridden)") : ""); row[_columns.description] = colour; row[_columns.classname] = setting.className; row[_columns.settingId] = setting.id; row[_columns.isOverridden] = overridden; if (settingAdded) { row.SendItemAdded(); } else { row.SendItemChanged(); } } } void DifficultySettings::clearTreeModel() { _iterMap.clear(); _store->Clear(); // Clear any iterators stored in the settings for (SettingsMap::iterator i = _settings.begin(); i != _settings.end(); ++i) { i->second->iter = wxDataViewItem(); } } void DifficultySettings::refreshTreeModel() { clearTreeModel(); updateTreeModel(); } bool DifficultySettings::isOverridden(const SettingPtr& setting) { if (!setting->isDefault) { return false; // not a default setting, return false } // Get the inheritancekey needed to lookup the classname std::string inheritanceKey = getInheritanceKey(setting->className); // Search all other settings for the same className/spawnArg combination for (SettingsMap::iterator i = _settings.find(inheritanceKey); i != _settings.upper_bound(inheritanceKey) && i != _settings.end(); ++i) { // Avoid self==self comparisons if (i->second != setting && i->second->spawnArg == setting->spawnArg) { // spawnarg is set on a different setting, check if it is non-default if (!i->second->isDefault) { // non-default, overriding setting, return true return true; } } } return false; } std::string DifficultySettings::getParentClass(const std::string& className) { // Get the parent eclass IEntityClassPtr eclass = GlobalEntityClassManager().findClass(className); if (eclass == NULL) { return ""; // Invalid! } EntityClassAttribute inheritAttr = eclass->getAttribute("inherit"); return inheritAttr.getValue(); } wxDataViewItem DifficultySettings::findOrInsertClassname(const std::string& className) { // Try to look up the classname in the tree TreeIterMap::iterator found = _iterMap.find(className); if (found != _iterMap.end()) { // Name exists, return this return found->second; } // This iter will hold the parent element, if such is found wxDataViewItem parentIter; // Classname is not yet registered, walk up the inheritance tree std::string parentClassName = getParentClass(className); while (!parentClassName.empty()) { // Try to look up the classname in the tree TreeIterMap::iterator found = _iterMap.find(parentClassName); if (found != _iterMap.end()) { parentIter = found->second; break; } parentClassName = getParentClass(parentClassName); } // Insert the map, using the found iter (or NULL, if nothing was found) wxDataViewItem inserted = insertClassName(className, parentIter); // Remember the iter _iterMap.insert(TreeIterMap::value_type(className, inserted)); return inserted; } wxDataViewItem DifficultySettings::insertClassName(const std::string& className, const wxDataViewItem& parent) { wxutil::TreeModel::Row row = parent.IsOk() ? _store->AddItem(parent) : _store->AddItem(); wxDataViewItemAttr black; black.SetColour(wxColor(0,0,0)); row[_columns.description] = className; row[_columns.description] = black; row[_columns.classname] = className; row[_columns.settingId] = -1; row.SendItemAdded(); return row.getItem(); } std::string DifficultySettings::getInheritanceKey(const std::string& className) { if (className.empty()) return ""; IEntityClassPtr eclass = GlobalEntityClassManager().findClass(className); // Get the inheritance chain of this class std::list inheritanceChain; for (const IEntityClass* currentClass = eclass.get(); currentClass != NULL; currentClass = currentClass->getParent()) { inheritanceChain.push_front(currentClass->getName()); } // Build the inheritance key std::string inheritanceKey; for (std::list::const_iterator c = inheritanceChain.begin(); c != inheritanceChain.end(); c++) { inheritanceKey += (inheritanceKey.empty()) ? "" : "_"; inheritanceKey += *c; } return inheritanceKey; } SettingPtr DifficultySettings::createSetting(const std::string& className) { SettingPtr setting(new Setting); setting->className = className; // Insert the parsed setting into our local map _settings.insert(SettingsMap::value_type(getInheritanceKey(className), setting)); _settingIds.insert(SettingIdMap::value_type(setting->id, setting)); return setting; } void DifficultySettings::parseFromEntityDef(const IEntityClassPtr& def) { // Construct the prefix for the desired difficulty level std::string diffPrefix = "diff_" + string::to_string(_level) + "_"; std::string prefix = diffPrefix + "change_"; eclass::AttributeList spawnargs = eclass::getSpawnargsWithPrefix(*def, prefix); for (eclass::AttributeList::iterator i = spawnargs.begin(); i != spawnargs.end(); ++i) { EntityClassAttribute& attr = *i; if (attr.getValue().empty()) { continue; // empty spawnarg attribute => invalid } // Get the index from the string's tail std::string indexStr = attr.getName().substr(prefix.length()); const EntityClassAttribute& classAttr = def->getAttribute(diffPrefix + "class_" + indexStr); const EntityClassAttribute& argAttr = def->getAttribute(diffPrefix + "arg_" + indexStr); SettingPtr setting = createSetting(classAttr.getValue()); setting->spawnArg = attr.getValue(); setting->argument = argAttr.getValue(); // This has been parsed from the default entityDef setting->isDefault = true; // Interpret/parse the argument string setting->parseAppType(); } clearTreeModel(); updateTreeModel(); } void DifficultySettings::parseFromMapEntity(Entity* entity) { // Construct the prefix for the desired difficulty level std::string diffPrefix = "diff_" + string::to_string(_level) + "_"; std::string prefix = diffPrefix + "change_"; Entity::KeyValuePairs spawnargs = entity->getKeyValuePairs(prefix); for (Entity::KeyValuePairs::iterator i = spawnargs.begin(); i != spawnargs.end(); ++i) { const std::string& key = i->first; const std::string& value = i->second; if (value.empty()) { continue; // empty spawnarg attribute => invalid } // Get the index from the string's tail std::string indexStr = key.substr(prefix.length()); std::string className = entity->getKeyValue(diffPrefix + "class_" + indexStr); SettingPtr setting = createSetting(className); setting->spawnArg = value; setting->argument = entity->getKeyValue(diffPrefix + "arg_" + indexStr); // This has been parsed from the default entityDef setting->isDefault = false; // Interpret/parse the argument string setting->parseAppType(); } clearTreeModel(); updateTreeModel(); } void DifficultySettings::saveToEntity(DifficultyEntity& target) { // Cycle through all settings for (SettingsMap::iterator i = _settings.begin(); i != _settings.end(); ++i) { const SettingPtr& setting = i->second; if (setting->isDefault) { // Don't save default settings continue; } // Write the setting to the entity target.writeSetting(setting, _level); } } } // namespace difficulty DarkRadiant-2.0.2/plugins/dm.difficulty/DifficultySettings.h000066400000000000000000000112231245424655700241320ustar00rootroot00000000000000#pragma once #include "ieclass.h" #include "entitylib.h" #include #include #include "wxutil/TreeModel.h" #include "DifficultyEntity.h" #include "Setting.h" namespace { const std::string GKEY_DIFFICULTY_LEVELS("/difficulty/numLevels"); const std::string GKEY_DIFFICULTY_ENTITYDEF_DEFAULT("/difficulty/defaultSettingsEclass"); const std::string GKEY_DIFFICULTY_ENTITYDEF_MAP("/difficulty/mapSettingsEclass"); const std::string GKEY_DIFFICULTY_ENTITYDEF_MENU("/difficulty/difficultyMenuEclass"); } namespace difficulty { class DifficultySettings { public: struct TreeModelColumns : public wxutil::TreeModel::ColumnRecord { TreeModelColumns() : description(add(wxutil::TreeModel::Column::String)), classname(add(wxutil::TreeModel::Column::String)), settingId(add(wxutil::TreeModel::Column::Integer)), isOverridden(add(wxutil::TreeModel::Column::Boolean)) {} wxutil::TreeModel::Column description; wxutil::TreeModel::Column classname; wxutil::TreeModel::Column settingId; wxutil::TreeModel::Column isOverridden; }; private: // the difficulty level, these settings are referring to int _level; // The settings map associates classnames with spawnarg change records. // Multiple settings can be made for a single classname. typedef std::multimap SettingsMap; SettingsMap _settings; // A mapping between Setting ID and Setting (for faster lookup on GTK selection) typedef std::map SettingIdMap; SettingIdMap _settingIds; // This maps classnames to wxDataViewItems, for faster lookup typedef std::map TreeIterMap; TreeIterMap _iterMap; // The treemodel TreeModelColumns _columns; // This class holds a reference to the treemodel wxutil::TreeModel::Ptr _store; public: // Define the difficulty level in the constructor DifficultySettings(int level); ~DifficultySettings(); const TreeModelColumns& getColumns() const; // Get the treestore pointer for packing into a treeview // Note that this class will keep a reference to the model wxutil::TreeModel::Ptr getTreeStore() const; // Returns the Setting associated with the given className // and carrying the given ID (returned pointer might be NULL) SettingPtr getSettingById(int id) const; // Returns the level these settings are referring to int getLevel() const; // Empties the internal structures void clear(); /** * greebo: Saves the given setting. The ID specifices the setting currently * highlighted in the editor (pass -1 if nothing is selected). * * @returns: the ID of the saved Setting, can be used to select it. */ int save(int id, const SettingPtr& setting); // Removes the setting with the given ID void deleteSetting(int id); // Loads the data into the given treestore void updateTreeModel(); // Loads all settings (matching the internal _level) from the given entityDef. void parseFromEntityDef(const IEntityClassPtr& def); // Loads all settings (matching the internal _level) from the given entity. void parseFromMapEntity(Entity* entity); // Save the relevant settings to the given difficulty entity void saveToEntity(DifficultyEntity& target); // Returns true if the given setting is overridden by map-specific settings bool isOverridden(const SettingPtr& setting); // Clears and reloads the treemodel void refreshTreeModel(); private: // Clears the tree data void clearTreeModel(); // Get the inheritance key of the given classname (for sorting in the map) std::string getInheritanceKey(const std::string& className); // Creates a new setting (and updates the internal structures) // This needs the classname as argument (for the internal mapping) SettingPtr createSetting(const std::string& className); /** * greebo: Finds or creates a setting overruling the given one. */ SettingPtr findOrCreateOverrule(const SettingPtr& existing); /** * greebo: Returns the TreeIter pointing to the tree element in . * If the item is not yet existing, it gets inserted into the tree, according * to its inheritance tree. */ wxDataViewItem findOrInsertClassname(const std::string& className); /** * greebo: Inserts the given classname into the treestore, using the * given iter as insertion point. If is invalid, * the entry is inserted at root level. */ wxDataViewItem insertClassName(const std::string& className, const wxDataViewItem& parent = wxDataViewItem()); // returns the parent eclass name for the given or "" if no parent std::string getParentClass(const std::string& className); }; typedef std::shared_ptr DifficultySettingsPtr; } // namespace difficulty DarkRadiant-2.0.2/plugins/dm.difficulty/DifficultySettingsManager.cpp000066400000000000000000000125471245424655700257720ustar00rootroot00000000000000#include "DifficultySettingsManager.h" #include "ieclass.h" #include "itextstream.h" #include "entitylib.h" #include "gamelib.h" #include "string/string.h" #include "registry/registry.h" #include "DifficultyEntity.h" #include "DifficultyEntityFinder.h" namespace difficulty { DifficultySettingsPtr DifficultySettingsManager::getSettings(int level) { for (std::size_t i = 0; i < _settings.size(); i++) { if (_settings[i]->getLevel() == level) { return _settings[i]; } } return DifficultySettingsPtr(); } void DifficultySettingsManager::loadSettings() { loadDefaultSettings(); loadMapSettings(); loadDifficultyNames(); } void DifficultySettingsManager::loadDefaultSettings() { // Try to lookup the given entityDef IEntityClassPtr eclass = GlobalEntityClassManager().findClass( game::current::getValue(GKEY_DIFFICULTY_ENTITYDEF_DEFAULT) ); if (eclass == NULL) { rError() << "Could not find default difficulty settings entityDef.\n"; return; } // greebo: Setup the default difficulty levels using the found entityDef int numLevels = game::current::getValue(GKEY_DIFFICULTY_LEVELS); for (int i = 0; i < numLevels; i++) { // Allocate a new settings object DifficultySettingsPtr settings(new DifficultySettings(i)); // Parse the settings from the given default settings entityDef settings->parseFromEntityDef(eclass); // Store the settings object in the local list _settings.push_back(settings); } } void DifficultySettingsManager::loadMapSettings() { // Construct a helper walker DifficultyEntityFinder finder; GlobalSceneGraph().root()->traverse(finder); const DifficultyEntityFinder::EntityList& found = finder.getEntities(); // Pop all entities into each difficulty setting for (DifficultyEntityFinder::EntityList::const_iterator ent = found.begin(); ent != found.end(); ent++) { for (std::size_t i = 0; i < _settings.size(); i++) { _settings[i]->parseFromMapEntity(*ent); } } } void DifficultySettingsManager::loadDifficultyNames() { // Locate the worldspawn entity Entity* worldspawn = Scene_FindEntityByClass("worldspawn"); // Try to locate the difficulty menu entity, where the default names are defined IEntityClassPtr eclass = GlobalEntityClassManager().findClass( game::current::getValue(GKEY_DIFFICULTY_ENTITYDEF_MENU) ); // greebo: Setup the default difficulty levels using the found entityDef int numLevels = game::current::getValue(GKEY_DIFFICULTY_LEVELS); for (int i = 0; i < numLevels; i++) { std::string nameKey = "diff" + string::to_string(i) + "default"; // First, try to find a map-specific name if (worldspawn != NULL) { std::string name = worldspawn->getKeyValue(nameKey); if (!name.empty()) { // Found a setting on worldspawn, take it _difficultyNames.push_back(name); continue; // done for this level } } // If the above failed, try to load the default setting if (eclass != NULL) { EntityClassAttribute attr = eclass->getAttribute(nameKey); if (!attr.getValue().empty()) { _difficultyNames.push_back(attr.getValue()); continue; } } // Fall back to a non-empty default _difficultyNames.push_back(string::to_string(i)); } } void DifficultySettingsManager::saveSettings() { // Locates all difficulty entities DifficultyEntityFinder finder; GlobalSceneGraph().root()->traverse(finder); // Copy the list from the finder to a local list DifficultyEntityFinder::EntityList entities = finder.getEntities(); if (entities.empty()) { // Create a new difficulty entity std::string eclassName = game::current::getValue(GKEY_DIFFICULTY_ENTITYDEF_MAP); IEntityClassPtr diffEclass = GlobalEntityClassManager().findClass(eclassName); if (diffEclass == NULL) { rError() << "[Diff]: Cannot create difficulty entity!\n"; return; } // Create and insert a new entity node into the scenegraph root IEntityNodePtr entNode = GlobalEntityCreator().createEntity(diffEclass); GlobalSceneGraph().root()->addChildNode(entNode); // Add the entity to the list entities.push_back(&entNode->getEntity()); } // Clear all difficulty-spawnargs from existing entities for (DifficultyEntityFinder::EntityList::const_iterator i = entities.begin(); i != entities.end(); i++) { // Construct a difficulty entity using the raw Entity* pointer DifficultyEntity diffEnt(*i); // Clear the difficulty-related spawnargs from the entity diffEnt.clear(); } // Take the first entity DifficultyEntity diffEnt(*entities.begin()); // Cycle through all settings objects and issue save call for (std::size_t i = 0; i < _settings.size(); i++) { _settings[i]->saveToEntity(diffEnt); } } std::string DifficultySettingsManager::getDifficultyName(int level) { if (level < 0 || level >= static_cast(_difficultyNames.size())) { return ""; } return _difficultyNames[level]; } } // namespace difficulty DarkRadiant-2.0.2/plugins/dm.difficulty/DifficultySettingsManager.h000066400000000000000000000022601245424655700254260ustar00rootroot00000000000000#ifndef DIFFICULTY_SETTINGS_MANAGER_H_ #define DIFFICULTY_SETTINGS_MANAGER_H_ #include "DifficultySettings.h" namespace difficulty { /** * greebo: The DifficultyManager contains all settings of all * available difficulty levels. The manager also provides * methods to fill in the settings data into a given * GtkTreeModel and to save the existing settings to the map/entityDef. **/ class DifficultySettingsManager { // This contains all the settings of all the difficulty levels std::vector _settings; // The names of the difficulty levels std::vector _difficultyNames; public: // Loads all settings from the entityDefs and the currently loaded map. void loadSettings(); // Saves the current working set into one map entity void saveSettings(); // Get the settings object for the given difficulty DifficultySettingsPtr getSettings(int level); // Get the display name of the given difficulty level std::string getDifficultyName(int level); private: void loadDefaultSettings(); void loadMapSettings(); void loadDifficultyNames(); }; } // namespace difficulty #endif /* DIFFICULTY_SETTINGS_MANAGER_H_ */ DarkRadiant-2.0.2/plugins/dm.difficulty/Makefile.am000066400000000000000000000011531245424655700221730ustar00rootroot00000000000000AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs \ $(XML_CFLAGS) pluginsdir = $(pkglibdir)/plugins plugins_LTLIBRARIES = dm_difficulty.la dm_difficulty_la_LIBADD = $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la dm_difficulty_la_LDFLAGS = -module -avoid-version $(WX_LIBS) $(XML_LIBS) dm_difficulty_la_SOURCES = DifficultyEditor.cpp \ plugin.cpp \ DifficultySettingsManager.cpp \ Setting.cpp \ DifficultySettings.cpp \ ClassNameStore.cpp \ DifficultyDialog.cpp \ DifficultyEntity.cpp DarkRadiant-2.0.2/plugins/dm.difficulty/Makefile.in000066400000000000000000000601051245424655700222060ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/dm.difficulty DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pluginsdir)" LTLIBRARIES = $(plugins_LTLIBRARIES) dm_difficulty_la_DEPENDENCIES = \ $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la am_dm_difficulty_la_OBJECTS = DifficultyEditor.lo plugin.lo \ DifficultySettingsManager.lo Setting.lo DifficultySettings.lo \ ClassNameStore.lo DifficultyDialog.lo DifficultyEntity.lo dm_difficulty_la_OBJECTS = $(am_dm_difficulty_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = dm_difficulty_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(dm_difficulty_la_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(dm_difficulty_la_SOURCES) DIST_SOURCES = $(dm_difficulty_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs \ $(XML_CFLAGS) pluginsdir = $(pkglibdir)/plugins plugins_LTLIBRARIES = dm_difficulty.la dm_difficulty_la_LIBADD = $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la dm_difficulty_la_LDFLAGS = -module -avoid-version $(WX_LIBS) $(XML_LIBS) dm_difficulty_la_SOURCES = DifficultyEditor.cpp \ plugin.cpp \ DifficultySettingsManager.cpp \ Setting.cpp \ DifficultySettings.cpp \ ClassNameStore.cpp \ DifficultyDialog.cpp \ DifficultyEntity.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/dm.difficulty/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/dm.difficulty/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginsLTLIBRARIES: $(plugins_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(plugins_LTLIBRARIES)'; test -n "$(pluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pluginsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pluginsdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pluginsdir)"; \ } uninstall-pluginsLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugins_LTLIBRARIES)'; test -n "$(pluginsdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pluginsdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pluginsdir)/$$f"; \ done clean-pluginsLTLIBRARIES: -test -z "$(plugins_LTLIBRARIES)" || rm -f $(plugins_LTLIBRARIES) @list='$(plugins_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } dm_difficulty.la: $(dm_difficulty_la_OBJECTS) $(dm_difficulty_la_DEPENDENCIES) $(EXTRA_dm_difficulty_la_DEPENDENCIES) $(AM_V_CXXLD)$(dm_difficulty_la_LINK) -rpath $(pluginsdir) $(dm_difficulty_la_OBJECTS) $(dm_difficulty_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ClassNameStore.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DifficultyDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DifficultyEditor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DifficultyEntity.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DifficultySettings.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DifficultySettingsManager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Setting.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pluginsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginsLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginsLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginsLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginsLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pluginsLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pluginsLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/plugins/dm.difficulty/Setting.cpp000066400000000000000000000044351245424655700222660ustar00rootroot00000000000000#include "Setting.h" #include "i18n.h" #include "iregistry.h" #include "gamelib.h" namespace difficulty { namespace { const std::string GKEY_APPTYPE_IGNORE("/difficulty/appTypeIgnore"); } Setting::Setting() : id(++_highestId), isDefault(false) {} std::string Setting::getArgumentKeyValue() const { std::string returnValue(argument); switch (appType) { case EAssign: break; case EAdd: returnValue = "+" + returnValue; break; case EMultiply: returnValue = "*" + returnValue; break; case EIgnore: returnValue = game::current::getValue(GKEY_APPTYPE_IGNORE); break; default: break; }; return returnValue; } std::string Setting::getDescString() const { std::string returnValue(argument); switch (appType) { case EAssign: returnValue = " = " + returnValue; break; case EAdd: returnValue = " += " + returnValue; break; case EMultiply: returnValue = " *= " + returnValue; break; case EIgnore: returnValue = " = [IGNORE]"; break; default: break; }; returnValue = spawnArg + returnValue; return returnValue; } bool Setting::operator==(const Setting& rhs) const { return className == rhs.className && spawnArg == rhs.spawnArg && argument == rhs.argument && appType == rhs.appType; } bool Setting::operator!=(const Setting& rhs) const { return !operator==(rhs); } Setting& Setting::operator=(const Setting& rhs) { className = rhs.className; spawnArg = rhs.spawnArg; argument = rhs.argument; appType = rhs.appType; isDefault = rhs.isDefault; return *this; } void Setting::parseAppType() { appType = EAssign; if (!argument.empty()) { // Check for ignore argument if (argument == game::current::getValue(GKEY_APPTYPE_IGNORE)) { appType = EIgnore; argument.clear(); // clear the argument } // Check for special modifiers else if (argument[0] == '+') { appType = EAdd; // Remove the first character argument = argument.substr(1); } else if (argument[0] == '*') { appType = EMultiply; // Remove the first character argument = argument.substr(1); } else if (argument[0] == '-') { appType = EAdd; // Leave the "-" sign, it will be the sign of the parsed int } } } // Initialise the static member int Setting::_highestId = 0; } // namespace difficulty DarkRadiant-2.0.2/plugins/dm.difficulty/Setting.h000066400000000000000000000030571245424655700217320ustar00rootroot00000000000000#pragma once #include #include #include namespace difficulty { /** * greebo: A Setting represents a spawnarg change. * This can be an assignment, addition, multiplication or NOP (ignore). */ class Setting { public: enum EApplicationType { EAssign, EAdd, EMultiply, EIgnore, ENumAppTypes, }; // ID of this setting (unique for each difficulty level) int id; // The classname this setting applies to std::string className; // The target spawnarg to be changed std::string spawnArg; // The parsed argument (the specifier (+/*) has already been removed) std::string argument; // How the argument should be applied EApplicationType appType; // Whether this setting is a default setting or map-specific bool isDefault; // The tree iter this setting is stored at wxDataViewItem iter; // Constructor (assigns a unique ID automatically) Setting(); // Comparison operators, return true if spawnarg/classname/argument/appType are the same bool operator==(const Setting& rhs) const; bool operator!=(const Setting& rhs) const; // Assignment operator (leaves the ID untouched) Setting& operator=(const Setting& rhs); // Interprets the argument string void parseAppType(); // Get the string suitable for saving to a spawnarg (e.g. "+50") std::string getArgumentKeyValue() const; // Assemble a description string for the contained spawnArg/argument combo. std::string getDescString() const; private: static int _highestId; }; typedef std::shared_ptr SettingPtr; } // namespace difficulty DarkRadiant-2.0.2/plugins/dm.difficulty/dm.difficulty.def000066400000000000000000000002001245424655700233500ustar00rootroot00000000000000; dm.difficulty.def : Declares the module parameters for the DLL. EXPORTS ; Explicit exports can go here RegisterModule @1 DarkRadiant-2.0.2/plugins/dm.difficulty/plugin.cpp000066400000000000000000000041661245424655700221500ustar00rootroot00000000000000#include "imodule.h" #include "i18n.h" #include "ieventmanager.h" #include "itextstream.h" #include "ieclass.h" #include "iscenegraph.h" #include "iuimanager.h" #include "iregistry.h" #include "iselection.h" #include "iradiant.h" #include "iundo.h" #include "ClassNameStore.h" #include "DifficultyDialog.h" /** * Module to register the menu commands for the Difficulty Editor class. */ class DifficultyEditorModule : public RegisterableModule { public: // RegisterableModule implementation const std::string& getName() const { static std::string _name("DifficultyEditor"); return _name; } const StringSet& getDependencies() const { static StringSet _dependencies; if (_dependencies.empty()) { _dependencies.insert(MODULE_EVENTMANAGER); _dependencies.insert(MODULE_UIMANAGER); _dependencies.insert(MODULE_COMMANDSYSTEM); } return _dependencies; } void initialiseModule(const ApplicationContext& ctx) { rMessage() << getName() << "::initialiseModule called." << std::endl; // Add the callback event GlobalCommandSystem().addCommand("DifficultyEditor", ui::DifficultyDialog::ShowDialog); GlobalEventManager().addCommand("DifficultyEditor", "DifficultyEditor"); // Add the menu item IMenuManager& mm = GlobalUIManager().getMenuManager(); mm.add("main/map", // menu location path "DifficultyEditor", // name ui::menuItem, // type _("Difficulty..."), // caption "stimresponse.png", // icon "DifficultyEditor"); // event name } void shutdownModule() { ui::ClassNameStore::destroy(); } }; typedef std::shared_ptr DifficultyEditorModulePtr; extern "C" void DARKRADIANT_DLLEXPORT RegisterModule(IModuleRegistry& registry) { registry.registerModule(DifficultyEditorModulePtr(new DifficultyEditorModule)); // Initialise the streams using the given application context module::initialiseStreams(registry.getApplicationContext()); // Remember the reference to the ModuleRegistry module::RegistryReference::Instance().setRegistry(registry); // Set up the assertion handler GlobalErrorHandler() = registry.getApplicationContext().getErrorHandlingFunction(); } DarkRadiant-2.0.2/plugins/dm.editing/000077500000000000000000000000001245424655700174205ustar00rootroot00000000000000DarkRadiant-2.0.2/plugins/dm.editing/AIEditingPanel.cpp000066400000000000000000000370601245424655700227070ustar00rootroot00000000000000#include "AIEditingPanel.h" #include "i18n.h" #include "iselection.h" #include "ieclass.h" #include "itextstream.h" #include "ientityinspector.h" #include "iradiant.h" #include "igroupdialog.h" #include "iuimanager.h" #include "selectionlib.h" #include "SpawnargLinkedCheckbox.h" #include "SpawnargLinkedSpinButton.h" #include #include #include #include #include #include #include #include namespace ui { AIEditingPanel::AIEditingPanel() : _tempParent(new wxFrame(NULL, wxID_ANY, "")), _mainPanel(new wxScrolledWindow(_tempParent, wxID_ANY)), _queueUpdate(true), _entity(NULL) { _tempParent->SetName("AIEditingPanelTemporaryParent"); _tempParent->Hide(); _mainPanel->Connect(wxEVT_PAINT, wxPaintEventHandler(AIEditingPanel::OnPaint), NULL, this); constructWidgets(); GlobalRadiant().signal_radiantShutdown().connect( sigc::mem_fun(*this, &AIEditingPanel::onRadiantShutdown) ); _selectionChangedSignal = GlobalSelectionSystem().signal_selectionChanged().connect( sigc::mem_fun(*this, &AIEditingPanel::onSelectionChanged) ); } void AIEditingPanel::constructWidgets() { _mainPanel->SetScrollRate(0, 3); _mainPanel->SetSizer(new wxBoxSizer(wxVERTICAL)); wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); _mainPanel->GetSizer()->Add(vbox, 1, wxEXPAND | wxALL, 12); // Populate the map with all the widgets linked to 1/0 spawnargs _checkboxes["canOperateDoors"] = new SpawnargLinkedCheckbox(_mainPanel, _("Can operate Doors"), "canOperateDoors"); _checkboxes["canLightTorches"] = new SpawnargLinkedCheckbox(_mainPanel, _("Can light Torches"), "canLightTorches"); _checkboxes["canOperateSwitchLights"] = new SpawnargLinkedCheckbox(_mainPanel, _("Can operate Switch Lights"), "canOperateSwitchLights"); _checkboxes["canOperateElevators"] = new SpawnargLinkedCheckbox(_mainPanel, _("Can operate Elevators"), "canOperateElevators"); _checkboxes["canGreet"] = new SpawnargLinkedCheckbox(_mainPanel, _("Can greet others"), "canGreet"); _checkboxes["canSearch"] = new SpawnargLinkedCheckbox(_mainPanel, _("Can search"), "canSearch"); _checkboxes["is_civilian"] = new SpawnargLinkedCheckbox(_mainPanel, _("AI is civilian"), "is_civilian"); _checkboxes["sleeping"] = new SpawnargLinkedCheckbox(_mainPanel, _("Start sleeping"), "sleeping"); _checkboxes["lay_down_left"] = new SpawnargLinkedCheckbox(_mainPanel, _("Lay down to the left"), "lay_down_left"); _checkboxes["sitting"] = new SpawnargLinkedCheckbox(_mainPanel, _("Start sitting"), "sitting"); _checkboxes["patrol"] = new SpawnargLinkedCheckbox(_mainPanel, _("Patrol"), "patrol"); _checkboxes["animal_patrol"] = new SpawnargLinkedCheckbox(_mainPanel, _("Animal Patrol Mode"), "animal_patrol"); _checkboxes["alert_idle"] = new SpawnargLinkedCheckbox(_mainPanel, _("Start in Alert Idle State"), "alert_idle"); _checkboxes["disable_alert_idle"] = new SpawnargLinkedCheckbox(_mainPanel, _("Disable Alert Idle State"), "disable_alert_idle"); _checkboxes["drunk"] = new SpawnargLinkedCheckbox(_mainPanel, _("Drunk"), "drunk"); _checkboxes["shoulderable"] = new SpawnargLinkedCheckbox(_mainPanel, _("Body is shoulderable"), "shoulderable"); _checkboxes["neverdormant"] = new SpawnargLinkedCheckbox(_mainPanel, _("AI doesn't think outside the player PVS"), "neverdormant", true); // inverse logic _checkboxes["can_drown"] = new SpawnargLinkedCheckbox(_mainPanel, _("AI can drown"), "can_drown"); _checkboxes["can_drown"]->setDefaultValueForMissingKeyValue(true); _checkboxes["can_be_flatfooted"] = new SpawnargLinkedCheckbox(_mainPanel, _("AI can be flatfooted"), "can_be_flatfooted"); _checkboxes["ko_alert_immune"] = new SpawnargLinkedCheckbox(_mainPanel, _("AI is immune to KOs at high alert levels"), "ko_alert_immune"); _checkboxes["ko_immune"] = new SpawnargLinkedCheckbox(_mainPanel, _("AI is immune to KOs"), "ko_immune"); _checkboxes["gas_immune"] = new SpawnargLinkedCheckbox(_mainPanel, _("AI is immune to Gas"), "gas_immune"); _spinButtons["team"] = new SpawnargLinkedSpinButton(_mainPanel, _("Team"), "team", 0, 99, 1, 0); _spinButtons["sit_down_angle"] = new SpawnargLinkedSpinButton(_mainPanel, _("Sitting Angle"), "sit_down_angle", -179, 180, 1, 0); _spinButtons["drunk_acuity_factor"] = new SpawnargLinkedSpinButton(_mainPanel, _("Drunk Acuity Factor"), "drunk_acuity_factor", 0, 10, 0.1, 2); _spinButtons["acuity_vis"] = new SpawnargLinkedSpinButton(_mainPanel, _("Visual Acuity"), "acuity_vis", 0, 1, 0.01, 2); _spinButtons["acuity_aud"] = new SpawnargLinkedSpinButton(_mainPanel, _("Audio Acuity"), "acuity_aud", 0, 1, 0.01, 2); _spinButtons["fov"] = new SpawnargLinkedSpinButton(_mainPanel, _("Horizontal FOV"), "fov", 0, 360, 1, 0); _spinButtons["fov_vert"] = new SpawnargLinkedSpinButton(_mainPanel, _("Vertical FOV"), "fov_vert", 0, 180, 1, 0); _spinButtons["min_interleave_think_dist"] = new SpawnargLinkedSpinButton(_mainPanel, _("Min. Interleave Distance"), "min_interleave_think_dist", 0, 60000, 50, 0); _spinButtons["max_interleave_think_dist"] = new SpawnargLinkedSpinButton(_mainPanel, _("Max. Interleave Distance"), "max_interleave_think_dist", 0, 60000, 50, 0); _spinButtons["health"] = new SpawnargLinkedSpinButton(_mainPanel, _("Health"), "health", 0, 1000, 5, 0); _spinButtons["health_critical"] = new SpawnargLinkedSpinButton(_mainPanel, _("Critical Health"), "health_critical", 0, 1000, 5, 0); _spinButtons["melee_range"] = new SpawnargLinkedSpinButton(_mainPanel, _("Melee Range"), "melee_range", 0, 200, 1, 0); { // Appearance widgets vbox->Add(createSectionLabel(_("Appearance")), 0, wxTOP | wxBOTTOM, 6); wxFlexGridSizer* table = new wxFlexGridSizer(3, 3, 4, 12); vbox->Add(table, 0, wxEXPAND | wxLEFT, 18); createChooserRow(table, _("Skin: "), _("Choose skin..."), "icon_skin.png", "skin"); createChooserRow(table, _("Head: "), _("Choose AI head..."), "icon_model.png", "def_head"); createChooserRow(table, _("Vocal Set: "), _("Choose Vocal Set..."), "icon_sound.png", "def_vocal_set"); } { // Behaviour widgets vbox->Add(createSectionLabel(_("Behaviour")), 0, wxTOP | wxBOTTOM, 6); wxGridSizer* table = new wxGridSizer(9, 2, 4, 12); vbox->Add(table, 0, wxLEFT, 18); // Team table->Add(createSpinButtonHbox(_spinButtons["team"]), 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["is_civilian"], 0, wxALIGN_CENTER_VERTICAL); // Sitting table->Add(_checkboxes["sitting"], 0, wxALIGN_CENTER_VERTICAL); table->Add(createSpinButtonHbox(_spinButtons["sit_down_angle"]), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND); // Sleeping table->Add(_checkboxes["sleeping"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["lay_down_left"], 0, wxALIGN_CENTER_VERTICAL); // Patrolling table->Add(_checkboxes["patrol"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["animal_patrol"], 0, wxALIGN_CENTER_VERTICAL); // Acuity table->Add(createSpinButtonHbox(_spinButtons["acuity_vis"]), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND); table->Add(createSpinButtonHbox(_spinButtons["acuity_aud"]), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND); // FOV table->Add(createSpinButtonHbox(_spinButtons["fov"]), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND); table->Add(createSpinButtonHbox(_spinButtons["fov_vert"]), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND); // Drunk table->Add(_checkboxes["drunk"], 0, wxALIGN_CENTER_VERTICAL); table->Add(createSpinButtonHbox(_spinButtons["drunk_acuity_factor"]), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND); // Alert Idle Control table->Add(_checkboxes["alert_idle"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["disable_alert_idle"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["shoulderable"], 0, wxALIGN_CENTER_VERTICAL); } { // Abilities widgets vbox->Add(createSectionLabel(_("Abilities")), 0, wxTOP | wxBOTTOM, 6); wxGridSizer* table = new wxGridSizer(3, 2, 4, 12); vbox->Add(table, 0, wxLEFT, 18); table->Add(_checkboxes["canOperateDoors"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["canOperateElevators"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["canLightTorches"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["canOperateSwitchLights"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["canGreet"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["canSearch"], 0, wxALIGN_CENTER_VERTICAL); } { // Optimization widgets vbox->Add(createSectionLabel(_("Optimization")), 0, wxTOP | wxBOTTOM, 6); wxGridSizer* table = new wxGridSizer(3, 1, 4, 12); vbox->Add(table, 0, wxLEFT, 18); table->Add(_checkboxes["neverdormant"], 0, wxALIGN_CENTER_VERTICAL); table->Add(createSpinButtonHbox(_spinButtons["min_interleave_think_dist"]), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND); table->Add(createSpinButtonHbox(_spinButtons["max_interleave_think_dist"]), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND); } { // Health / Combat widgets vbox->Add(createSectionLabel(_("Health / Combat")), 0, wxTOP | wxBOTTOM, 6); wxGridSizer* table = new wxGridSizer(5, 2, 4, 12); vbox->Add(table, 0, wxLEFT, 18); table->Add(createSpinButtonHbox(_spinButtons["health"]), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND); table->Add(createSpinButtonHbox(_spinButtons["health_critical"]), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND); table->Add(createSpinButtonHbox(_spinButtons["melee_range"]), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND); table->Add(_checkboxes["can_drown"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["can_be_flatfooted"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["ko_immune"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["gas_immune"], 0, wxALIGN_CENTER_VERTICAL); table->Add(_checkboxes["ko_alert_immune"], 0, wxALIGN_CENTER_VERTICAL); } } wxSizer* AIEditingPanel::createSpinButtonHbox(SpawnargLinkedSpinButton* spinButton) { wxBoxSizer* hbox = new wxBoxSizer(wxHORIZONTAL); wxStaticText* label = new wxStaticText(spinButton->GetParent(), wxID_ANY, spinButton->getLabel() + ":"); hbox->Add(label, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, 6); hbox->Add(spinButton, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT); return hbox; } void AIEditingPanel::createChooserRow(wxSizer* table, const std::string& rowLabel, const std::string& buttonLabel, const std::string& buttonIcon, const std::string& key) { table->Add(new wxStaticText(_mainPanel, wxID_ANY, rowLabel), 0, wxALIGN_CENTER_VERTICAL); _labels[key] = new wxStaticText(_mainPanel, wxID_ANY, ""); table->Add(_labels[key], 1, wxALIGN_CENTER_VERTICAL); // Create the skin browse button wxButton* browseButton = new wxButton(_mainPanel, wxID_ANY, buttonLabel); browseButton->SetBitmap(wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + buttonIcon)); browseButton->Bind(wxEVT_BUTTON, std::bind(&AIEditingPanel::onBrowseButton, this, std::placeholders::_1, key)); table->Add(browseButton, 0, wxALIGN_RIGHT); } wxStaticText* AIEditingPanel::createSectionLabel(const std::string& text) { wxStaticText* label = new wxStaticText(_mainPanel, wxID_ANY, text); label->SetFont(label->GetFont().Bold()); return label; } AIEditingPanel& AIEditingPanel::Instance() { AIEditingPanelPtr& instance = InstancePtr(); if (!instance) { instance.reset(new AIEditingPanel); } return *instance; } void AIEditingPanel::Shutdown() { if (InstancePtr() != NULL) { //Instance().shutdown(); InstancePtr().reset(); } } void AIEditingPanel::onRadiantStartup() { IGroupDialog::PagePtr page(new IGroupDialog::Page); page->name = "aieditingpanel"; page->windowLabel = _("AI"); page->page = Instance()._mainPanel; page->tabIcon = "icon_ai.png"; page->tabLabel = _("AI"); page->insertBefore = "mediabrowser"; // Add the Media Browser page GlobalGroupDialog().addPage(page); // Delete the temporary parent Instance()._tempParent->Destroy(); Instance()._tempParent = NULL; GlobalUndoSystem().addObserver(InstancePtr().get()); } void AIEditingPanel::onRadiantShutdown() { GlobalUndoSystem().removeObserver(this); _selectionChangedSignal.disconnect(); } Entity* AIEditingPanel::getEntityFromSelection() { Entity* entity = NULL; const SelectionInfo& info = GlobalSelectionSystem().getSelectionInfo(); if (info.entityCount == 1 && info.totalCount == info.entityCount) { GlobalSelectionSystem().foreachSelected([&] (const scene::INodePtr& node) { Entity* candidate = Node_getEntity(node); if (candidate->isOfType("atdm:ai_base")) { entity = candidate; } }); } return entity; } void AIEditingPanel::updatePanelSensitivity() { _mainPanel->Enable(_entity != NULL); _mainPanel->Layout(); } void AIEditingPanel::onKeyInsert(const std::string& key, EntityKeyValue& value) { // On entity key change, we load all values afresh updateWidgetsFromSelection(); } void AIEditingPanel::onKeyChange(const std::string& key, const std::string& val) { // On entity key change, we load all values afresh updateWidgetsFromSelection(); } void AIEditingPanel::onKeyErase(const std::string& key, EntityKeyValue& value) { // On entity key change, we load all values afresh updateWidgetsFromSelection(); } void AIEditingPanel::postUndo() { updateWidgetsFromSelection(); } void AIEditingPanel::postRedo() { updateWidgetsFromSelection(); } void AIEditingPanel::updateWidgetsFromSelection() { // Write the entity object to each checkbox even if it is NULL // This will update the widget state from the entity's properties std::for_each(_checkboxes.begin(), _checkboxes.end(), [&] (CheckboxMap::value_type& pair) { pair.second->setEntity(_entity); }); std::for_each(_spinButtons.begin(), _spinButtons.end(), [&] (SpinButtonMap::value_type& pair) { pair.second->setEntity(_entity); }); // Some dependencies _checkboxes["lay_down_left"]->Enable(_checkboxes["sleeping"]->GetValue()); _spinButtons["sit_down_angle"]->Enable(_checkboxes["sitting"]->GetValue()); _spinButtons["drunk_acuity_factor"]->Enable(_checkboxes["drunk"]->GetValue()); std::for_each(_labels.begin(), _labels.end(), [&] (LabelMap::value_type& pair) { pair.second->SetLabelText(_entity != NULL ? _entity->getKeyValue(pair.first) : ""); }); } void AIEditingPanel::rescanSelection() { _queueUpdate = false; // Load the new entity from the selection _entity = getEntityFromSelection(); if (_entity != NULL) { _entity->attachObserver(this); } updatePanelSensitivity(); updateWidgetsFromSelection(); } void AIEditingPanel::onSelectionChanged(const Selectable& selectable) { // Immediately disconnect from the current entity in any case if (_entity != NULL) { _entity->detachObserver(this); } if (GlobalGroupDialog().getPage() == _mainPanel) { rescanSelection(); } else { // We don't scan the selection if the page is not visible _queueUpdate = true; } } void AIEditingPanel::OnPaint(wxPaintEvent& ev) { if (_queueUpdate) { // Wake up from sleep mode and inspect the current selection rescanSelection(); } ev.Skip(); } void AIEditingPanel::onBrowseButton(wxCommandEvent& ev, const std::string& key) { if (_entity == NULL) return; // Look up the property editor dialog IPropertyEditorPtr editor = GlobalEntityInspector().getRegisteredPropertyEditor(key); IPropertyEditorDialogPtr dialog = std::dynamic_pointer_cast(editor); if (dialog) { std::string oldValue = _entity->getKeyValue(key); std::string newValue = dialog->runDialog(_entity, key); if (newValue != oldValue) { UndoableCommand cmd("editAIProperty"); _entity->setKeyValue(key, newValue); _mainPanel->Layout(); } } else { rError() << "Could not find a property editor implementing the IPropertyEditorDialog interface for key " << key << std::endl; } } AIEditingPanelPtr& AIEditingPanel::InstancePtr() { static AIEditingPanelPtr _instancePtr; return _instancePtr; } } // namespace DarkRadiant-2.0.2/plugins/dm.editing/AIEditingPanel.h000066400000000000000000000037411245424655700223530ustar00rootroot00000000000000#pragma once #include #include "ientity.h" #include "iundo.h" #include #include #include class Selectable; class Entity; class wxStaticText; class wxScrolledWindow; class wxSizer; namespace ui { class AIEditingPanel; typedef std::shared_ptr AIEditingPanelPtr; class SpawnargLinkedCheckbox; class SpawnargLinkedSpinButton; class AIEditingPanel : public Entity::Observer, public UndoSystem::Observer, public wxEvtHandler { private: sigc::connection _selectionChangedSignal; wxWindow* _tempParent; wxScrolledWindow* _mainPanel; bool _queueUpdate; typedef std::map CheckboxMap; CheckboxMap _checkboxes; typedef std::map SpinButtonMap; SpinButtonMap _spinButtons; typedef std::map LabelMap; LabelMap _labels; Entity* _entity; public: AIEditingPanel(); static AIEditingPanel& Instance(); static void Shutdown(); static void onRadiantStartup(); void onKeyInsert(const std::string& key, EntityKeyValue& value); void onKeyChange(const std::string& key, const std::string& val); void onKeyErase(const std::string& key, EntityKeyValue& value); void postUndo(); void postRedo(); protected: void OnPaint(wxPaintEvent& ev); void onBrowseButton(wxCommandEvent& ev, const std::string& key); private: static AIEditingPanelPtr& InstancePtr(); void constructWidgets(); wxSizer* createSpinButtonHbox(SpawnargLinkedSpinButton* spinButton); wxStaticText* createSectionLabel(const std::string& text); void createChooserRow(wxSizer* table, const std::string& rowLabel, const std::string& buttonLabel, const std::string& buttonIcon, const std::string& key); void onRadiantShutdown(); void onSelectionChanged(const Selectable& selectable); void rescanSelection(); Entity* getEntityFromSelection(); void updateWidgetsFromSelection(); void updatePanelSensitivity(); }; } // namespace DarkRadiant-2.0.2/plugins/dm.editing/AIHeadChooserDialog.cpp000066400000000000000000000121011245424655700236350ustar00rootroot00000000000000#include "AIHeadChooserDialog.h" #include "i18n.h" #include "imainframe.h" #include "iuimanager.h" #include "ieclass.h" #include "eclass.h" #include #include namespace ui { namespace { const char* const WINDOW_TITLE = N_("Choose AI Head"); } AIHeadChooserDialog::AIHeadChooserDialog() : DialogBase(_(WINDOW_TITLE)), _headStore(new wxutil::TreeModel(_columns, true)), _headsView(NULL), _description(NULL) { SetSizer(new wxBoxSizer(wxVERTICAL)); wxSplitterWindow* splitter = new wxSplitterWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D | wxSP_LIVE_UPDATE); splitter->SetMinimumPaneSize(10); // disallow unsplitting GetSizer()->Add(splitter, 1, wxEXPAND | wxALL, 12); GetSizer()->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxALIGN_RIGHT | wxBOTTOM | wxRIGHT, 12); _headsView = wxutil::TreeView::CreateWithModel(splitter, _headStore, wxDV_NO_HEADER); _headsView->Connect(wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(AIHeadChooserDialog::onHeadSelectionChanged), NULL, this); // Head Name column _headsView->AppendTextColumn("", _columns.name.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); FitToScreen(0.7f, 0.6f); wxPanel* previewPanel = new wxPanel(splitter, wxID_ANY); // Set the default rotation to something better suitable for the head models _preview.reset(new wxutil::ModelPreview(previewPanel)); _preview->setDefaultCamDistanceFactor(9.0f); _description = new wxTextCtrl(previewPanel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_LEFT | wxTE_MULTILINE | wxTE_READONLY | wxTE_WORDWRAP); _description->SetMinClientSize(wxSize(-1, 60)); previewPanel->SetSizer(new wxBoxSizer(wxVERTICAL)); previewPanel->GetSizer()->Add(_description, 0, wxEXPAND | wxBOTTOM, 6); previewPanel->GetSizer()->Add(_preview->getWidget(), 1, wxEXPAND); splitter->SplitVertically(_headsView, previewPanel); // Set the default size of the window splitter->SetSashPosition(static_cast(GetSize().GetWidth() * 0.3f)); // Check if the liststore is populated findAvailableHeads(); // Load the found heads into the GtkListStore populateHeadStore(); } void AIHeadChooserDialog::setSelectedHead(const std::string& headDef) { _selectedHead = headDef; if (_selectedHead.empty()) { _headsView->UnselectAll(); return; } wxDataViewItem found = _headStore->FindString(headDef, _columns.name); // Lookup the model path in the treemodel if (found.IsOk()) { _headsView->Select(found); _headsView->EnsureVisible(found); handleSelectionChanged(); } } std::string AIHeadChooserDialog::getSelectedHead() { return _selectedHead; } void AIHeadChooserDialog::handleSelectionChanged() { // Prepare to check for a selection wxDataViewItem item = _headsView->GetSelection(); // Add button is enabled if there is a selection and it is not a folder. if (item.IsOk()) { // Make the OK button active FindWindowById(wxID_OK, this)->Enable(true); _description->Enable(true); // Set the panel text with the usage information wxutil::TreeModel::Row row(item, *_headStore); _selectedHead = row[_columns.name]; // Lookup the IEntityClass instance IEntityClassPtr ecls = GlobalEntityClassManager().findClass(_selectedHead); if (ecls) { _preview->setModel(ecls->getAttribute("model").getValue()); _preview->setSkin(ecls->getAttribute("skin").getValue()); // Update the usage panel _description->SetValue(eclass::getUsage(*ecls)); } } else { _selectedHead = ""; _preview->setModel(""); FindWindowById(wxID_OK, this)->Enable(false); _description->Enable(false); } } void AIHeadChooserDialog::onHeadSelectionChanged(wxDataViewEvent& ev) { handleSelectionChanged(); } void AIHeadChooserDialog::populateHeadStore() { // Clear the head list to be safe _headStore->Clear(); for (HeadList::const_iterator i = _availableHeads.begin(); i != _availableHeads.end(); ++i) { // Add the entity to the list wxutil::TreeModel::Row row = _headStore->AddItem(); row[_columns.name] = *i; row.SendItemAdded(); } } namespace { class HeadEClassFinder : public EntityClassVisitor { AIHeadChooserDialog::HeadList& _list; public: HeadEClassFinder(AIHeadChooserDialog::HeadList& list) : _list(list) {} void visit(const IEntityClassPtr& eclass) { if (eclass->getAttribute("editor_head").getValue() == "1") { _list.insert(eclass->getName()); } } }; } // namespace void AIHeadChooserDialog::findAvailableHeads() { if (!_availableHeads.empty()) { return; } // Instantiate a finder class and traverse all eclasses HeadEClassFinder visitor(_availableHeads); GlobalEntityClassManager().forEachEntityClass(visitor); } // Init static class member AIHeadChooserDialog::HeadList AIHeadChooserDialog::_availableHeads; } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/AIHeadChooserDialog.h000066400000000000000000000023161245424655700233110ustar00rootroot00000000000000#pragma once #include "wxutil/dialog/DialogBase.h" #include "wxutil/preview/ModelPreview.h" #include "wxutil/TreeView.h" #include #include namespace ui { class AIHeadChooserDialog : public wxutil::DialogBase { public: typedef std::set HeadList; private: struct ListStoreColumns : public wxutil::TreeModel::ColumnRecord { ListStoreColumns() : name(add(wxutil::TreeModel::Column::String)) {} wxutil::TreeModel::Column name; }; ListStoreColumns _columns; wxutil::TreeModel::Ptr _headStore; wxutil::TreeView* _headsView; wxTextCtrl* _description; // The model preview wxutil::ModelPreviewPtr _preview; // The name of the currently selected head std::string _selectedHead; static HeadList _availableHeads; public: AIHeadChooserDialog(); // Set the selection to a given entityDef void setSelectedHead(const std::string& headDef); // Get the currently selected head (is empty when nothing is selected) std::string getSelectedHead(); private: void populateHeadStore(); // Searches all entity classes for available heads static void findAvailableHeads(); void handleSelectionChanged(); void onHeadSelectionChanged(wxDataViewEvent& ev); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/AIHeadPropertyEditor.cpp000066400000000000000000000043621245424655700241200ustar00rootroot00000000000000#include "AIHeadPropertyEditor.h" #include "i18n.h" #include "ieclass.h" #include "iuimanager.h" #include "ientity.h" #include #include #include #include #include "AIHeadChooserDialog.h" namespace ui { AIHeadPropertyEditor::AIHeadPropertyEditor() : _widget(NULL), _entity(NULL) {} AIHeadPropertyEditor::AIHeadPropertyEditor(wxWindow* parent, Entity* entity, const std::string& key, const std::string& options) : _entity(entity) { // Construct the main widget (will be managed by the base class) _widget = new wxPanel(parent, wxID_ANY); _widget->SetSizer(new wxBoxSizer(wxHORIZONTAL)); // Create the browse button wxButton* browseButton = new wxButton(_widget, wxID_ANY, _("Choose AI head...")); browseButton->SetBitmap(wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + "icon_model.png")); browseButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(AIHeadPropertyEditor::onChooseButton), NULL, this); _widget->GetSizer()->Add(browseButton, 0, wxALIGN_CENTER_VERTICAL); } AIHeadPropertyEditor::~AIHeadPropertyEditor() { if (_widget != NULL) { _widget->Destroy(); } } wxPanel* AIHeadPropertyEditor::getWidget() { return _widget; } IPropertyEditorPtr AIHeadPropertyEditor::createNew(wxWindow* parent, Entity* entity, const std::string& key, const std::string& options) { return IPropertyEditorPtr(new AIHeadPropertyEditor(parent, entity, key, options)); } void AIHeadPropertyEditor::onChooseButton(wxCommandEvent& ev) { // Construct a new head chooser dialog AIHeadChooserDialog* dialog = new AIHeadChooserDialog; dialog->setSelectedHead(_entity->getKeyValue(DEF_HEAD_KEY)); // Show and block if (dialog->ShowModal() == wxID_OK) { _entity->setKeyValue(DEF_HEAD_KEY, dialog->getSelectedHead()); } dialog->Destroy(); } std::string AIHeadPropertyEditor::runDialog(Entity* entity, const std::string& key) { // Construct a new head chooser dialog AIHeadChooserDialog* dialog = new AIHeadChooserDialog; std::string prevHead = entity->getKeyValue(key); dialog->setSelectedHead(prevHead); // Show and block std::string selected = prevHead; if (dialog->ShowModal() == wxID_OK) { selected = dialog->getSelectedHead(); } dialog->Destroy(); return selected; } } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/AIHeadPropertyEditor.h000066400000000000000000000014661245424655700235670ustar00rootroot00000000000000#pragma once #include "ientityinspector.h" #include namespace ui { namespace { const std::string DEF_HEAD_KEY = "def_head"; } class AIHeadPropertyEditor : public IPropertyEditor, public IPropertyEditorDialog, public wxEvtHandler { private: // The top-level widget wxPanel* _widget; Entity* _entity; public: // Default constructor AIHeadPropertyEditor(); ~AIHeadPropertyEditor(); wxPanel* getWidget(); AIHeadPropertyEditor(wxWindow* parent, Entity* entity, const std::string& key, const std::string& options); IPropertyEditorPtr createNew(wxWindow* parent, Entity* entity, const std::string& key, const std::string& options); std::string runDialog(Entity* entity, const std::string& key); private: void onChooseButton(wxCommandEvent& ev); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/AIVocalSetChooserDialog.cpp000066400000000000000000000117531245424655700245300ustar00rootroot00000000000000#include "AIVocalSetChooserDialog.h" #include "i18n.h" #include "imainframe.h" #include "iuimanager.h" #include "ieclass.h" #include "isound.h" #include "eclass.h" #include #include namespace ui { namespace { const char* const WINDOW_TITLE = N_("Choose AI Vocal Set"); } AIVocalSetChooserDialog::AIVocalSetChooserDialog() : DialogBase(_(WINDOW_TITLE)), _setStore(new wxutil::TreeModel(_columns, true)), _preview(NULL) { SetSizer(new wxBoxSizer(wxVERTICAL)); if (module::GlobalModuleRegistry().moduleExists(MODULE_SOUNDMANAGER)) { _preview = new AIVocalSetPreview(this); } _setView = wxutil::TreeView::CreateWithModel(this, _setStore, wxDV_NO_HEADER); _setView->Connect(wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(AIVocalSetChooserDialog::onSetSelectionChanged), NULL, this); // Head Name column _setView->AppendTextColumn("", _columns.name.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); wxBoxSizer* vbox1 = new wxBoxSizer(wxVERTICAL); wxStaticText* label1 = new wxStaticText(this, wxID_ANY, _("Available Sets")); label1->SetFont(label1->GetFont().Bold()); vbox1->Add(label1, 0, wxBOTTOM, 6); vbox1->Add(_setView, 1, wxEXPAND); // Right: the description wxBoxSizer* vbox2 = new wxBoxSizer(wxVERTICAL); wxStaticText* label2 = new wxStaticText(this, wxID_ANY, _("Description")); label2->SetFont(label2->GetFont().Bold()); _description = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_LEFT | wxTE_MULTILINE | wxTE_READONLY | wxTE_WORDWRAP); _description->SetMinClientSize(wxSize(-1, 60)); vbox2->Add(label2, 0, wxBOTTOM, 6); vbox2->Add(_description, 1, wxEXPAND | wxBOTTOM, 6); // Right: the preview control panel if (_preview != NULL) { vbox2->Add(_preview, 0, wxEXPAND); } // dialog hbox, left is the treeview, right is the preview panel wxBoxSizer* hbox = new wxBoxSizer(wxHORIZONTAL); hbox->Add(vbox1, 3, wxEXPAND | wxRIGHT, 6); hbox->Add(vbox2, 1, wxEXPAND | wxRIGHT, 6); GetSizer()->Add(hbox, 1, wxEXPAND | wxALL, 12); GetSizer()->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxALIGN_RIGHT | wxBOTTOM | wxRIGHT, 12); FitToScreen(0.7f, 0.6f); // Check if the liststore is populated findAvailableSets(); // Load the found sets into the GtkListStore populateSetStore(); } void AIVocalSetChooserDialog::setSelectedVocalSet(const std::string& setName) { _selectedSet = setName; if (_selectedSet.empty()) { _setView->UnselectAll(); return; } wxDataViewItem found = _setStore->FindString(setName, _columns.name); // Lookup the model path in the treemodel if (found.IsOk()) { _setView->Select(found); _setView->EnsureVisible(found); handleSetSelectionChanged(); } } std::string AIVocalSetChooserDialog::getSelectedVocalSet() { return _selectedSet; } void AIVocalSetChooserDialog::handleSetSelectionChanged() { // Prepare to check for a selection wxDataViewItem item = _setView->GetSelection(); // Add button is enabled if there is a selection if (item.IsOk()) { // Make the OK button active FindWindowById(wxID_OK, this)->Enable(true); _description->Enable(true); // Set the panel text with the usage information wxutil::TreeModel::Row row(item, *_setStore); _selectedSet = row[_columns.name]; // Lookup the IEntityClass instance IEntityClassPtr ecls = GlobalEntityClassManager().findClass(_selectedSet); if (ecls) { // Update the preview pane if (_preview != NULL) { _preview->setVocalSetEclass(ecls); } // Update the usage panel _description->SetValue(eclass::getUsage(*ecls)); } } else { _selectedSet = ""; if (_preview != NULL) { _preview->setVocalSetEclass(IEntityClassPtr()); } FindWindowById(wxID_OK, this)->Enable(false); _description->Enable(false); } } void AIVocalSetChooserDialog::onSetSelectionChanged(wxDataViewEvent& ev) { handleSetSelectionChanged(); } void AIVocalSetChooserDialog::populateSetStore() { // Clear the head list to be safe _setStore->Clear(); for (SetList::const_iterator i = _availableSets.begin(); i != _availableSets.end(); ++i) { // Add the entity to the list wxutil::TreeModel::Row row = _setStore->AddItem(); row[_columns.name] = *i; row.SendItemAdded(); } } namespace { class VocalSetEClassFinder : public EntityClassVisitor { AIVocalSetChooserDialog::SetList& _list; public: VocalSetEClassFinder(AIVocalSetChooserDialog::SetList& list) : _list(list) {} void visit(const IEntityClassPtr& eclass) { if (eclass->getAttribute("editor_vocal_set").getValue() == "1") { _list.insert(eclass->getName()); } } }; } // namespace void AIVocalSetChooserDialog::findAvailableSets() { if (!_availableSets.empty()) { return; } // Instantiate a finder class and traverse all eclasses VocalSetEClassFinder visitor(_availableSets); GlobalEntityClassManager().forEachEntityClass(visitor); } // Init static class member AIVocalSetChooserDialog::SetList AIVocalSetChooserDialog::_availableSets; } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/AIVocalSetChooserDialog.h000066400000000000000000000023001245424655700241610ustar00rootroot00000000000000#pragma once #include "wxutil/dialog/DialogBase.h" #include #include #include "wxutil/TreeView.h" #include "AIVocalSetPreview.h" class wxTextCtrl; namespace ui { class AIVocalSetChooserDialog : public wxutil::DialogBase { public: typedef std::set SetList; private: struct ListStoreColumns : public wxutil::TreeModel::ColumnRecord { ListStoreColumns() : name(add(wxutil::TreeModel::Column::String)) {} wxutil::TreeModel::Column name; }; ListStoreColumns _columns; wxutil::TreeModel::Ptr _setStore; wxutil::TreeView* _setView; wxTextCtrl* _description; // The name of the currently selected set std::string _selectedSet; static SetList _availableSets; AIVocalSetPreview* _preview; public: AIVocalSetChooserDialog(); // Set the selection to a given entityDef void setSelectedVocalSet(const std::string& setName); // Get the currently selected set (is empty when nothing is selected) std::string getSelectedVocalSet(); private: void populateSetStore(); // Searches all entity classes for available sets static void findAvailableSets(); void handleSetSelectionChanged(); void onSetSelectionChanged(wxDataViewEvent& ev); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/AIVocalSetPreview.cpp000066400000000000000000000056731245424655700234330ustar00rootroot00000000000000#include "AIVocalSetPreview.h" #include "i18n.h" #include "isound.h" #include "iuimanager.h" #include "eclass.h" #include #include #include #include #include #include #include namespace ui { AIVocalSetPreview::AIVocalSetPreview(wxWindow* parent) : wxPanel(parent, wxID_ANY) { createControlPanel(); // Trigger the initial update of the widgets update(); srand(static_cast(time(NULL))); } void AIVocalSetPreview::createControlPanel() { SetMinClientSize(wxSize(200, -1)); SetSizer(new wxBoxSizer(wxVERTICAL)); // Create the playback button _playButton = new wxButton(this, wxID_ANY); _playButton->SetBitmap(wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + "media-playback-start-ltr.png")); _stopButton = new wxButton(this, wxID_ANY); _stopButton->SetBitmap(wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + "media-playback-stop.png")); _playButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(AIVocalSetPreview::onPlay), NULL, this); _stopButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(AIVocalSetPreview::onStop), NULL, this); wxBoxSizer* btnHBox = new wxBoxSizer(wxHORIZONTAL); btnHBox->Add(_playButton, 1, wxRIGHT, 6); btnHBox->Add(_stopButton, 1); _statusLabel = new wxStaticText(this, wxID_ANY, ""); GetSizer()->Add(_statusLabel); GetSizer()->Add(btnHBox); } void AIVocalSetPreview::setVocalSetEclass(const IEntityClassPtr& vocalSetDef) { _vocalSetDef = vocalSetDef; update(); } void AIVocalSetPreview::update() { _setShaders.clear(); if (_vocalSetDef != NULL) { eclass::AttributeList sndAttrs = eclass::getSpawnargsWithPrefix( *_vocalSetDef, "snd_" ); for (eclass::AttributeList::const_iterator i = sndAttrs.begin(); i != sndAttrs.end(); ++i) { _setShaders.push_back(i->getValue()); } } // If the soundshader string is empty, desensitise the widgets Enable(_vocalSetDef != NULL && !_setShaders.empty()); } std::string AIVocalSetPreview::getRandomSoundFile() { // get a random sound shader std::size_t idx = static_cast(rand()) % _setShaders.size(); ISoundShaderPtr soundShader = GlobalSoundManager().getSoundShader(_setShaders[idx]); if (soundShader == NULL) return ""; SoundFileList files = soundShader->getSoundFileList(); if (files.empty()) return ""; std::size_t fileIdx = static_cast(rand()) % files.size(); return files[fileIdx]; } void AIVocalSetPreview::onPlay(wxCommandEvent& ev) { _statusLabel->SetLabelMarkup(""); std::string file = getRandomSoundFile(); if (!file.empty()) { // Pass the call to the sound manager if (!GlobalSoundManager().playSound(file)) { _statusLabel->SetLabelMarkup(_("Error: File not found.")); } } } void AIVocalSetPreview::onStop(wxCommandEvent& ev) { // Pass the call to the sound manager GlobalSoundManager().stopSound(); _statusLabel->SetLabelMarkup(""); } } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/AIVocalSetPreview.h000066400000000000000000000024431245424655700230700ustar00rootroot00000000000000#pragma once #include "ieclass.h" #include class wxStaticText; class wxButton; namespace ui { /** * greebo: This class provides the UI elements to listen * to a a given AI vocal set. On clicking the playback button * a random sound is chosen from the vocal set. * * Use the getWidget() method to pack this into a * parent container. */ class AIVocalSetPreview : public wxPanel { private: wxButton* _playButton; wxButton* _stopButton; wxStaticText* _statusLabel; // The currently "previewed" vocal set IEntityClassPtr _vocalSetDef; typedef std::vector SoundShaderList; SoundShaderList _setShaders; public: AIVocalSetPreview(wxWindow* parent); /** * greebo: Sets the vocal set to preview. Set NULL to disable this panel. */ void setVocalSetEclass(const IEntityClassPtr& vocalSetDef); private: /** * greebo: Returns a random file from the selected vocal set. * @returns: the filename as defined in one of the shaders or "". */ std::string getRandomSoundFile(); /** greebo: Creates the control widgets (play button) and such. */ void createControlPanel(); /** greebo: Updates the list according to the active soundshader */ void update(); // Callbacks void onPlay(wxCommandEvent& ev); void onStop(wxCommandEvent& ev); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/AIVocalSetPropertyEditor.cpp000066400000000000000000000045331245424655700247770ustar00rootroot00000000000000#include "AIVocalSetPropertyEditor.h" #include "i18n.h" #include "ieclass.h" #include "iuimanager.h" #include "ientity.h" #include #include #include #include #include "AIVocalSetChooserDialog.h" namespace ui { AIVocalSetPropertyEditor::AIVocalSetPropertyEditor() : _widget(NULL), _entity(NULL) {} AIVocalSetPropertyEditor::AIVocalSetPropertyEditor(wxWindow* parent, Entity* entity, const std::string& key, const std::string& options) : _entity(entity) { // Construct the main widget (will be managed by the base class) _widget = new wxPanel(parent, wxID_ANY); _widget->SetSizer(new wxBoxSizer(wxHORIZONTAL)); // Create the browse button wxButton* browseButton = new wxButton(_widget, wxID_ANY, _("Select Vocal Set...")); browseButton->SetBitmap(wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + "icon_sound.png")); browseButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(AIVocalSetPropertyEditor::onChooseButton), NULL, this); _widget->GetSizer()->Add(browseButton, 0, wxALIGN_CENTER_VERTICAL); } AIVocalSetPropertyEditor::~AIVocalSetPropertyEditor() { if (_widget != NULL) { _widget->Destroy(); } } wxPanel* AIVocalSetPropertyEditor::getWidget() { return _widget; } IPropertyEditorPtr AIVocalSetPropertyEditor::createNew(wxWindow* parent, Entity* entity, const std::string& key, const std::string& options) { return IPropertyEditorPtr(new AIVocalSetPropertyEditor(parent, entity, key, options)); } void AIVocalSetPropertyEditor::onChooseButton(wxCommandEvent& ev) { // Construct a new vocal set chooser dialog AIVocalSetChooserDialog* dialog = new AIVocalSetChooserDialog; dialog->setSelectedVocalSet(_entity->getKeyValue(DEF_VOCAL_SET_KEY)); // Show and block if (dialog->ShowModal() == wxID_OK) { _entity->setKeyValue(DEF_VOCAL_SET_KEY, dialog->getSelectedVocalSet()); } dialog->Destroy(); } std::string AIVocalSetPropertyEditor::runDialog(Entity* entity, const std::string& key) { // Construct a new vocal set chooser dialog AIVocalSetChooserDialog* dialog = new AIVocalSetChooserDialog; std::string oldValue = entity->getKeyValue(DEF_VOCAL_SET_KEY); dialog->setSelectedVocalSet(oldValue); // Show and block std::string rv = oldValue; if (dialog->ShowModal() == wxID_OK) { rv = dialog->getSelectedVocalSet(); } dialog->Destroy(); return rv; } } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/AIVocalSetPropertyEditor.h000066400000000000000000000015161245424655700244420ustar00rootroot00000000000000#pragma once #include #include "ientityinspector.h" namespace ui { namespace { const std::string DEF_VOCAL_SET_KEY = "def_vocal_set"; } class AIVocalSetPropertyEditor : public IPropertyEditor, public IPropertyEditorDialog, public wxEvtHandler { private: // The top-level widget wxPanel* _widget; Entity* _entity; public: // Default constructor AIVocalSetPropertyEditor(); ~AIVocalSetPropertyEditor(); AIVocalSetPropertyEditor(wxWindow* parent, Entity* entity, const std::string& key, const std::string& options); wxPanel* getWidget(); IPropertyEditorPtr createNew(wxWindow* parent, Entity* entity, const std::string& key, const std::string& options); std::string runDialog(Entity* entity, const std::string& key); private: void onChooseButton(wxCommandEvent& ev); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/DeprecatedEclassCollector.h000066400000000000000000000012131245424655700246300ustar00rootroot00000000000000#pragma once #include "ieclass.h" namespace { const std::string MATERIAL_PREFIX("MATERIAL: "); const std::string ENTITYDEF_PREFIX("ENTITYDEF: "); } class DeprecatedEclassCollector : public EntityClassVisitor { private: std::string _fixupCode; public: void visit(const IEntityClassPtr& eclass) { const EntityClassAttribute& attr = eclass->getAttribute("editor_replacement"); if (attr.getValue().empty()) { return; } // Non-empty editor_replacement, add fixup code _fixupCode += ENTITYDEF_PREFIX + eclass->getName() + " => " + attr.getValue() + "\n"; } const std::string& getFixupCode() const { return _fixupCode; } }; DarkRadiant-2.0.2/plugins/dm.editing/FixupMap.cpp000066400000000000000000000105371245424655700216630ustar00rootroot00000000000000#include "FixupMap.h" #include #include #include #include "i18n.h" #include "iscenegraph.h" #include "iundo.h" #include "imainframe.h" #include "ieclass.h" #include "wxutil/dialog/MessageBox.h" #include "os/file.h" #include "string/string.h" #include "parser/Tokeniser.h" #include "ShaderReplacer.h" #include "SpawnargReplacer.h" #include "DeprecatedEclassCollector.h" #include #include FixupMap::FixupMap(const std::string& filename) : _filename(filename), _progress(_("Fixup in progress")) {} FixupMap::Result FixupMap::perform() { UndoableCommand cmd("performFixup"); // Load contents loadFixupFile(); // Load deprecated entities loadDeprecatedEntities(); // Instantiate a line tokeniser parser::BasicStringTokeniser tokeniser(_contents, "\n\r"); _curLineNumber = 0; std::size_t parsedSize = 0; while (tokeniser.hasMoreTokens()) { _curLineNumber++; std::string line = tokeniser.nextToken(); performFixup(line); // Approximate the progress parsedSize += line.size(); try { double fraction = static_cast(parsedSize) / _contents.size(); _progress.setTextAndFraction( (boost::format(_("Processing line %d...")) % _curLineNumber).str(), fraction); } catch (wxutil::ModalProgressDialog::OperationAbortedException& ex) { wxutil::Messagebox box(_("Fixup cancelled"), ex.what(), ui::IDialog::MESSAGE_ERROR); box.run(); return _result; } } _progress.setTextAndFraction(_("Completed"), 1.0); return _result; } void FixupMap::performFixup(const std::string& line) { // Skip empty lines and comments if (line.empty() || boost::algorithm::starts_with(line, "#") || boost::algorithm::starts_with(line, "//")) { return; } boost::regex expr("^" + MATERIAL_PREFIX + "(.*)\\s=>\\s(.*)$"); boost::smatch matches; if (boost::regex_match(line, matches, expr)) { // Fixup a specific shader std::string oldShader = matches[1]; std::string newShader = matches[2]; replaceShader(oldShader, newShader); return; } expr = boost::regex("^" + ENTITYDEF_PREFIX + "(.*)\\s=>\\s(.*)$"); if (boost::regex_match(line, matches, expr)) { // Fixup a specific entitydef std::string oldDef = matches[1]; std::string newDef = matches[2]; // Search all spawnargs replaceSpawnarg(oldDef, newDef); return; } // No specific prefix, this can be everything: spawnarg or texture expr = boost::regex("^(.*)\\s=>\\s(.*)$"); if (boost::regex_match(line, matches, expr)) { std::string oldStr = matches[1]; std::string newStr = matches[2]; // First, try to use these strings as shader replacement replaceShader(oldStr, newStr); // Second, traverse all entities and fix them up replaceSpawnarg(oldStr, newStr); return; } } void FixupMap::replaceSpawnarg(const std::string& oldVal, const std::string& newVal) { SpawnargReplacer replacer(oldVal, newVal); GlobalSceneGraph().root()->traverseChildren(replacer); replacer.processEntities(); _result.replacedModels += replacer.getModelCount(); _result.replacedEntities += replacer.getEclassCount(); _result.replacedMisc += replacer.getOtherCount(); } void FixupMap::replaceShader(const std::string& oldShader, const std::string& newShader) { // Instantiate a walker ShaderReplacer replacer(oldShader, newShader); GlobalSceneGraph().root()->traverseChildren(replacer); _result.replacedShaders += replacer.getReplaceCount(); } void FixupMap::loadFixupFile() { // Sanity-check the file if (!os::fileOrDirExists(_filename) || !file_readable(_filename.c_str())) { wxutil::Messagebox::Show(_("File not readable"), _("The specified file doesn't exist."), ui::IDialog::MESSAGE_ERROR); return; } // Load the file's contents std::ifstream input; input.open(_filename.c_str(), std::ios::in|std::ios::ate); if (!input) { wxutil::Messagebox::Show(_("File not readable"), _("The specified file can't be opened."), ui::IDialog::MESSAGE_ERROR); return; } std::vector buffer; buffer.resize(input.tellg()); input.seekg(0, std::ios::beg); input.read(&buffer.front(), buffer.size()); input.close(); _contents = &buffer.front(); } void FixupMap::loadDeprecatedEntities() { // Traverse all eclasses and collect replacements DeprecatedEclassCollector collector; GlobalEntityClassManager().forEachEntityClass(collector); _contents += "\n"; _contents += collector.getFixupCode(); } DarkRadiant-2.0.2/plugins/dm.editing/FixupMap.h000066400000000000000000000020571245424655700213260ustar00rootroot00000000000000#pragma once #include #include #include "wxutil/ModalProgressDialog.h" class FixupMap { public: struct Result { std::size_t replacedEntities; std::size_t replacedShaders; std::size_t replacedModels; std::size_t replacedMisc; // Errors, sorted by line typedef std::map ErrorMap; ErrorMap errors; Result() : replacedEntities(0), replacedShaders(0), replacedModels(0), replacedMisc(0) {} }; private: // Path to fixup file std::string _filename; // Fixup contents std::string _contents; std::size_t _curLineNumber; Result _result; wxutil::ModalProgressDialog _progress; public: // Pass the fixup filename to the constructor FixupMap(const std::string& filename); // Run the fixup process Result perform(); private: void loadFixupFile(); void loadDeprecatedEntities(); void performFixup(const std::string& line); void replaceShader(const std::string& oldShader, const std::string& newShader); void replaceSpawnarg(const std::string& oldVal, const std::string& newVal); }; DarkRadiant-2.0.2/plugins/dm.editing/FixupMapDialog.cpp000066400000000000000000000031531245424655700227770ustar00rootroot00000000000000#include "FixupMapDialog.h" #include "i18n.h" #include "imainframe.h" #include "wxutil/dialog/MessageBox.h" #include "string/string.h" #include "FixupMap.h" namespace ui { namespace { const char* const WINDOW_TITLE = N_("Fixup Map"); const char* const FIXUP_FILE_LABEL = N_("Fixup File"); } FixupMapDialog::FixupMapDialog() : Dialog(_(WINDOW_TITLE)) { // Add the path entry _pathEntry = addPathEntry(FIXUP_FILE_LABEL, false); } std::string FixupMapDialog::getFixupFilePath() { return getElementValue(_pathEntry); } void FixupMapDialog::RunDialog(const cmd::ArgumentList& args) { FixupMapDialog dialog; if (dialog.run() == RESULT_OK) { std::string filename = dialog.getFixupFilePath(); // Run fixup script FixupMap fixup(filename); FixupMap::Result result = fixup.perform(); // Show popup with results std::string msg; msg += (boost::format(_("%d shaders replaced.")) % result.replacedShaders).str() + "\n"; msg += (boost::format(_("%d entities replaced.")) % result.replacedEntities).str() + "\n"; msg += (boost::format(_("%d models replaced.")) % result.replacedModels).str() + "\n"; msg += (boost::format(_("%d spawnargs replaced.")) % result.replacedMisc).str() + "\n"; if (!result.errors.empty()) { msg += "\n\n"; msg += _("Errors occurred:"); msg += "\n"; for (FixupMap::Result::ErrorMap::const_iterator i = result.errors.begin(); i != result.errors.end(); ++i) { msg += (boost::format(_("(Line %d): %s")) % i->first % i->second).str(); msg += "\n"; } } wxutil::Messagebox::Show(_("Fixup Results"), msg, IDialog::MESSAGE_CONFIRM); } } } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/FixupMapDialog.h000066400000000000000000000005001245424655700224350ustar00rootroot00000000000000#pragma once #include "icommandsystem.h" #include "wxutil/dialog/Dialog.h" namespace ui { class FixupMapDialog : public wxutil::Dialog { private: IDialog::Handle _pathEntry; public: FixupMapDialog(); std::string getFixupFilePath(); static void RunDialog(const cmd::ArgumentList& args); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.editing/Makefile.am000066400000000000000000000014011245424655700214500ustar00rootroot00000000000000AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs \ $(XML_CFLAGS) pluginsdir = $(pkglibdir)/plugins plugins_LTLIBRARIES = dm_editing.la dm_editing_la_LIBADD = $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la dm_editing_la_LDFLAGS = -module -avoid-version \ $(WX_LIBS) $(XML_LIBS) $(BOOST_REGEX_LIBS) dm_editing_la_SOURCES = plugin.cpp \ AIHeadPropertyEditor.cpp \ AIEditingPanel.cpp \ FixupMap.cpp \ FixupMapDialog.cpp \ AIVocalSetChooserDialog.cpp \ AIVocalSetPropertyEditor.cpp \ AIVocalSetPreview.cpp \ AIHeadChooserDialog.cpp DarkRadiant-2.0.2/plugins/dm.editing/Makefile.in000066400000000000000000000604401245424655700214710ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/dm.editing DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pluginsdir)" LTLIBRARIES = $(plugins_LTLIBRARIES) dm_editing_la_DEPENDENCIES = $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la am_dm_editing_la_OBJECTS = plugin.lo AIHeadPropertyEditor.lo \ AIEditingPanel.lo FixupMap.lo FixupMapDialog.lo \ AIVocalSetChooserDialog.lo AIVocalSetPropertyEditor.lo \ AIVocalSetPreview.lo AIHeadChooserDialog.lo dm_editing_la_OBJECTS = $(am_dm_editing_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = dm_editing_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(dm_editing_la_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(dm_editing_la_SOURCES) DIST_SOURCES = $(dm_editing_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs \ $(XML_CFLAGS) pluginsdir = $(pkglibdir)/plugins plugins_LTLIBRARIES = dm_editing.la dm_editing_la_LIBADD = $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la dm_editing_la_LDFLAGS = -module -avoid-version \ $(WX_LIBS) $(XML_LIBS) $(BOOST_REGEX_LIBS) dm_editing_la_SOURCES = plugin.cpp \ AIHeadPropertyEditor.cpp \ AIEditingPanel.cpp \ FixupMap.cpp \ FixupMapDialog.cpp \ AIVocalSetChooserDialog.cpp \ AIVocalSetPropertyEditor.cpp \ AIVocalSetPreview.cpp \ AIHeadChooserDialog.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/dm.editing/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/dm.editing/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginsLTLIBRARIES: $(plugins_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(plugins_LTLIBRARIES)'; test -n "$(pluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pluginsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pluginsdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pluginsdir)"; \ } uninstall-pluginsLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugins_LTLIBRARIES)'; test -n "$(pluginsdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pluginsdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pluginsdir)/$$f"; \ done clean-pluginsLTLIBRARIES: -test -z "$(plugins_LTLIBRARIES)" || rm -f $(plugins_LTLIBRARIES) @list='$(plugins_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } dm_editing.la: $(dm_editing_la_OBJECTS) $(dm_editing_la_DEPENDENCIES) $(EXTRA_dm_editing_la_DEPENDENCIES) $(AM_V_CXXLD)$(dm_editing_la_LINK) -rpath $(pluginsdir) $(dm_editing_la_OBJECTS) $(dm_editing_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AIEditingPanel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AIHeadChooserDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AIHeadPropertyEditor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AIVocalSetChooserDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AIVocalSetPreview.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AIVocalSetPropertyEditor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FixupMap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FixupMapDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pluginsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginsLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginsLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginsLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginsLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pluginsLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pluginsLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/plugins/dm.editing/ShaderReplacer.h000066400000000000000000000021601245424655700224540ustar00rootroot00000000000000#ifndef _SHADER_REPLACER_H_ #define _SHADER_REPLACER_H_ #include "inode.h" #include "ipatch.h" #include "ibrush.h" class ShaderReplacer : public scene::NodeVisitor { std::string _oldShader; std::string _newShader; std::size_t _count; public: ShaderReplacer(const std::string& oldShader, const std::string& newShader) : _oldShader(oldShader), _newShader(newShader), _count(0) {} bool pre(const scene::INodePtr& node) { // Check for patch IPatchNodePtr patchNode = std::dynamic_pointer_cast(node); if (patchNode != NULL) { if (patchNode->getPatch().getShader() == _oldShader) { patchNode->getPatch().setShader(_newShader); _count++; } } else { // Check for brush IBrush* brush = Node_getIBrush(node); if (brush != NULL) { for (std::size_t i = 0; i < brush->getNumFaces(); ++i) { IFace& face = brush->getFace(i); if (face.getShader() == _oldShader) { face.setShader(_newShader); _count++; } } } } return true; } std::size_t getReplaceCount() const { return _count; } }; #endif /* _SHADER_REPLACER_H_ */ DarkRadiant-2.0.2/plugins/dm.editing/SpawnargLinkedCheckbox.h000066400000000000000000000045651245424655700241630ustar00rootroot00000000000000#pragma once #include "iundo.h" #include "ieclass.h" #include "ientity.h" #include namespace ui { /** * An enhanced checkbox that is updating the named * entity property (spawnarg) when toggled. * * The logic toggled = "1" can be optionally inversed such that * an unchecked box reflects a property value of "1". */ class SpawnargLinkedCheckbox : public wxCheckBox { private: bool _inverseLogic; std::string _propertyName; Entity* _entity; bool _updateLock; bool _defaultValueForMissingKeyValue; public: SpawnargLinkedCheckbox(wxWindow* parent, const std::string& label, const std::string& propertyName, bool inverseLogic = false) : wxCheckBox(parent, wxID_ANY, label), _inverseLogic(inverseLogic), _propertyName(propertyName), _entity(NULL), _updateLock(false), _defaultValueForMissingKeyValue(false) { Connect(wxEVT_CHECKBOX, wxCommandEventHandler(SpawnargLinkedCheckbox::onToggle), NULL, this); } void setDefaultValueForMissingKeyValue(bool defaultValue) { _defaultValueForMissingKeyValue = defaultValue; } // Sets the edited Entity object void setEntity(Entity* entity) { _entity = entity; if (_entity == NULL) { SetToolTip(""); return; } SetToolTip(_propertyName + ": " + _entity->getEntityClass()->getAttribute(_propertyName).getDescription()); std::string keyValue = _entity->getKeyValue(_propertyName); bool value = _entity->getKeyValue(_propertyName) == "1"; // Missing spawnargs (value is empty) get the default value assigned if (keyValue.empty()) { value = _defaultValueForMissingKeyValue; } _updateLock = true; SetValue(_inverseLogic ? !value : value); _updateLock = false; } protected: void onToggle(wxCommandEvent& ev) { ev.Skip(); // Update the spawnarg if we have a valid entity if (!_updateLock && _entity != NULL) { UndoableCommand cmd("editAIProperties"); std::string newValue = ""; if (_inverseLogic) { newValue = GetValue() ? "0" : "1"; // Active => "0" } else { newValue = GetValue() ? "1" : "0"; } // Check if the new value conincides with an inherited one if (_entity->getEntityClass()->getAttribute(_propertyName).getValue() == newValue) { // in which case the property just gets removed from the entity newValue = ""; } _entity->setKeyValue(_propertyName, newValue); } } }; } // namespace DarkRadiant-2.0.2/plugins/dm.editing/SpawnargLinkedSpinButton.h000066400000000000000000000055251245424655700245370ustar00rootroot00000000000000#pragma once #include "iundo.h" #include "ieclass.h" #include "ientity.h" #include "string/convert.h" #include "util/ScopedBoolLock.h" #include #include #include #include namespace ui { /** * An enhanced spin button that is updating the named * entity property (spawnarg) when toggled. * * Due to some weird bug that prevented the wxSpinCtrlDouble * to be rendered with a wxScrolledWindow as immediate parent, * I had to work around it by putting the wxSpinCtrlDouble into * a parent wxPanel first. */ class SpawnargLinkedSpinButton : public wxPanel { private: wxSpinCtrlDouble* _spinCtrl; std::string _label; std::string _propertyName; Entity* _entity; bool _updateLock; public: SpawnargLinkedSpinButton(wxWindow* parent, const std::string& label, const std::string& propertyName, double min, double max, double increment = 1, unsigned int digits = 0) : wxPanel(parent, wxID_ANY), _spinCtrl(new wxSpinCtrlDouble(this, wxID_ANY)), _label(label), _propertyName(propertyName), _entity(NULL), _updateLock(false) { this->SetSizer(new wxBoxSizer(wxHORIZONTAL)); this->GetSizer()->Add(_spinCtrl, 1, wxEXPAND); _spinCtrl->SetIncrement(increment); _spinCtrl->SetRange(min, max); _spinCtrl->SetDigits(digits); // 6 chars wide _spinCtrl->SetMaxSize(wxSize(GetCharWidth() * 9, -1)); _spinCtrl->Connect(wxEVT_SPINCTRLDOUBLE, wxSpinDoubleEventHandler(SpawnargLinkedSpinButton::onSpinButtonChanged), NULL, this); } const std::string& getLabel() const { return _label; } // Sets the edited Entity object void setEntity(Entity* entity) { _entity = entity; if (_entity == NULL) { SetToolTip(""); return; } SetToolTip(_propertyName + ": " + _entity->getEntityClass()->getAttribute(_propertyName).getDescription()); if (_updateLock) return; util::ScopedBoolLock lock(_updateLock); _spinCtrl->SetValue(string::convert(_entity->getKeyValue(_propertyName))); } protected: void onSpinButtonChanged(wxSpinDoubleEvent& ev) { ev.Skip(); // Update the spawnarg if we have a valid entity if (!_updateLock && _entity != NULL) { util::ScopedBoolLock lock(_updateLock); UndoableCommand cmd("editAIProperties"); double floatVal = _spinCtrl->GetValue(); std::string newValue = (boost::format("%." + string::to_string(_spinCtrl->GetDigits()) + "f") % floatVal).str(); // Check if the new value conincides with an inherited one const EntityClassAttribute& attr = _entity->getEntityClass()->getAttribute(_propertyName); if (!attr.getValue().empty() && string::to_float(attr.getValue()) == floatVal) { // in which case the property just gets removed from the entity newValue = ""; } _entity->setKeyValue(_propertyName, newValue); } } }; } // namespace DarkRadiant-2.0.2/plugins/dm.editing/SpawnargReplacer.h000066400000000000000000000042521245424655700230340ustar00rootroot00000000000000#ifndef _SPAWNARG_REPLACER_H_ #define _SPAWNARG_REPLACER_H_ #include "inode.h" #include "entitylib.h" class SpawnargReplacer : public scene::NodeVisitor, public Entity::Visitor { std::string _oldVal; std::string _newVal; std::size_t _modelCount; std::size_t _otherCount; std::size_t _eclassCount; // A list of keys to be replaced typedef std::vector KeyList; typedef std::map EntityKeyMap; EntityKeyMap _entityMap; KeyList _curKeys; public: SpawnargReplacer(const std::string& oldVal, const std::string& newVal) : _oldVal(oldVal), _newVal(newVal), _modelCount(0), _otherCount(0), _eclassCount(0) {} bool pre(const scene::INodePtr& node) { Entity* ent = Node_getEntity(node); if (ent != NULL) { _curKeys.clear(); // Traverse the entity's spawnargs to check for keys to be replaced ent->forEachKeyValue(*this); // Save the result of the spawnarg search if (!_curKeys.empty()) { _entityMap[node] = _curKeys; } _curKeys.clear(); } return false; } // Entity::Visitor void visit(const std::string& key, const std::string& value) { if (value == _oldVal) { // Matching value, remember this key _curKeys.push_back(key); } } void processEntities() { for (EntityKeyMap::const_iterator e = _entityMap.begin(); e != _entityMap.end(); ++e) { const scene::INodePtr& ent = e->first; const KeyList& keys = e->second; for (KeyList::const_iterator i = keys.begin(); i != keys.end(); ++i) { // We have a match, check which key is affected if (*i == "classname") { // Classname change changeEntityClassname(ent, _newVal); _eclassCount++; } else { Entity* entity = Node_getEntity(ent); assert(entity != NULL); entity->setKeyValue(*i, _newVal); if (*i == "model") { _modelCount++; } else { _otherCount++; } } } } _entityMap.clear(); } std::size_t getModelCount() const { return _modelCount; } std::size_t getOtherCount() const { return _otherCount; } std::size_t getEclassCount() const { return _eclassCount; } }; #endif /* _SPAWNARG_REPLACER_H_ */ DarkRadiant-2.0.2/plugins/dm.editing/dm.editing.def000066400000000000000000000001751245424655700221250ustar00rootroot00000000000000; dm.editing.def : Declares the module parameters for the DLL. EXPORTS ; Explicit exports can go here RegisterModule @1 DarkRadiant-2.0.2/plugins/dm.editing/plugin.cpp000066400000000000000000000053731245424655700214320ustar00rootroot00000000000000#include "imodule.h" #include "i18n.h" #include "ieventmanager.h" #include "iradiant.h" #include "iuimanager.h" #include "iselection.h" #include "ientityinspector.h" #include "icommandsystem.h" #include "itextstream.h" #include "imainframe.h" #include "debugging/debugging.h" #include "AIHeadPropertyEditor.h" #include "AIVocalSetPropertyEditor.h" #include "FixupMapDialog.h" #include "AIEditingPanel.h" class EditingModule : public RegisterableModule { public: // RegisterableModule implementation virtual const std::string& getName() const { static std::string _name("DarkMod Editing"); return _name; } virtual const StringSet& getDependencies() const { static StringSet _dependencies; if (_dependencies.empty()) { _dependencies.insert(MODULE_ENTITYINSPECTOR); _dependencies.insert(MODULE_EVENTMANAGER); _dependencies.insert(MODULE_UIMANAGER); _dependencies.insert(MODULE_SELECTIONSYSTEM); _dependencies.insert(MODULE_COMMANDSYSTEM); _dependencies.insert(MODULE_MAINFRAME); _dependencies.insert(MODULE_RADIANT); } return _dependencies; } virtual void initialiseModule(const ApplicationContext& ctx) { rMessage() << getName() << "::initialiseModule called." << std::endl; // Associated "def_head" with an empty property editor instance GlobalEntityInspector().registerPropertyEditor( ui::DEF_HEAD_KEY, ui::IPropertyEditorPtr(new ui::AIHeadPropertyEditor()) ); GlobalEntityInspector().registerPropertyEditor( ui::DEF_VOCAL_SET_KEY, ui::IPropertyEditorPtr(new ui::AIVocalSetPropertyEditor()) ); GlobalCommandSystem().addCommand("FixupMapDialog", ui::FixupMapDialog::RunDialog); GlobalEventManager().addCommand("FixupMapDialog", "FixupMapDialog"); GlobalUIManager().getMenuManager().add("main/map", "FixupMapDialog", ui::menuItem, _("Fixup Map..."), // caption "", // icon "FixupMapDialog" ); GlobalRadiant().signal_radiantStarted().connect( sigc::ptr_fun(ui::AIEditingPanel::onRadiantStartup) ); } void shutdownModule() { ui::AIEditingPanel::Shutdown(); // Remove associated property keys GlobalEntityInspector().unregisterPropertyEditor(ui::DEF_VOCAL_SET_KEY); GlobalEntityInspector().unregisterPropertyEditor(ui::DEF_HEAD_KEY); } }; typedef std::shared_ptr EditingModulePtr; extern "C" void DARKRADIANT_DLLEXPORT RegisterModule(IModuleRegistry& registry) { registry.registerModule(EditingModulePtr(new EditingModule)); // Initialise the streams using the given application context module::initialiseStreams(registry.getApplicationContext()); // Remember the reference to the ModuleRegistry module::RegistryReference::Instance().setRegistry(registry); // Set up the assertion handler GlobalErrorHandler() = registry.getApplicationContext().getErrorHandlingFunction(); } DarkRadiant-2.0.2/plugins/dm.gui/000077500000000000000000000000001245424655700165615ustar00rootroot00000000000000DarkRadiant-2.0.2/plugins/dm.gui/GuiSelector.cpp000066400000000000000000000122631245424655700215160ustar00rootroot00000000000000#include "GuiSelector.h" #include "wxutil/VFSTreePopulator.h" #include "i18n.h" #include "imainframe.h" #include "iuimanager.h" #include "gui/GuiManager.h" #include "wxutil/dialog/MessageBox.h" #include "ReadablePopulator.h" #include "ReadableEditorDialog.h" #include #include namespace ui { namespace { const char* const WINDOW_TITLE = N_("Choose a Gui Definition..."); const int WINDOW_WIDTH = 400; const int WINDOW_HEIGHT = 500; const char* const GUI_ICON = "sr_icon_readable.png"; const char* const FOLDER_ICON = "folder16.png"; } GuiSelector::GuiSelector(bool twoSided, ReadableEditorDialog* editorDialog) : DialogBase(_(WINDOW_TITLE), editorDialog), _editorDialog(editorDialog), _notebook(NULL), _oneSidedStore(new wxutil::TreeModel(_columns)), _twoSidedStore(new wxutil::TreeModel(_columns)), _oneSidedView(NULL), _twoSidedView(NULL) { _guiIcon.CopyFromBitmap(wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + GUI_ICON)); _folderIcon.CopyFromBitmap(wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + FOLDER_ICON)); // Set the windowsize and default border width in accordance to the HIG SetSize(WINDOW_WIDTH, WINDOW_HEIGHT); populateWindow(); // Set the current page and connect the switch-page signal afterwards. _notebook->SetSelection(twoSided ? 1 : 0); _notebook->Connect(wxEVT_NOTEBOOK_PAGE_CHANGED, wxBookCtrlEventHandler(GuiSelector::onPageSwitch), NULL, this); // We start with an empty selection, so de-sensitise the OK button FindWindowById(wxID_OK, this)->Enable(false); } std::string GuiSelector::Run(bool twoSided, ReadableEditorDialog* editorDialog) { GuiSelector* dialog = new GuiSelector(twoSided, editorDialog); std::string rv = ""; try { dialog->fillTrees(); // may throw OperationAbortedException if (dialog->ShowModal() == wxID_OK) { rv = "guis/" + dialog->_name; } } catch (wxutil::ModalProgressDialog::OperationAbortedException&) { rv = ""; } dialog->Destroy(); return rv; } void GuiSelector::visit(wxutil::TreeModel& /* store */, wxutil::TreeModel::Row& row, const std::string& path, bool isExplicit) { // Get the display name by stripping off everything before the last // slash std::string displayName = path.substr(path.rfind("/") + 1); displayName = displayName.substr(0,displayName.rfind(".")); // Fill in the column values row[_columns.name] = wxVariant(wxDataViewIconText(displayName, isExplicit ? _guiIcon : _folderIcon)); row[_columns.fullName] = path; row[_columns.isFolder] = !isExplicit; row.SendItemAdded(); } void GuiSelector::fillTrees() { wxutil::VFSTreePopulator popOne(_oneSidedStore); wxutil::VFSTreePopulator popTwo(_twoSidedStore); ReadablePopulator walker(popOne, popTwo); gui::GuiManager::Instance().foreachGui(walker); popOne.forEachNode(*this); popTwo.forEachNode(*this); _oneSidedStore->SortModelFoldersFirst(_columns.name, _columns.isFolder); _twoSidedStore->SortModelFoldersFirst(_columns.name, _columns.isFolder); _oneSidedView->AssociateModel(_oneSidedStore.get()); _twoSidedView->AssociateModel(_twoSidedStore.get()); } void GuiSelector::populateWindow() { // Add a vbox for the dialog elements SetSizer(new wxBoxSizer(wxVERTICAL)); // Add a vbox for the dialog elements wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); GetSizer()->Add(vbox, 1, wxEXPAND | wxALL, 12); // Create the tabs _notebook = new wxNotebook(this, wxID_ANY); // One-Sided Readables Tab _oneSidedView = wxutil::TreeView::Create(_notebook, wxDV_NO_HEADER); _oneSidedView->AppendIconTextColumn(_("Gui Path"), _columns.name.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); _oneSidedView->Connect(wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(GuiSelector::onSelectionChanged), NULL, this); _notebook->AddPage(_oneSidedView, _("One-Sided Readable Guis")); // Two-Sided Readables Tab _twoSidedView = wxutil::TreeView::Create(_notebook, wxDV_NO_HEADER); _twoSidedView->AppendIconTextColumn(_("Gui Path"), _columns.name.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); _twoSidedView->Connect(wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(GuiSelector::onSelectionChanged), NULL, this); _notebook->AddPage(_twoSidedView, _("Two-Sided Readable Guis")); // Packing vbox->Add(_notebook, 1, wxEXPAND | wxBOTTOM, 6); vbox->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxALIGN_RIGHT); } void GuiSelector::onPageSwitch(wxBookCtrlEvent& ev) { if (ev.GetSelection() == 0) { _editorDialog->useOneSidedEditing(); } else { _editorDialog->useTwoSidedEditing(); } } void GuiSelector::onSelectionChanged(wxDataViewEvent& ev) { wxutil::TreeView* view = dynamic_cast(ev.GetEventObject()); assert(view != NULL); wxDataViewItem item = view->GetSelection(); if (item.IsOk()) { wxutil::TreeModel::Row row(item, *view->GetModel()); if (!row[_columns.isFolder].getBool()) { _name = row[_columns.fullName]; std::string guiPath = "guis/" + _name; _editorDialog->updateGuiView(this, guiPath); FindWindowById(wxID_OK, this)->Enable(true); return; } } FindWindowById(wxID_OK, this)->Enable(false); } } // namespace DarkRadiant-2.0.2/plugins/dm.gui/GuiSelector.h000066400000000000000000000040541245424655700211620ustar00rootroot00000000000000#pragma once #include "wxutil/dialog/DialogBase.h" #include "wxutil/VFSTreePopulator.h" #include "wxutil/TreeView.h" class wxNotebook; class wxBookCtrlEvent; namespace ui { // Forward decl. class ReadableEditorDialog; ///////////////////////////// XDataSelector: // Selector-Dialog for TwoSided and OneSided readable guis. Switching the pages of the notebook // also toggles the according editing mode on the ReadableEditorDialog (TwoSided or OneSided). // Selecting a gui definition updates the guiView for previewing. class GuiSelector : public wxutil::DialogBase, public wxutil::VFSTreePopulator::Visitor { public: // Treestore enum struct GuiTreeModelColumns : public wxutil::TreeModel::ColumnRecord { GuiTreeModelColumns() : name(add(wxutil::TreeModel::Column::IconText)), fullName(add(wxutil::TreeModel::Column::String)), isFolder(add(wxutil::TreeModel::Column::Boolean)) {} wxutil::TreeModel::Column name; wxutil::TreeModel::Column fullName; wxutil::TreeModel::Column isFolder; }; private: // Reference to the calling ReadableEditorDialog ReadableEditorDialog* _editorDialog; // The name that was picked. std::string _name; // The notebook holding the tabs for one-sided and two-sided readables. wxNotebook* _notebook; GuiTreeModelColumns _columns; wxutil::TreeModel::Ptr _oneSidedStore; wxutil::TreeModel::Ptr _twoSidedStore; wxutil::TreeView* _oneSidedView; wxutil::TreeView* _twoSidedView; wxIcon _guiIcon; wxIcon _folderIcon; public: // Starts the GuiSelector and returns the name of the selected GUI or an empty string if the user canceled. // The dialog shows the twoSided treeview if twoSided is true. static std::string Run(bool twoSided, ReadableEditorDialog* editorDialog); void visit(wxutil::TreeModel& store, wxutil::TreeModel::Row& row, const std::string& path, bool isExplicit); private: GuiSelector(bool twoSided, ReadableEditorDialog* editorDialog); void fillTrees(); void populateWindow(); void onSelectionChanged(wxDataViewEvent& ev); void onPageSwitch(wxBookCtrlEvent& ev); }; } // namespace DarkRadiant-2.0.2/plugins/dm.gui/Makefile.am000066400000000000000000000022101245424655700206100ustar00rootroot00000000000000AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs \ $(XML_CFLAGS) pluginsdir = $(pkglibdir)/plugins plugins_LTLIBRARIES = dm_gui.la dm_gui_la_LIBADD = $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la dm_gui_la_LDFLAGS = -module -avoid-version \ $(WX_LIBS) \ $(XML_LIBS) \ $(GLEW_LIBS) \ $(GL_LIBS) \ $(BOOST_SYSTEM_LIBS) \ $(BOOST_FILESYSTEM_LIBS) dm_gui_la_SOURCES = GuiSelector.cpp \ plugin.cpp \ ReadableEditorDialog.cpp \ ReadableGuiView.cpp \ XData.cpp \ XDataLoader.cpp \ XDataSelector.cpp \ XdFileChooserDialog.cpp \ gui/Gui.cpp \ gui/GuiManager.cpp \ gui/GuiRenderer.cpp \ gui/GuiScript.cpp \ gui/GuiView.cpp \ gui/GuiWindowDef.cpp \ gui/RenderableCharacterBatch.cpp \ gui/RenderableText.cpp \ gui/Variable.cpp DarkRadiant-2.0.2/plugins/dm.gui/Makefile.in000066400000000000000000000644241245424655700206400ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins/dm.gui DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/boost.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pluginsdir)" LTLIBRARIES = $(plugins_LTLIBRARIES) dm_gui_la_DEPENDENCIES = $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la am__dirstamp = $(am__leading_dot)dirstamp am_dm_gui_la_OBJECTS = GuiSelector.lo plugin.lo \ ReadableEditorDialog.lo ReadableGuiView.lo XData.lo \ XDataLoader.lo XDataSelector.lo XdFileChooserDialog.lo \ gui/Gui.lo gui/GuiManager.lo gui/GuiRenderer.lo \ gui/GuiScript.lo gui/GuiView.lo gui/GuiWindowDef.lo \ gui/RenderableCharacterBatch.lo gui/RenderableText.lo \ gui/Variable.lo dm_gui_la_OBJECTS = $(am_dm_gui_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = dm_gui_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(dm_gui_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(dm_gui_la_SOURCES) DIST_SOURCES = $(dm_gui_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALUT_LIBS = @ALUT_LIBS@ AL_LIBS = @AL_LIBS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LDFLAGS = @BOOST_FILESYSTEM_LDFLAGS@ BOOST_FILESYSTEM_LDPATH = @BOOST_FILESYSTEM_LDPATH@ BOOST_FILESYSTEM_LIBS = @BOOST_FILESYSTEM_LIBS@ BOOST_LDPATH = @BOOST_LDPATH@ BOOST_PYTHON_CPPFLAGS = @BOOST_PYTHON_CPPFLAGS@ BOOST_PYTHON_LDFLAGS = @BOOST_PYTHON_LDFLAGS@ BOOST_PYTHON_LDPATH = @BOOST_PYTHON_LDPATH@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ BOOST_REGEX_LDFLAGS = @BOOST_REGEX_LDFLAGS@ BOOST_REGEX_LDPATH = @BOOST_REGEX_LDPATH@ BOOST_REGEX_LIBS = @BOOST_REGEX_LIBS@ BOOST_ROOT = @BOOST_ROOT@ BOOST_SYSTEM_LDFLAGS = @BOOST_SYSTEM_LDFLAGS@ BOOST_SYSTEM_LDPATH = @BOOST_SYSTEM_LDPATH@ BOOST_SYSTEM_LIBS = @BOOST_SYSTEM_LIBS@ BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS = @BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS@ BOOST_UNIT_TEST_FRAMEWORK_LDPATH = @BOOST_UNIT_TEST_FRAMEWORK_LDPATH@ BOOST_UNIT_TEST_FRAMEWORK_LIBS = @BOOST_UNIT_TEST_FRAMEWORK_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GLEW_LIBS = @GLEW_LIBS@ GLU_LIBS = @GLU_LIBS@ GL_LIBS = @GL_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIGC_CFLAGS = @LIBSIGC_CFLAGS@ LIBSIGC_LIBS = @LIBSIGC_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ POSUB = @POSUB@ PYTHON_CONFIG = @PYTHON_CONFIG@ PYTHON_LIBS = @PYTHON_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ VORBIS_LIBS = @VORBIS_LIBS@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ Z_LIBS = @Z_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ conv_plugin = @conv_plugin@ datadir = @datadir@ datarootdir = @datarootdir@ difficulty_plugin = @difficulty_plugin@ docdir = @docdir@ dvidir = @dvidir@ editing_plugin = @editing_plugin@ exec_prefix = @exec_prefix@ gui_plugin = @gui_plugin@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ obj_plugin = @obj_plugin@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ script_module = @script_module@ sharedstatedir = @sharedstatedir@ sound_module = @sound_module@ sr_plugin = @sr_plugin@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs \ $(XML_CFLAGS) pluginsdir = $(pkglibdir)/plugins plugins_LTLIBRARIES = dm_gui.la dm_gui_la_LIBADD = $(top_builddir)/libs/wxutil/libwxutil.la \ $(top_builddir)/libs/xmlutil/libxmlutil.la dm_gui_la_LDFLAGS = -module -avoid-version \ $(WX_LIBS) \ $(XML_LIBS) \ $(GLEW_LIBS) \ $(GL_LIBS) \ $(BOOST_SYSTEM_LIBS) \ $(BOOST_FILESYSTEM_LIBS) dm_gui_la_SOURCES = GuiSelector.cpp \ plugin.cpp \ ReadableEditorDialog.cpp \ ReadableGuiView.cpp \ XData.cpp \ XDataLoader.cpp \ XDataSelector.cpp \ XdFileChooserDialog.cpp \ gui/Gui.cpp \ gui/GuiManager.cpp \ gui/GuiRenderer.cpp \ gui/GuiScript.cpp \ gui/GuiView.cpp \ gui/GuiWindowDef.cpp \ gui/RenderableCharacterBatch.cpp \ gui/RenderableText.cpp \ gui/Variable.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/dm.gui/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign plugins/dm.gui/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pluginsLTLIBRARIES: $(plugins_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(plugins_LTLIBRARIES)'; test -n "$(pluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pluginsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pluginsdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pluginsdir)"; \ } uninstall-pluginsLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugins_LTLIBRARIES)'; test -n "$(pluginsdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pluginsdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pluginsdir)/$$f"; \ done clean-pluginsLTLIBRARIES: -test -z "$(plugins_LTLIBRARIES)" || rm -f $(plugins_LTLIBRARIES) @list='$(plugins_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } gui/$(am__dirstamp): @$(MKDIR_P) gui @: > gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) gui/$(DEPDIR) @: > gui/$(DEPDIR)/$(am__dirstamp) gui/Gui.lo: gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp) gui/GuiManager.lo: gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp) gui/GuiRenderer.lo: gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp) gui/GuiScript.lo: gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp) gui/GuiView.lo: gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp) gui/GuiWindowDef.lo: gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp) gui/RenderableCharacterBatch.lo: gui/$(am__dirstamp) \ gui/$(DEPDIR)/$(am__dirstamp) gui/RenderableText.lo: gui/$(am__dirstamp) \ gui/$(DEPDIR)/$(am__dirstamp) gui/Variable.lo: gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp) dm_gui.la: $(dm_gui_la_OBJECTS) $(dm_gui_la_DEPENDENCIES) $(EXTRA_dm_gui_la_DEPENDENCIES) $(AM_V_CXXLD)$(dm_gui_la_LINK) -rpath $(pluginsdir) $(dm_gui_la_OBJECTS) $(dm_gui_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f gui/*.$(OBJEXT) -rm -f gui/*.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GuiSelector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ReadableEditorDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ReadableGuiView.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XData.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XDataLoader.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XDataSelector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XdFileChooserDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/Gui.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/GuiManager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/GuiRenderer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/GuiScript.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/GuiView.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/GuiWindowDef.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/RenderableCharacterBatch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/RenderableText.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/Variable.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf gui/.libs gui/_libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pluginsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f gui/$(DEPDIR)/$(am__dirstamp) -rm -f gui/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginsLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) gui/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginsLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) gui/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginsLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginsLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pluginsLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pluginsLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: DarkRadiant-2.0.2/plugins/dm.gui/ReadableEditorDialog.cpp000066400000000000000000001330231245424655700232550ustar00rootroot00000000000000// Project related #include "ReadableEditorDialog.h" #include "XdFileChooserDialog.h" #include "XDataSelector.h" #include "GuiSelector.h" #include "gui/GuiManager.h" #include "TextViewInfoDialog.h" #include "ReadableGuiView.h" // General #include "selectionlib.h" #include "wxutil/dialog/MessageBox.h" #include #include #include "registry/registry.h" #include "string/string.h" #include "i18n.h" #include "itextstream.h" // Modules #include "imainframe.h" #include "ientity.h" #include "imap.h" #include "igame.h" #include "idialogmanager.h" #include #include #include #include #include #include namespace ui { // consts: namespace { const char* const WINDOW_TITLE = N_("Readable Editor"); const char* const NO_ENTITY_ERROR = N_("Cannot run Readable Editor on this selection.\n" "Please select a single XData entity."); const char* const LABEL_PAGE_RELATED = N_("Page Editing:"); const char* const LABEL_GENERAL_PROPERTIES = N_("General Properties:"); enum MenuItemId { InsertWholePage = 1, InsertLeft, InsertRight, DeleteWholePage, DeleteLeft, DeleteRight, AppendPage, PrependPage, ShowXDataSummary, ShowDuplicatedDefs, ShowGuiImportSummary, }; } // namespace ////////////////////////////////////////////////////////////////////////////// // Public and protected methods: ReadableEditorDialog::ReadableEditorDialog(Entity* entity) : DialogBase(_(WINDOW_TITLE)), _guiView(NULL), _entity(entity), _xdLoader(new XData::XDataLoader()), _currentPageIndex(0), _xdNameSpecified(false), _runningGuiLayoutCheck(false), _runningXDataUniquenessCheck(false), _useDefaultFilename(true), _saveInProgress(false) { wxPanel* mainPanel = loadNamedPanel(this, "ReadableEditorMainPanel"); wxPanel* previewPanel = findNamedObject(this, "ReadableEditorPreviewPanel"); _guiView = new gui::ReadableGuiView(previewPanel); previewPanel->GetSizer()->Add(_guiView, 1, wxEXPAND); setupGeneralPropertiesInterface(); setupPageRelatedInterface(); setupButtonPanel(); createMenus(); mainPanel->Layout(); mainPanel->Fit(); Fit(); CenterOnParent(); } int ReadableEditorDialog::ShowModal() { // Load the initial values from the entity if (!initControlsFromEntity()) { // User clicked cancel, so destroy the window. return wxID_CANCEL; } // Initialize proper editing controls. populateControlsFromXData(); // Initialise the GL widget after the widgets have been shown _guiView->initialiseView(); return DialogBase::ShowModal(); } void ReadableEditorDialog::RunDialog(const cmd::ArgumentList& args) { // Check prerequisites const SelectionInfo& info = GlobalSelectionSystem().getSelectionInfo(); if (info.entityCount == 1 && info.totalCount == info.entityCount) { // Check the entity type Entity* entity = Node_getEntity(GlobalSelectionSystem().ultimateSelected()); if (entity != NULL && entity->getKeyValue("editor_readable") == "1") { // Show the dialog ReadableEditorDialog* dialog = new ReadableEditorDialog(entity); dialog->ShowModal(); dialog->Destroy(); return; } } // Exactly one redable entity must be selected. wxutil::Messagebox::ShowError(_(NO_ENTITY_ERROR)); } // UI Creation void ReadableEditorDialog::setupGeneralPropertiesInterface() { makeLabelBold(this, "ReadableEditorGeneralLabel"); makeLabelBold(this, "ReadableEditorPageLabel"); // Readable Name _nameEntry = findNamedObject(this, "ReadableEditorInventoryName"); _nameEntry->Connect(wxEVT_CHAR, wxKeyEventHandler(ReadableEditorDialog::onChar), NULL, this); // XData Name _xDataNameEntry = findNamedObject(this, "ReadableEditorXDataName"); _xDataNameEntry->Connect(wxEVT_CHAR, wxKeyEventHandler(ReadableEditorDialog::onChar), NULL, this); _xDataNameEntry->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(ReadableEditorDialog::onFocusOut), NULL, this); // Add a browse-button. findNamedObject(this, "ReadableEditorXDBrowseButton")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onBrowseXd), NULL, this); // Page count _numPages = findNamedObject(this, "ReadableEditorNumPages"); _numPages->SetRange(1, 20); _numPages->Connect(wxEVT_SPINCTRL, wxSpinEventHandler(ReadableEditorDialog::onNumPagesChanged), NULL, this); _numPages->Connect(wxEVT_CHAR, wxKeyEventHandler(ReadableEditorDialog::onChar), NULL, this); // Page Layout: _oneSidedButton = findNamedObject(this, "ReadableEditorOneSided"); _oneSidedButton->Connect(wxEVT_RADIOBUTTON, wxCommandEventHandler(ReadableEditorDialog::onOneSided), NULL, this); _twoSidedButton = findNamedObject(this, "ReadableEditorTwoSided"); _twoSidedButton->Connect(wxEVT_RADIOBUTTON, wxCommandEventHandler(ReadableEditorDialog::onTwoSided), NULL, this); // Pageturn Sound _pageTurnEntry = findNamedObject(this, "ReadableEditorPageTurnSound"); } void ReadableEditorDialog::setupPageRelatedInterface() { // Insert Button findNamedObject(this, "ReadableEditorInsertPage")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onInsert), NULL, this); // Delete Button findNamedObject(this, "ReadableEditorDeletePage")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onDelete), NULL, this); // Page Switcher findNamedObject(this, "ReadableEditorGotoFirstPage")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onFirstPage), NULL, this); findNamedObject(this, "ReadableEditorGotoPreviousPage")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onPrevPage), NULL, this); findNamedObject(this, "ReadableEditorGotoNextPage")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onNextPage), NULL, this); findNamedObject(this, "ReadableEditorGotoLastPage")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onLastPage), NULL, this); _curPageDisplay = findNamedObject(this, "ReadableEditorCurPage"); // Add a gui chooser with a browse-button _guiEntry = findNamedObject(this, "ReadableEditorGuiDefinition"); _guiEntry->Connect(wxEVT_CHAR, wxKeyEventHandler(ReadableEditorDialog::onChar), NULL, this); _guiEntry->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(ReadableEditorDialog::onFocusOut), NULL, this); findNamedObject(this, "ReadableEditorGuiBrowseButton")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onBrowseGui), NULL, this); // Create "left" and "right" labels and add them to the first row of the table _pageLeftLabel = findNamedObject(this, "ReadableEditorPageLeftLabel"); _pageRightLabel = findNamedObject(this, "ReadableEditorPageRightLabel"); _textViewTitle = findNamedObject(this, "ReadableEditorTitleLeft"); _textViewTitle->Connect(wxEVT_TEXT, wxCommandEventHandler(ReadableEditorDialog::onTextChanged), NULL, this); _textViewRightTitle = findNamedObject(this, "ReadableEditorTitleRight"); _textViewRightTitle->Connect(wxEVT_TEXT, wxCommandEventHandler(ReadableEditorDialog::onTextChanged), NULL, this); // Create "body" label and body-textViews and add them to the third row of the table. Add the key-press-event. _textViewBody = findNamedObject(this, "ReadableEditorBodyLeft"); _textViewBody->Connect(wxEVT_TEXT, wxCommandEventHandler(ReadableEditorDialog::onTextChanged), NULL, this); _textViewRightBody = findNamedObject(this, "ReadableEditorBodyRight"); _textViewRightBody->Connect(wxEVT_TEXT, wxCommandEventHandler(ReadableEditorDialog::onTextChanged), NULL, this); } void ReadableEditorDialog::createMenus() { // Insert menu _insertMenu.reset(new wxMenu); _insertMenu->Append(InsertWholePage, _("Insert whole Page"), ""); _insertMenu->Append(InsertLeft, _("Insert on left Side"), ""); _insertMenu->Append(InsertRight, _("Insert on right Side"), ""); _insertMenu->Connect(wxEVT_MENU, wxCommandEventHandler(ReadableEditorDialog::onMenuItemClick), NULL, this); // Delete Menu _deleteMenu.reset(new wxMenu); _deleteMenu->Append(DeleteWholePage, _("Delete whole Page"), ""); _deleteMenu->Append(DeleteLeft, _("Delete on left Side"), ""); _deleteMenu->Append(DeleteRight, _("Delete on right Side"), ""); _deleteMenu->Connect(wxEVT_MENU, wxCommandEventHandler(ReadableEditorDialog::onMenuItemClick), NULL, this); // Append Menu _appendMenu.reset(new wxMenu); _appendMenu->Append(AppendPage, _("Append Page"), ""); _appendMenu->Connect(wxEVT_MENU, wxCommandEventHandler(ReadableEditorDialog::onMenuItemClick), NULL, this); // Prepend Menu _prependMenu.reset(new wxMenu); _prependMenu->Append(PrependPage, _("Prepend Page"), ""); _prependMenu->Connect(wxEVT_MENU, wxCommandEventHandler(ReadableEditorDialog::onMenuItemClick), NULL, this); // Tools Menu _toolsMenu.reset(new wxMenu); _toolsMenu->Append(ShowXDataSummary, _("Show last XData import summary"), ""); _toolsMenu->Append(ShowDuplicatedDefs, _("Show duplicated definitions"), ""); _toolsMenu->Append(ShowGuiImportSummary, _("Show Gui import summary"), ""); _toolsMenu->Connect(wxEVT_MENU, wxCommandEventHandler(ReadableEditorDialog::onMenuItemClick), NULL, this); } void ReadableEditorDialog::setupButtonPanel() { findNamedObject(this, "ReadableEditorSave")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onSave), NULL, this); findNamedObject(this, "ReadableEditorCancel")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onCancel), NULL, this); findNamedObject(this, "ReadableEditorSaveAndClose")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onSaveClose), NULL, this); findNamedObject(this, "ReadableEditorTools")->Connect(wxEVT_BUTTON, wxCommandEventHandler(ReadableEditorDialog::onToolsClicked), NULL, this); } ////////////////////////////////////////////////////////////////////////////// // Private Methods: bool ReadableEditorDialog::initControlsFromEntity() { // Inv_name _nameEntry->SetValue(_entity->getKeyValue("inv_name")); // Xdata contents _xDataNameEntry->SetValue(_entity->getKeyValue("xdata_contents")); // Construct the map-based Filename _mapBasedFilename = GlobalMapModule().getMapName(); std::size_t nameStartPos = _mapBasedFilename.rfind("/") + 1; if (nameStartPos != std::string::npos) { _mapBasedFilename = _mapBasedFilename.substr(nameStartPos, _mapBasedFilename.rfind(".") - nameStartPos); } std::string defaultXdName = "readables/" + _mapBasedFilename + "/" + _(""); _mapBasedFilename += ".xd"; // Load xdata if (!_entity->getKeyValue("xdata_contents").empty()) { _xdNameSpecified = true; try { int result = XdFileChooserDialog::Import( _entity->getKeyValue("xdata_contents"), _xData, _xdFilename, _xdLoader, this ); if (result == wxID_OK) { _useDefaultFilename = false; refreshWindowTitle(); return true; } return false; // cancelled } catch (XdFileChooserDialog::ImportFailedException&) { std::string msg = (boost::format(_("Failed to import %s.")) % _entity->getKeyValue("xdata_contents")).str(); msg += "\n"; msg += _("Creating a new XData definition..."); msg += "\n\n"; msg += _("Do you want to open the import summary?"); wxutil::Messagebox dialog(_("Import failed"), msg, ui::IDialog::MESSAGE_ASK, this); if (dialog.run() == ui::IDialog::RESULT_YES) { showXdImportSummary(); } updateGuiView(); } } //No Xdata definition was defined or failed to import. Use default filename and create a OneSidedXData-object if (_entity->getKeyValue("name").find("book") == std::string::npos) { if (!_xdNameSpecified) _xData.reset(new XData::OneSidedXData(defaultXdName)); else _xData.reset(new XData::OneSidedXData(_entity->getKeyValue("xdata_contents"))); } else { if (!_xdNameSpecified) _xData.reset(new XData::TwoSidedXData(defaultXdName)); else _xData.reset(new XData::OneSidedXData(_entity->getKeyValue("xdata_contents"))); } _xData->setNumPages(1); refreshWindowTitle(); return true; } bool ReadableEditorDialog::save() { _saveInProgress = true; // Name _entity->setKeyValue("inv_name", _nameEntry->GetValue().ToStdString()); // Xdata contents _entity->setKeyValue("xdata_contents", _xDataNameEntry->GetValue().ToStdString()); // Current content to XData Object storeXData(); // Get the storage path and check its validity std::string storagePath = constructStoragePath(); if (!_useDefaultFilename && !boost::filesystem::exists(storagePath)) { // The file does not exist, so we have imported a definition contained inside a PK4. wxutil::Messagebox::ShowError( _("You have imported an XData definition that is contained in a PK4, which can't be accessed for saving.") + std::string("\n\n") + _("Please rename your XData definition, so that it is stored under a different filename."), this ); _saveInProgress = false; return false; } // Start exporting XData::FileStatus fst = _xData->xport(storagePath, XData::Merge); if (fst == XData::DefinitionExists) { switch (_xData->xport( storagePath, XData::MergeOverwriteExisting)) { case XData::OpenFailed: wxutil::Messagebox::ShowError( (boost::format(_("Failed to open %s for saving.")) % _xdFilename).str(), this ); _saveInProgress = false; return false; case XData::MergeFailed: wxutil::Messagebox::ShowError( _("Merging failed, because the length of the definition to be overwritten could not be retrieved."), this ); _saveInProgress = false; return false; default: //success! _saveInProgress = false; return true; } } else if (fst == XData::OpenFailed) { wxutil::Messagebox::ShowError( (boost::format(_("Failed to open %s for saving.")) % _xdFilename).str(), this ); } _saveInProgress = false; return false; } std::string ReadableEditorDialog::constructStoragePath() { // Construct the storage path from Registry keys. std::string storagePath; if (_useDefaultFilename) { bool checkVFS = true; switch (registry::getValue(RKEY_READABLES_STORAGE_FOLDER)) { case 0: // Use Mod dir storagePath = GlobalGameManager().getModPath(); if (storagePath.empty()) { // Mod path not defined. Use base Path storagePath = GlobalRegistry().get(RKEY_ENGINE_PATH) + "base/"; wxutil::Messagebox::ShowError(_("Mod path not defined. Using Base path..."), this); } storagePath += XData::XDATA_DIR; break; case 1: // Use Mod Base dir storagePath = GlobalGameManager().getModBasePath(); if (storagePath.empty()) { // Mod Base Path not defined. Use Mod path or base path successively. storagePath = GlobalGameManager().getModPath(); if (storagePath.empty()) { storagePath = GlobalRegistry().get(RKEY_ENGINE_PATH) + "base/"; wxutil::Messagebox::ShowError(_("Mod Base path not defined, neither is Mod path. Using Engine path..."), this); storagePath += XData::XDATA_DIR; break; } wxutil::Messagebox::ShowError(_("Mod Base path not defined. Using Mod path..."), this); } storagePath += XData::XDATA_DIR; break; default: // Use custom folder storagePath = GlobalRegistry().get(RKEY_READABLES_CUSTOM_FOLDER); if (storagePath.empty()) { // Custom path not defined. Use Mod path or base path successively. storagePath = GlobalGameManager().getModPath(); if (storagePath.empty()) { storagePath = GlobalRegistry().get(RKEY_ENGINE_PATH) + "base/"; wxutil::Messagebox::ShowError(_("Mod Base path not defined, neither is Mod path. Using Engine path..."), this); storagePath += XData::XDATA_DIR; break; } storagePath += XData::XDATA_DIR; wxutil::Messagebox::ShowError(_("Mod Base path not defined. Using Mod path..."), this); break; } storagePath += "/" +_mapBasedFilename; checkVFS = false; break; } // Check whether this path already exists in the VFS in another absolute folder. If so, rename it! if (checkVFS) { std::string compPath = GlobalFileSystem().findFile(XData::XDATA_DIR + _mapBasedFilename); std::string newFileName = _mapBasedFilename; if (!compPath.empty()) // VFS-path does exist, now check whether it is in another absolute folder. { int fileIdx = 2; compPath += XData::XDATA_DIR + _mapBasedFilename; while ( (compPath.compare(storagePath + newFileName) != 0) ) { newFileName = _mapBasedFilename.substr(0, _mapBasedFilename.rfind(".")) + boost::lexical_cast(fileIdx++) + ".xd"; compPath = GlobalFileSystem().findFile(XData::XDATA_DIR + newFileName); if (compPath.empty()) { wxutil::Messagebox::ShowError( (boost::format(_("%s%s already exists in another path.\n\nXData will be stored in %s%s!")) % XData::XDATA_DIR % _mapBasedFilename % XData::XDATA_DIR % newFileName).str(), this ); break; } compPath += XData::XDATA_DIR + newFileName; } } storagePath += newFileName; } } else { // We are exporting a previously imported XData definition. Retrieve engine path and append _xdFilename storagePath = GlobalRegistry().get(RKEY_ENGINE_PATH) + _xdFilename; } return storagePath; } void ReadableEditorDialog::refreshWindowTitle() { std::string title = constructStoragePath(); title = title.substr( title.find_first_not_of( GlobalRegistry().get(RKEY_ENGINE_PATH) ) ); title = std::string(_("Readable Editor")) + " - " + title; SetTitle(title); } void ReadableEditorDialog::storeXData() { //NumPages does not need storing, because it's stored directly after changing it. _xData->setName(_xDataNameEntry->GetValue().ToStdString()); _xData->setSndPageTurn(_pageTurnEntry->GetValue().ToStdString()); storeCurrentPage(); } void ReadableEditorDialog::toggleTwoSidedEditingInterface(bool show) { if (show) { _textViewRightTitle->GetContainingSizer()->Show(_textViewRightTitle); _textViewRightBody->GetContainingSizer()->Show(_textViewRightBody); _pageLeftLabel->GetContainingSizer()->Show(_pageLeftLabel); _pageRightLabel->GetContainingSizer()->Show(_pageRightLabel); } else { _textViewRightTitle->GetContainingSizer()->Hide(_textViewRightTitle); _textViewRightBody->GetContainingSizer()->Hide(_textViewRightBody); _pageLeftLabel->GetContainingSizer()->Hide(_pageLeftLabel); _pageRightLabel->GetContainingSizer()->Hide(_pageRightLabel); } _textViewRightTitle->GetContainingSizer()->Layout(); } void ReadableEditorDialog::showPage(std::size_t pageIndex) { //Gui Def before: std::string guiBefore = _guiEntry->GetValue().ToStdString(); // Update CurrentPage Label _currentPageIndex = pageIndex; _curPageDisplay->SetLabel(string::to_string(pageIndex+1)); if (_xData->getPageLayout() == XData::TwoSided) { // Update Gui statement entry from xData if (!_xData->getGuiPage(pageIndex).empty()) { _guiEntry->SetValue(_xData->getGuiPage(pageIndex)); } else { _guiEntry->SetValue(XData::DEFAULT_TWOSIDED_GUI); } setTextViewAndScroll(_textViewRightTitle, _xData->getPageContent(XData::Title, pageIndex, XData::Right)); setTextViewAndScroll(_textViewRightBody, _xData->getPageContent(XData::Body, pageIndex, XData::Right)); } else { // Update Gui statement entry from xData if (!_xData->getGuiPage(pageIndex).empty()) { _guiEntry->SetValue(_xData->getGuiPage(pageIndex)); } else { _guiEntry->SetValue(XData::DEFAULT_ONESIDED_GUI); } } // Update page statements textviews from xData setTextViewAndScroll(_textViewTitle, _xData->getPageContent(XData::Title, pageIndex, XData::Left)); setTextViewAndScroll(_textViewBody, _xData->getPageContent(XData::Body, pageIndex, XData::Left)); // Update the GUI View if the gui changed. For the page contents, updateGuiView is called automatically // by onTextChange. if (guiBefore != _guiEntry->GetValue().ToStdString()) { updateGuiView(); } } void ReadableEditorDialog::updateGuiView(wxWindow* parent, const std::string& guiPath, const std::string& xDataName, const std::string& xDataPath) { // If the name of an xData object is passed it will be rendered instead of the current // xData object, to enable previewing of XData definitions induced by the XDataSelector. if (!xDataName.empty()) { XData::XDataPtr xd; XData::XDataMap xdMap; if (_xdLoader->importDef(xDataName, xdMap, xDataPath)) { xd = xdMap.begin()->second; _guiView->setGui(xd->getGuiPage(0)); } else { std::string msg = (boost::format(_("Failed to import %s.")) % xDataName).str(); msg += "\n\n"; msg += _("Do you want to open the import summary?"); wxutil::Messagebox dialog(_("Import failed"), msg, ui::IDialog::MESSAGE_ASK, parent ? parent : this ); if (dialog.run() == ui::IDialog::RESULT_YES) { showXdImportSummary(); } return; } const gui::GuiPtr& gui = _guiView->getGui(); if (gui == NULL) { std::string msg = (boost::format(_("Failed to load gui definition %s.")) % xd->getGuiPage(0)).str(); msg += "\n\n"; msg += _("Do you want to open the import summary?"); wxutil::Messagebox dialog(_("Import failed"), msg, ui::IDialog::MESSAGE_ASK, parent ? parent : this ); if (dialog.run() == ui::IDialog::RESULT_YES) { showGuiImportSummary(); } return; } // Load data from xdata into the GUI's state variables if (xd->getPageLayout() == XData::OneSided) { // One-sided has title and body gui->setStateString("title", xd->getPageContent(XData::Title, 0, XData::Left)); gui->setStateString("body", xd->getPageContent(XData::Body, 0, XData::Left)); } else { // Two-sided has four important state strings gui->setStateString("left_title", xd->getPageContent(XData::Title, 0, XData::Left)); gui->setStateString("left_body", xd->getPageContent(XData::Body, 0, XData::Left)); gui->setStateString("right_title", xd->getPageContent(XData::Title, 0, XData::Right)); gui->setStateString("right_body", xd->getPageContent(XData::Body, 0, XData::Right)); } // Initialise the time of this GUI gui->initTime(0); // Run the first frame gui->update(16); } else { if (guiPath.empty()) { _guiView->setGui(_guiEntry->GetValue().ToStdString()); } else { _guiView->setGui(guiPath); } const gui::GuiPtr& gui = _guiView->getGui(); if (gui == NULL) { std::string nameGui = guiPath.empty() ? _guiEntry->GetValue().ToStdString() : guiPath; std::string msg = (boost::format(_("Failed to load gui definition %s.")) % nameGui).str(); msg += "\n\n"; msg += _("Do you want to open the import summary?"); wxutil::Messagebox dialog(_("Import failed"), msg, ui::IDialog::MESSAGE_ASK, parent ? parent : this ); if (dialog.run() == ui::IDialog::RESULT_YES) { showGuiImportSummary(); } return; } // Load data from xdata into the GUI's state variables if (_xData->getPageLayout() == XData::OneSided) { // One-sided has title and body gui->setStateString("title", _textViewTitle->GetValue().ToStdString()); gui->setStateString("body", _textViewBody->GetValue().ToStdString()); } else { // Two-sided has four important state strings gui->setStateString("left_title", _textViewTitle->GetValue().ToStdString()); gui->setStateString("left_body", _textViewBody->GetValue().ToStdString()); gui->setStateString("right_title", _textViewRightTitle->GetValue().ToStdString()); gui->setStateString("right_body", _textViewRightBody->GetValue().ToStdString()); } // Initialise the time of this GUI gui->initTime(0); // Run the first frame gui->update(16); } _guiView->redraw(); } void ReadableEditorDialog::storeCurrentPage() { // Store the GUI-Page _xData->setGuiPage(_guiEntry->GetValue().ToStdString(), _currentPageIndex); // On OneSidedXData the Side-enum is discarded, so it's save to call this method _xData->setPageContent(XData::Title, _currentPageIndex, XData::Left, _textViewTitle->GetValue().ToStdString()); _xData->setPageContent(XData::Body, _currentPageIndex, XData::Left, _textViewBody->GetValue().ToStdString()); if (_xData->getPageLayout() == XData::TwoSided) { _xData->setPageContent(XData::Title, _currentPageIndex, XData::Right, _textViewRightTitle->GetValue().ToStdString()); _xData->setPageContent(XData::Body, _currentPageIndex, XData::Right, _textViewRightBody->GetValue().ToStdString()); } } void ReadableEditorDialog::populateControlsFromXData() { toggleTwoSidedEditingInterface(_xData->getPageLayout() == XData::TwoSided); showPage(0); _xDataNameEntry->SetValue(_xData->getName()); _numPages->SetValue(static_cast(_xData->getNumPages())); std::string sndString = _xData->getSndPageTurn(); _pageTurnEntry->SetValue( sndString.empty() ? XData::DEFAULT_SNDPAGETURN : sndString ); if (_xData->getPageLayout() == XData::TwoSided) { _twoSidedButton->SetValue(true); } else { _oneSidedButton->SetValue(true); } } void ReadableEditorDialog::checkXDataUniqueness() { _runningXDataUniquenessCheck = true; std::string xdn = _xDataNameEntry->GetValue().ToStdString(); if (_xData->getName() == xdn) { _runningXDataUniquenessCheck = false; return; } _xdLoader->retrieveXdInfo(); XData::StringVectorMap::const_iterator it = _xdLoader->getDefinitionList().find(xdn); if (it != _xdLoader->getDefinitionList().end()) { // The definition already exists. Ask the user whether it should be imported. If not make a different name suggestion. wxutil::Messagebox dialog( _("Import definition?"), (boost::format(_("The definition %s already exists. Should it be imported?")) % xdn).str(), ui::IDialog::MESSAGE_ASK, this ); std::string message = ""; if (dialog.run() == ui::IDialog::RESULT_YES) { try { int result = XdFileChooserDialog::Import( xdn, _xData, _xdFilename, _xdLoader, this); if (result == wxID_OK) { _xdNameSpecified = true; _useDefaultFilename = false; populateControlsFromXData(); _runningXDataUniquenessCheck = false; refreshWindowTitle(); return; } } catch (XdFileChooserDialog::ImportFailedException&) { message = _("Import failed:"); message += "\n\t" + _xdLoader->getImportSummary()[_xdLoader->getImportSummary().size() - 1]; message += "\n\n"; message += _("Consult the import summary for further information."); message += "\n\n"; } } // Dialog RESULT_NO, XdFileChooserDialog::RESULT_CANCEL or import failed! Make a different name suggestion! std::string suggestion; for (int n = 1; n > 0; n++) { suggestion = xdn + string::to_string(n); if (_xdLoader->getDefinitionList().find(suggestion) == _xdLoader->getDefinitionList().end()) { // The suggested XData-name does not exist. break; } } // Update entry and XData object. Notify the user about the suggestion. _xDataNameEntry->SetValue(suggestion); _xData->setName(suggestion); message += (boost::format(_("To avoid duplicated XData definitions " "the current definition has been renamed to %s.")) % suggestion).str(); wxutil::Messagebox::Show( _("XData has been renamed."), message, ui::IDialog::MESSAGE_CONFIRM, this ); } else { _xData->setName(xdn); } _xdNameSpecified = true; _useDefaultFilename = true; _runningXDataUniquenessCheck = false; refreshWindowTitle(); } void ReadableEditorDialog::insertPage() { storeCurrentPage(); _xData->setNumPages(_xData->getNumPages()+1); _numPages->SetValue(static_cast(_xData->getNumPages())); handleNumberOfPagesChanged(); for (std::size_t n = _xData->getNumPages() - 1; n > _currentPageIndex; n--) { _xData->setGuiPage(_xData->getGuiPage(n - 1), n); _xData->setPageContent(XData::Title, n, XData::Left, _xData->getPageContent(XData::Title, n - 1, XData::Left) ); _xData->setPageContent(XData::Body, n, XData::Left, _xData->getPageContent(XData::Body, n - 1, XData::Left) ); } // New Page: _xData->setPageContent(XData::Title, _currentPageIndex, XData::Left, ""); _xData->setPageContent(XData::Body, _currentPageIndex, XData::Left, ""); _xData->setGuiPage(_xData->getGuiPage(_currentPageIndex + 1), _currentPageIndex); // Right side: if (_xData->getPageLayout() == XData::TwoSided) { for (std::size_t n = _xData->getNumPages() - 1; n > _currentPageIndex; n--) { _xData->setGuiPage(_xData->getGuiPage(n - 1), n); _xData->setPageContent(XData::Title, n, XData::Right, _xData->getPageContent(XData::Title, n - 1, XData::Right) ); _xData->setPageContent(XData::Body, n, XData::Right, _xData->getPageContent(XData::Body, n - 1, XData::Right) ); } // New Page: _xData->setPageContent(XData::Title, _currentPageIndex, XData::Right, ""); _xData->setPageContent(XData::Body, _currentPageIndex, XData::Right, ""); } showPage(_currentPageIndex); } void ReadableEditorDialog::deletePage() { if (_currentPageIndex == _xData->getNumPages() - 1) { if (_currentPageIndex == 0) { _xData->setNumPages(0); _xData->setNumPages(1); showPage(0); return; } _numPages->SetValue(static_cast(_currentPageIndex)); handleNumberOfPagesChanged(); } else { for (std::size_t n = _currentPageIndex; n < _xData->getNumPages()-1; n++) { _xData->setGuiPage(_xData->getGuiPage(n+1), n); _xData->setPageContent(XData::Title, n, XData::Left, _xData->getPageContent(XData::Title, n+1, XData::Left) ); _xData->setPageContent(XData::Body, n, XData::Left, _xData->getPageContent(XData::Body, n+1, XData::Left) ); } // Right Side if (_xData->getPageLayout() == XData::TwoSided) { for (std::size_t n = _currentPageIndex; n < _xData->getNumPages()-1; n++) { _xData->setGuiPage(_xData->getGuiPage(n+1), n); _xData->setPageContent(XData::Title, n, XData::Right, _xData->getPageContent(XData::Title, n+1, XData::Right) ); _xData->setPageContent(XData::Body, n, XData::Right, _xData->getPageContent(XData::Body, n+1, XData::Right) ); } } _xData->setNumPages(_xData->getNumPages() - 1); _numPages->SetValue(static_cast(_xData->getNumPages())); showPage(_currentPageIndex); } } void ReadableEditorDialog::deleteSide(bool rightSide) { storeCurrentPage(); if (!rightSide) { _xData->setPageContent(XData::Title, _currentPageIndex, XData::Left, _xData->getPageContent(XData::Title, _currentPageIndex, XData::Right) ); _xData->setPageContent(XData::Body, _currentPageIndex, XData::Left, _xData->getPageContent(XData::Body, _currentPageIndex, XData::Right) ); } if (_currentPageIndex < _xData->getNumPages() - 1) { _xData->setPageContent(XData::Title, _currentPageIndex, XData::Right, _xData->getPageContent(XData::Title, _currentPageIndex + 1, XData::Left) ); _xData->setPageContent(XData::Body, _currentPageIndex, XData::Right, _xData->getPageContent(XData::Body, _currentPageIndex + 1, XData::Left) ); for (std::size_t n = _currentPageIndex + 1; n < _xData->getNumPages() - 1; n++) { _xData->setPageContent(XData::Title, n, XData::Left, _xData->getPageContent(XData::Title, n, XData::Right)); _xData->setPageContent(XData::Title, n, XData::Right, _xData->getPageContent(XData::Title, n+1, XData::Left)); _xData->setPageContent(XData::Body, n, XData::Left, _xData->getPageContent(XData::Body, n, XData::Right)); _xData->setPageContent(XData::Body, n, XData::Right, _xData->getPageContent(XData::Body, n+1, XData::Left)); } _xData->setPageContent(XData::Title, _xData->getNumPages() - 1, XData::Left, _xData->getPageContent(XData::Title, _xData->getNumPages() - 1, XData::Right)); _xData->setPageContent(XData::Body, _xData->getNumPages() - 1, XData::Left, _xData->getPageContent(XData::Body, _xData->getNumPages() - 1, XData::Right)); } if (_xData->getPageContent(XData::Title, _xData->getNumPages() - 1, XData::Left).empty() && _xData->getPageContent(XData::Body, _xData->getNumPages() - 1, XData::Left).empty()) { // The last page has no content anymore, so delete it. _numPages->SetValue(static_cast(_xData->getNumPages() - 1)); handleNumberOfPagesChanged(); } else { _xData->setPageContent(XData::Title, _xData->getNumPages() - 1, XData::Right, ""); _xData->setPageContent(XData::Body, _xData->getNumPages() - 1, XData::Right, ""); } showPage(_currentPageIndex); } void ReadableEditorDialog::insertSide(bool rightSide) { storeCurrentPage(); if (!_xData->getPageContent(XData::Title, _xData->getNumPages()-1, XData::Right).empty() || !_xData->getPageContent(XData::Body, _xData->getNumPages()-1, XData::Right).empty()) { //Last side has content. Raise numPages before shifting _numPages->SetValue(static_cast(_xData->getNumPages() + 1)); handleNumberOfPagesChanged(); } for (std::size_t n = _xData->getNumPages() - 1; n>_currentPageIndex; n--) { _xData->setPageContent(XData::Title, n, XData::Right, _xData->getPageContent(XData::Title, n, XData::Left)); _xData->setPageContent(XData::Title, n, XData::Left, _xData->getPageContent(XData::Title, n-1, XData::Right)); _xData->setPageContent(XData::Body, n, XData::Right, _xData->getPageContent(XData::Body, n, XData::Left)); _xData->setPageContent(XData::Body, n, XData::Left, _xData->getPageContent(XData::Body, n-1, XData::Right)); } if (!rightSide) { _xData->setPageContent(XData::Title, _currentPageIndex, XData::Right, _xData->getPageContent(XData::Title, _currentPageIndex, XData::Left)); _xData->setPageContent(XData::Body, _currentPageIndex, XData::Right, _xData->getPageContent(XData::Body, _currentPageIndex, XData::Left)); _xData->setPageContent(XData::Title, _currentPageIndex, XData::Left, ""); _xData->setPageContent(XData::Body, _currentPageIndex, XData::Left, ""); } else { _xData->setPageContent(XData::Title, _currentPageIndex, XData::Right, ""); _xData->setPageContent(XData::Body, _currentPageIndex, XData::Right, ""); } showPage(_currentPageIndex); } void ReadableEditorDialog::useOneSidedEditing() { if (_xData->getPageLayout() != XData::OneSided) { toggleLayout(); } } void ReadableEditorDialog::useTwoSidedEditing() { if (_xData->getPageLayout() != XData::TwoSided) { toggleLayout(); } } void ReadableEditorDialog::toggleLayout() { // Convert OneSided XData to TwoSided and vice versa and refresh controls storeXData(); _xData->togglePageLayout(_xData); populateControlsFromXData(); } void ReadableEditorDialog::checkGuiLayout() { _runningGuiLayoutCheck = true; std::string guiName = _guiEntry->GetValue().ToStdString(); std::string msg; gui::GuiType type = gui::GuiManager::Instance().getGuiType(guiName); switch (type) { case gui::NO_READABLE: msg = _("The specified gui definition is not a readable."); break; case gui::ONE_SIDED_READABLE: if (_xData->getPageLayout() != XData::OneSided) { msg = _("The specified gui definition is not suitable for the currently chosen page-layout."); } else { _runningGuiLayoutCheck = false; updateGuiView(); return; } break; case gui::TWO_SIDED_READABLE: if (_xData->getPageLayout() != XData::TwoSided) { msg = _("The specified gui definition is not suitable for the currently chosen page-layout."); } else { _runningGuiLayoutCheck = false; updateGuiView(); return; } break; case gui::IMPORT_FAILURE: msg = _("Failure during import."); break; case gui::FILE_NOT_FOUND: msg = _("The specified Definition does not exist."); break; default: rWarning() << "Invalid GUI type encountered in switch: " << type << std::endl; break; } wxutil::Messagebox dialog( _("Not a suitable Gui Definition!"), msg + "\n\n" + std::string(_("Start the Gui Browser?")), IDialog::MESSAGE_ASK, this); if (dialog.run() == ui::IDialog::RESULT_YES) { XData::PageLayout layoutBefore = _xData->getPageLayout(); std::string guiName = GuiSelector::Run(_xData->getPageLayout() == XData::TwoSided, this); if (!guiName.empty()) { _guiEntry->SetValue(guiName); _runningGuiLayoutCheck = false; updateGuiView(); return; } else { if (_xData->getPageLayout() != layoutBefore) { toggleLayout(); } // User clicked cancel. Use default layout: if (_xData->getPageLayout() == XData::TwoSided) { _guiEntry->SetValue(XData::DEFAULT_TWOSIDED_GUI); } else { _guiEntry->SetValue(XData::DEFAULT_ONESIDED_GUI); } updateGuiView(); wxutil::Messagebox::Show(_("Switching to default Gui..."), _("You didn't choose a Gui. Using the default Gui now."), ui::IDialog::MESSAGE_CONFIRM, this); _runningGuiLayoutCheck = false; return; } } // Entry should hold focus. _guiEntry->SetFocus(); _runningGuiLayoutCheck = false; } void ReadableEditorDialog::showXdImportSummary() { XData::StringList summary = _xdLoader->getImportSummary(); if (summary.empty()) { wxutil::Messagebox::ShowError(_("No import summary available. An XData definition has to be imported first..."), this); return; } std::string sum; for (std::size_t n = 0; n < summary.size(); n++) { sum += summary[n]; } TextViewInfoDialog::Show(_("XData import summary"), sum, this); } void ReadableEditorDialog::showGuiImportSummary() { XData::StringList errors = gui::GuiManager::Instance().getErrorList(); if (errors.empty()) { wxutil::Messagebox::ShowError(_("No import summary available. Browse Gui Definitions first."), this); return; } std::string summary; for (std::size_t n = 0; n < errors.size(); n++) { summary += errors[n]; } TextViewInfoDialog::Show(_("Gui import summary"), summary, this); } ////////////////////////////////////////////////////////////////////////////// // Callback Methods for Signals: void ReadableEditorDialog::onMenuItemClick(wxCommandEvent& ev) { switch (static_cast(ev.GetId())) { case InsertWholePage: insertPage(); break; case InsertLeft: insertSide(false); break; case InsertRight: insertSide(true); break; case DeleteWholePage: deletePage(); break; case DeleteLeft: deleteSide(false); break; case DeleteRight: deleteSide(true); break; case AppendPage: _numPages->SetValue(static_cast(_xData->getNumPages() + 1)); handleNumberOfPagesChanged(); storeCurrentPage(); showPage(_currentPageIndex + 1); break; case PrependPage: insertPage(); break; case ShowXDataSummary: showXdImportSummary(); break; case ShowGuiImportSummary: showGuiImportSummary(); break; case ShowDuplicatedDefs: showDuplicateDefinitions(); break; }; } void ReadableEditorDialog::onCancel(wxCommandEvent& ev) { EndModal(wxID_CANCEL); } void ReadableEditorDialog::onSave(wxCommandEvent& ev) { if (_xdNameSpecified) { save(); } else { wxutil::Messagebox::ShowError(_("Please specify an XData name first!"), this); } } void ReadableEditorDialog::onSaveClose(wxCommandEvent& ev) { if (!_saveInProgress) { if (_xdNameSpecified) { if (save()) { // Done, just destroy the window EndModal(wxID_OK); } } else { wxutil::Messagebox::ShowError(_("Please specify an XData name first!"), this); } } } void ReadableEditorDialog::onBrowseXd(wxCommandEvent& ev) { // FileChooser for xd-files _xdLoader->retrieveXdInfo(); std::string res = XDataSelector::run(_xdLoader->getDefinitionList(), this); if (res.empty()) { updateGuiView(); return; } // Import the file: try { if (XdFileChooserDialog::Import(res, _xData, _xdFilename, _xdLoader, this) == wxID_OK) { _xdNameSpecified = true; _useDefaultFilename = false; populateControlsFromXData(); refreshWindowTitle(); } else { updateGuiView(); } } catch (XdFileChooserDialog::ImportFailedException&) { std::string msg = (boost::format(_("Failed to import %s.")) % res).str(); msg += "\n\n"; msg += _("Do you want to open the import summary?"); wxutil::Messagebox dialog(_("Import failed"), msg, ui::IDialog::MESSAGE_ASK, this); if (dialog.run() == ui::IDialog::RESULT_YES) { showXdImportSummary(); } updateGuiView(); return; } } void ReadableEditorDialog::onNextPage(wxCommandEvent& ev) { if (_currentPageIndex+1 < _xData->getNumPages()) { storeCurrentPage(); showPage(_currentPageIndex+1); } else { static_cast(ev.GetEventObject())->PopupMenu(_appendMenu.get()); } } void ReadableEditorDialog::onPrevPage(wxCommandEvent& ev) { if (_currentPageIndex > 0) { storeCurrentPage(); showPage(_currentPageIndex-1); } else { static_cast(ev.GetEventObject())->PopupMenu(_prependMenu.get()); } } void ReadableEditorDialog::onFirstPage(wxCommandEvent& ev) { if (_currentPageIndex != 0) { storeCurrentPage(); showPage(0); } else { static_cast(ev.GetEventObject())->PopupMenu(_prependMenu.get()); } } void ReadableEditorDialog::onLastPage(wxCommandEvent& ev) { if (_currentPageIndex != _xData->getNumPages() - 1) { storeCurrentPage(); showPage(_xData->getNumPages()-1); } else { static_cast(ev.GetEventObject())->PopupMenu(_appendMenu.get()); } } void ReadableEditorDialog::onBrowseGui(wxCommandEvent& ev) { XData::PageLayout layoutBefore = _xData->getPageLayout(); std::string guiDefBefore = _guiEntry->GetValue().ToStdString(); std::string guiName = GuiSelector::Run(_xData->getPageLayout() == XData::TwoSided, this); if (!guiName.empty()) { _guiEntry->SetValue(guiName); } else { if (_xData->getPageLayout() != layoutBefore) { toggleLayout(); } if (_guiEntry->GetValue() != guiDefBefore) { _guiEntry->SetValue(guiDefBefore); } updateGuiView(); } } void ReadableEditorDialog::onInsert(wxCommandEvent& ev) { if (_xData->getPageLayout() == XData::TwoSided) { static_cast(ev.GetEventObject())->PopupMenu(_insertMenu.get()); } else { insertPage(); } } void ReadableEditorDialog::onDelete(wxCommandEvent& ev) { if (_xData->getPageLayout() == XData::TwoSided) { static_cast(ev.GetEventObject())->PopupMenu(_deleteMenu.get()); } else { deletePage(); } } void ReadableEditorDialog::handleNumberOfPagesChanged() { std::size_t nNP = static_cast(_numPages->GetValue()); _xData->setNumPages(nNP); if (_currentPageIndex >= nNP) { showPage(nNP - 1); } } void ReadableEditorDialog::onNumPagesChanged(wxSpinEvent& ev) { handleNumberOfPagesChanged(); } void ReadableEditorDialog::onToolsClicked(wxCommandEvent& ev) { static_cast(ev.GetEventObject())->PopupMenu(_toolsMenu.get()); } void ReadableEditorDialog::showDuplicateDefinitions() { _xdLoader->retrieveXdInfo(); XData::StringVectorMap dupDefs; try { dupDefs = _xdLoader->getDuplicateDefinitions(); } catch (std::runtime_error&) { wxutil::Messagebox::Show( _("Duplicated XData definitions"), _("There are no duplicated definitions!"), ui::IDialog::MESSAGE_CONFIRM, this ); return; } std::string out; for (XData::StringVectorMap::iterator it = dupDefs.begin(); it != dupDefs.end(); ++it) { std::string occ; for (std::size_t n = 0; n < it->second.size()-1; n++) { occ += it->second[n] + ", "; } occ += it->second[it->second.size() - 1]; out += (boost::format(_("%s has been defined in:")) % it->first).str(); out +="\n\t"; out += occ; out += ".\n\n"; } TextViewInfoDialog::Show(_("Duplicated XData definitions"), out, this); } void ReadableEditorDialog::onOneSided(wxCommandEvent& ev) { if ((_oneSidedButton->GetValue())) useOneSidedEditing(); } void ReadableEditorDialog::onTwoSided(wxCommandEvent& ev) { if ((_twoSidedButton->GetValue())) useTwoSidedEditing(); } ////////////////////////////////////////////////////////////////////////////// // Callback Methods for Events: void ReadableEditorDialog::onFocusOut(wxFocusEvent& ev) { if (ev.GetEventObject() == _xDataNameEntry) { // Only call checkXDataUniqueness if the method is not running yet. if (!_runningXDataUniquenessCheck) { checkXDataUniqueness(); } } else // WIDGET_GUI_ENTRY { // Only call checkGuiLayout() if the method is not yet running if (!_runningGuiLayoutCheck) { checkGuiLayout(); } } ev.Skip(); } void ReadableEditorDialog::onTextChanged(wxCommandEvent& ev) { // Update the preview updateGuiView(); } void ReadableEditorDialog::onChar(wxKeyEvent& ev) { if (ev.GetEventObject() == _xDataNameEntry) { switch (ev.GetKeyCode()) { // Some forbidden keys case WXK_SPACE: case '!': case '*': case '+': case WXK_NUMPAD_MULTIPLY: case WXK_NUMPAD_SUBTRACT: case WXK_NUMPAD_ADD: case WXK_NUMPAD_SEPARATOR: case ',': case '.': case ':': case ';': case '?': case '-': return; // Since TAB would be added to the value, inercept it here and // emulate TAB-traversal to the next control instead case WXK_TAB: if (ev.ShiftDown()) { _nameEntry->SetFocus(); } else { _numPages->SetFocus(); } return; // Check Uniqueness of the XData-Name. case WXK_RETURN: case WXK_NUMPAD_ENTER: checkXDataUniqueness(); ev.Skip(); break; default: ev.Skip(); break; } } else if (ev.GetEventObject() == _nameEntry) { switch (ev.GetKeyCode()) { // Forbidden key check case WXK_TAB: _xDataNameEntry->SetFocus(); return; // forbid the tab default: ev.Skip(); return; } } else if (ev.GetEventObject() == _numPages) { if (ev.GetKeyCode() != WXK_ESCAPE) { ev.Skip(); return; } // Restore the old value. _numPages->SetValue(static_cast(_xData->getNumPages())); return; } else if (ev.GetEventObject() == _guiEntry) { if (ev.GetKeyCode() != WXK_RETURN && ev.GetKeyCode() != WXK_NUMPAD_ENTER) { ev.Skip(); return; } checkGuiLayout(); return; } ev.Skip(); } // Sets the text of a TextView identified by its widget enumerator and scrolls it to the end. void ReadableEditorDialog::setTextViewAndScroll(wxTextCtrl* view, const std::string& text) { view->SetValue(text); view->ShowPosition(view->GetLastPosition()); } } // namespace ui DarkRadiant-2.0.2/plugins/dm.gui/ReadableEditorDialog.h000066400000000000000000000137531245424655700227310ustar00rootroot00000000000000#pragma once #include "icommandsystem.h" #include "wxutil/dialog/DialogBase.h" #include "ReadableGuiView.h" #include #include #include "XDataLoader.h" #include "string/string.h" #include "wxutil/XmlResourceBasedWidget.h" class Entity; class wxTextCtrl; class wxSpinCtrl; class wxRadioButton; class wxStaticText; namespace ui { namespace { const std::string RKEY_READABLES_STORAGE_FOLDER = "user/ui/gui/storageFolder"; const std::string RKEY_READABLES_CUSTOM_FOLDER = "user/ui/gui/customFolder"; } ///////////////////////////// ReadableEditorDialog: // The main dialog of the Readable Editor, which implements most editing features. class ReadableEditorDialog : public wxutil::DialogBase, private wxutil::XmlResourceBasedWidget { private: gui::GuiView* _guiView; // The entity we're working with Entity* _entity; // The XData-definition of the entity XData::XDataPtr _xData; // The filename of the XData definition std::string _xdFilename; // The XData filename derived from the map-name. std::string _mapBasedFilename; // The xData loader XData::XDataLoaderPtr _xdLoader; // The index of the current page. std::size_t _currentPageIndex; // Has the XData name been specified? bool _xdNameSpecified; // Tells the program whether checkGuiLayout() is already running. bool _runningGuiLayoutCheck; // Tells the program whether checkXDataUniqueness is already running. bool _runningXDataUniquenessCheck; // Tells the exporter whether to use the _mapBasedFilename (true) or not. bool _useDefaultFilename; // Prevents saving races. bool _saveInProgress; wxTextCtrl* _nameEntry; wxTextCtrl* _xDataNameEntry; wxSpinCtrl* _numPages; wxRadioButton* _oneSidedButton; wxRadioButton* _twoSidedButton; wxTextCtrl* _pageTurnEntry; wxStaticText* _curPageDisplay; wxTextCtrl* _guiEntry; wxStaticText* _pageLeftLabel; wxStaticText* _pageRightLabel; wxTextCtrl* _textViewTitle; wxTextCtrl* _textViewRightTitle; wxTextCtrl* _textViewBody; wxTextCtrl* _textViewRightBody; std::unique_ptr _insertMenu; std::unique_ptr _deleteMenu; std::unique_ptr _appendMenu; std::unique_ptr _prependMenu; std::unique_ptr _toolsMenu; public: // Pass the working entity to the constructor ReadableEditorDialog(Entity* entity); static void RunDialog(const cmd::ArgumentList& args); // override DialogBase int ShowModal(); // Switch between the editing modes void useOneSidedEditing(); void useTwoSidedEditing(); // Updates the GUI preview (text updates). Public so that XDataSelector and GuiSelector can access it. // Uses the current data in the readable editor for updating or imports XData/guis by the passed strings. // This Method can create error-messages. For that reason a parent window can be specified. If Null the Readable // Editor Dialog is parent. void updateGuiView(wxWindow* parent = NULL, const std::string& guiPath = "", const std::string& xDataName = "", const std::string& xDataPath = ""); // shows the XData import Summary void showXdImportSummary(); private: // Save all settings on the entity and exports xdata. bool save(); // Constructs the storage path for the current XData definition. Used by save-method and for the window-title. std::string constructStoragePath(); // Refreshes the window title based on the storagepath. void refreshWindowTitle(); // Retrieves information from the entity and imports xdata. If the user cancels, the window is destroyed in _postshow bool initControlsFromEntity(); // _show_ TwoSided editing-interface. void toggleTwoSidedEditingInterface(bool show); // shows the gui import Summary void showGuiImportSummary(); // toggles the layout of the xdata object and updates the interface. void toggleLayout(); // Stores the contents of the current page inside the xData-object. void storeCurrentPage(); // Stores the contents of all controls in the xData-object. void storeXData(); // Updates the page related inputs and the preview renderer. Also adds default guis. // Warning: Contents are overwritten. storeCurrentPage() should be called beforehand. void showPage(std::size_t pageIndex); // Populates the controls with the information in the xdata object. Adds a default snd_page_turn, if not defined. void populateControlsFromXData(); // Checks whether the chosen XData name already exists. If it does a popup will ask the user whether it should be imported. void checkXDataUniqueness(); // Checks whether the specified gui definition matches the pagelayout. Returns FALSE on success. void checkGuiLayout(); void handleNumberOfPagesChanged(); // Deleting and inserting of pages. void insertPage(); void deletePage(); // Inserts a page on the right or left side of the current page. void insertSide(bool rightSide); // Deletes the left or right side of the current page. void deleteSide(bool rightSide); // Ui Creation: void setupGeneralPropertiesInterface(); void setupPageRelatedInterface(); void setupButtonPanel(); void createMenus(); // Callback methods for Signals: void onCancel(wxCommandEvent& ev); void onSave(wxCommandEvent& ev); void onSaveClose(wxCommandEvent& ev); void onBrowseXd(wxCommandEvent& ev); void onBrowseGui(wxCommandEvent& ev); void onFirstPage(wxCommandEvent& ev); void onPrevPage(wxCommandEvent& ev); void onNextPage(wxCommandEvent& ev); void onLastPage(wxCommandEvent& ev); void onInsert(wxCommandEvent& ev); void onDelete(wxCommandEvent& ev); void onNumPagesChanged(wxSpinEvent& ev); void onToolsClicked(wxCommandEvent& ev); void onMenuItemClick(wxCommandEvent& ev); void onOneSided(wxCommandEvent& ev); void onTwoSided(wxCommandEvent& ev); // Callback methods for Events: void onFocusOut(wxFocusEvent& ev); void onChar(wxKeyEvent& ev); void onTextChanged(wxCommandEvent& ev); // Helper Methods: void showDuplicateDefinitions(); // Sets the text of a TextView identified by its widget enumerator and scrolls it to the end. void setTextViewAndScroll(wxTextCtrl* view, const std::string& text); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.gui/ReadableGuiView.cpp000066400000000000000000000023221245424655700222630ustar00rootroot00000000000000#include "ReadableGuiView.h" namespace gui { ReadableGuiView::ReadableGuiView(wxWindow* parent) : GuiView(parent) {} void ReadableGuiView::setGLViewPort() { double width = _windowDims[0]; double height = _windowDims[1]; double aspectRatio = _bgDims[0] / _bgDims[1]; if (width / height > aspectRatio) { width = height * aspectRatio; } else { height = width / aspectRatio; } SetSize(static_cast(width), -1); glViewport(0, 0, static_cast(width), static_cast(height)); } void ReadableGuiView::setGui(const GuiPtr& gui) { // Call the base class first GuiView::setGui(gui); Vector2 topLeft(0, 0); Vector2 bottomRight(640, 480); if (_gui != NULL) { GuiWindowDefPtr bgWindowDef = _gui->findWindowDef("backgroundImage"); if (!bgWindowDef) { bgWindowDef = _gui->findWindowDef("backgroundmulti"); if (!bgWindowDef) { bgWindowDef = _gui->findWindowDef("backgroundsingle"); } } if (bgWindowDef != NULL) { const Vector4& rect = bgWindowDef->rect; topLeft = Vector2(rect[0], rect[1]); bottomRight = Vector2(rect[0] + rect[2], rect[1] + rect[3]); } } _bgDims = bottomRight - topLeft; _renderer.setVisibleArea(topLeft, bottomRight); } } // namespace DarkRadiant-2.0.2/plugins/dm.gui/ReadableGuiView.h000066400000000000000000000007411245424655700217330ustar00rootroot00000000000000#pragma once #include "gui/GuiView.h" namespace gui { /** * greebo: Specialisation of the generic GuiView with regard to readables. * The viewport is cropped to the size of the "backgroundImage" windowDef. */ class ReadableGuiView : public GuiView { protected: Vector2 _bgDims; std::vector backgroundDefList; public: ReadableGuiView(wxWindow* parent); virtual void setGui(const GuiPtr& gui); protected: virtual void setGLViewPort(); }; } // namespace DarkRadiant-2.0.2/plugins/dm.gui/ReadablePopulator.h000066400000000000000000000031171245424655700223410ustar00rootroot00000000000000#pragma once #include "gui/GuiManager.h" #include "wxutil/VFSTreePopulator.h" #include "wxutil/ModalProgressDialog.h" #include "EventRateLimiter.h" #include "i18n.h" namespace ui { /** * greebo: A helper class sorting GUIs into two given TreePopulators. */ class ReadablePopulator : public gui::GuiManager::Visitor { private: wxutil::VFSTreePopulator& _popOne; wxutil::VFSTreePopulator& _popTwo; // Progress dialog and model count wxutil::ModalProgressDialog _progress; std::size_t _count; std::size_t _numGuis; // Event rate limiter for progress dialog EventRateLimiter _evLimiter; public: ReadablePopulator(wxutil::VFSTreePopulator& popOne, wxutil::VFSTreePopulator& popTwo) : _popOne(popOne), _popTwo(popTwo), _progress(_("Analysing Guis")), _count(0), _numGuis(gui::GuiManager::Instance().getNumGuis()), _evLimiter(50) {} void visit(const std::string& guiPath, const gui::GuiType& guiType) { _count++; if (_evLimiter.readyForEvent()) { float fraction = static_cast(_count) / _numGuis; _progress.setTextAndFraction(guiPath.substr(guiPath.rfind('/') + 1), fraction); } gui::GuiType type; if (guiType == gui::NOT_LOADED_YET || guiType == gui::UNDETERMINED) { type = gui::GuiManager::Instance().getGuiType(guiPath); } else { type = guiType; } if (type == gui::ONE_SIDED_READABLE) { _popOne.addPath(guiPath.substr(guiPath.find('/') + 1)); // omit the guis-folder } else if (type == gui::TWO_SIDED_READABLE) { _popTwo.addPath(guiPath.substr(guiPath.find('/') + 1)); // omit the guis-folder } } }; } // namespace DarkRadiant-2.0.2/plugins/dm.gui/ReadableReloader.h000066400000000000000000000026261245424655700221150ustar00rootroot00000000000000#ifndef _READABLE_RELOADER_H_ #define _READABLE_RELOADER_H_ #include "gui/GuiManager.h" #include "wxutil/VFSTreePopulator.h" #include "wxutil/ModalProgressDialog.h" #include "EventRateLimiter.h" #include "imainframe.h" #include "i18n.h" namespace ui { /** * greebo: A helper class reloading all GUI definitions. */ class ReadableReloader : public gui::GuiManager::Visitor { private: // Progress dialog and model count wxutil::ModalProgressDialog _progress; std::size_t _count; std::size_t _numGuis; // Event rate limiter for progress dialog EventRateLimiter _evLimiter; public: ReadableReloader() : _progress(_("Reloading Guis")), _count(0), _evLimiter(50) { _numGuis = gui::GuiManager::Instance().getNumGuis(); } void visit(const std::string& guiPath, const gui::GuiType& guiType) { _count++; if (_evLimiter.readyForEvent()) { float fraction = static_cast(_count) / _numGuis; _progress.setTextAndFraction(guiPath.substr(guiPath.rfind('/') + 1), fraction); } if (guiType != gui::NOT_LOADED_YET) { gui::GuiManager::Instance().reloadGui(guiPath); } } static void run(const cmd::ArgumentList& args) { try { gui::GuiManager::Instance().findGuis(); ReadableReloader reloader; gui::GuiManager::Instance().foreachGui(reloader); } catch (wxutil::ModalProgressDialog::OperationAbortedException&) {} } }; } // namespace #endif /* _READABLE_RELOADER_H_ */ DarkRadiant-2.0.2/plugins/dm.gui/TextViewInfoDialog.h000066400000000000000000000024641245424655700224530ustar00rootroot00000000000000#pragma once #include "wxutil/dialog/DialogBase.h" #include #include namespace ui { ///////////////////////////// TextViewInfoDialog: // Small Info-Dialog showing text in a scrolled, non-editable textview and an ok button. class TextViewInfoDialog : public wxutil::DialogBase { private: wxTextCtrl* _text; public: TextViewInfoDialog(const std::string& title, const std::string& text, wxWindow* parent = NULL, int win_width = 650, int win_height = 500) : DialogBase(title), _text(new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_LEFT | wxTE_MULTILINE | wxTE_READONLY | wxTE_WORDWRAP)) { SetSize(win_width, win_height); // Add a vbox for the dialog elements SetSizer(new wxBoxSizer(wxVERTICAL)); // Add a vbox for the dialog elements wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); GetSizer()->Add(vbox, 1, wxEXPAND | wxALL, 12); vbox->Add(_text, 1, wxEXPAND | wxBOTTOM, 6); vbox->Add(CreateStdDialogButtonSizer(wxOK), 0, wxALIGN_RIGHT); _text->SetValue(text); CenterOnParent(); } static void Show(const std::string& title, const std::string& text, wxWindow* parent = NULL) { TextViewInfoDialog* dialog = new TextViewInfoDialog(title, text, parent); dialog->ShowModal(); dialog->Destroy(); } }; } // namespace DarkRadiant-2.0.2/plugins/dm.gui/XData.cpp000066400000000000000000000302031245424655700202640ustar00rootroot00000000000000#include "XData.h" #include "i18n.h" #include #include namespace XData { //XData implementations: //->export: FileStatus XData::xport( const std::string& filename, ExporterCommand cmd ) { boost::filesystem::path Path(filename); boost::filesystem::path parent = Path.parent_path(); // Ensure the parent path exists boost::filesystem::create_directories(parent); if (boost::filesystem::exists(Path)) { switch (cmd) { case Merge: { //Check if definition already exists and return DefinitionExists. If it does not, append the definition to the file. boost::filesystem::fstream file(Path, std::ios_base::in | std::ios_base::out | std::ios_base::app); if (!file.is_open()) return OpenFailed; std::stringstream ss; ss << file.rdbuf(); std::string String = ss.str(); std::size_t DefPos = String.find(_name); while (DefPos != std::string::npos) //A name of a XData could be contained in another XData's name. Check that... { char before = String[DefPos > 0 ? DefPos-1 : 0]; char after = String[DefPos+_name.length() < String.size() ? DefPos+_name.length() : 0]; if ((DefPos == 0 || before == ' ' || before == '\t' || before == '\n') && (DefPos+_name.length() == String.size() || after == ' ' || after == '\t' || after == '\n')) //other delimiters necessary? { _definitionStart = 0; //Definition found. But we want to have it clean, so let's see how many spaces are before the definition begin. while (DefPos > 0) { if (String[--DefPos] != ' ' && String[DefPos] != '\t' && String[DefPos] != '\n') { _definitionStart = DefPos+1; break; } } file.close(); return DefinitionExists; } DefPos = String.find(_name,DefPos+_name.length()); } file << "\n\n\n" << generateXDataDef(); file.close(); return AllOk; } case MergeOverwriteExisting: { //Find the old definition in the target file and delete it. Append the new definition. //_definitionStart has been set in the first iteration of this method. boost::filesystem::fstream file(Path, std::ios_base::in); if (!file.is_open()) return OpenFailed; std::stringstream ss; ss << file.rdbuf(); std::string OutString = ss.str(); file.close(); int DefLength = getDefLength(OutString.substr(_definitionStart)); if (DefLength == 0) //If the definitionlength can't be obtained, the merge fails. return MergeFailed; OutString.erase(_definitionStart, DefLength); std::string insString = std::string( (_definitionStart != 0) ? "\n\n\n" : "" ) //No new lines in the first line + generateXDataDef() + std::string( (_definitionStart == OutString.size()) ? "" : "\n\n\n" ); //No new lines at the end of file OutString.insert(_definitionStart, insString); file.open(Path, std::ios_base::out | std::ios_base::trunc); if (!file.is_open()) return OpenFailed; file << OutString; file.close(); return AllOk; } case Overwrite: { //Warn if the target file contains multiple definitions: return MultipleDefinitions. //Warn if the definition in the target file does not match the current definition: return DefinitionMisMatch //else overwrite existing file. std::string DefName; boost::filesystem::ifstream file(Path, std::ios_base::in); if (!file.is_open()) return OpenFailed; try { DefName = getDefinitionNameFromXD(file); } catch (...) { std::cerr << "[XData::xport] Syntax error in file " << filename << ". Overwriting the file..." << std::endl; break; } if (DefName == _name) //Definition will be overwritten... break; else if (DefName == "") //MultipleDefinitions exist return MultipleDefinitions; return DefinitionMismatch; } case OverwriteMultDef: //Replace the file no matter what. break; default: return FileExists; } } //Write the definition into the file. boost::filesystem::ofstream file(Path, std::ios_base::out | std::ios_base::trunc); if (!file.is_open()) return OpenFailed; file << generateXDataDef(); file.close(); return AllOk; } const std::string XData::generateXDataDef() const { std::stringstream xDataDef; xDataDef << _name << "\n" << "{" << "\n" << "\tprecache" << "\n" << "\t\"num_pages\"\t: \"" << _numPages << "\"\n"; std::stringstream ss; std::string TempString; xDataDef << getContentDef(); for (std::size_t n=0; n<_numPages; n++) { xDataDef << "\t\"gui_page" << n+1 << "\"\t: \"" << _guiPage[n] << "\"\n"; } xDataDef << "\t\"snd_page_turn\"\t: \"" << _sndPageTurn << "\"\n}";//*/ return xDataDef.str(); } const std::size_t XData::getDefLength(const std::string& def) const { std::size_t charIndex = 0; while (def[charIndex] != '\0') { if (def[++charIndex] == '{') { int BracketCount = 1; while (def[++charIndex] != '\0' && BracketCount > 0) { // Move out of brackets if (def[charIndex] == '{') ++BracketCount; else if (def[charIndex] == '}') --BracketCount; } if (BracketCount > 0) break; while (def[charIndex] != '\0') { // The definitionlength also expands over trailing spaces if ( (def[charIndex] != ' ') && (def[charIndex] != '\t') && (def[charIndex] != '\n') ) break; ++charIndex; } return charIndex; } } return 0; //no appropriate bracketstructure was found. } const std::string XData::getDefinitionNameFromXD(boost::filesystem::ifstream& file) const { std::string ReturnString; parser::BasicDefTokeniser tok(file); bool FirstDef = true; while (tok.hasMoreTokens()) { if (FirstDef) ReturnString = tok.nextToken(); else return ""; FirstDef = false; tok.assertNextToken("{"); jumpOutOfBrackets(tok, 1); } return ReturnString; } const std::string XData::generateTextDef(const std::string& rawString) const { std::stringstream ss; std::stringstream xDataDef; std::string TempString; xDataDef << "\t{\n"; if (rawString != "") { ss << rawString; while ( std::getline(ss, TempString) ) //replace "\n" and add an escape-character before quotes. { std::size_t QuotePos = TempString.find("\"",0); while ( QuotePos != std::string::npos ) { TempString.insert(QuotePos, "\\"); QuotePos = TempString.find("\"",QuotePos+2); } xDataDef << "\t\t\"" << TempString << "\"\n"; } xDataDef << "\t}\n"; } else xDataDef << "\t\t\"\"\n\t}\n"; return xDataDef.str(); } //->general: void XData::resizeVectors(std::size_t targetSize) { std::string fill = ""; if (_guiPage.size() > 0) fill = _guiPage[_guiPage.size()-1]; _guiPage.resize(targetSize, fill); } void XData::jumpOutOfBrackets(parser::DefTokeniser& tok, int currentDepth) const { while ( tok.hasMoreTokens() && currentDepth > 0) { std::string token = tok.nextToken(); if (token == "{") currentDepth += 1; else if (token == "}") currentDepth -= 1; } } //TwoSidedXData implementations: void TwoSidedXData::resizeVectors(std::size_t targetSize) { XData::resizeVectors(targetSize); _pageLeftBody.resize(targetSize, ""); _pageLeftTitle.resize(targetSize, ""); _pageRightBody.resize(targetSize, ""); _pageRightTitle.resize(targetSize, ""); } void TwoSidedXData::setPageContent(ContentType cc, std::size_t pageIndex, Side side, const std::string& content) { if (pageIndex >= _numPages) throw std::runtime_error(_("Page Index out of bounds.")); switch (cc) { case Title: switch (side) { case Left: _pageLeftTitle[pageIndex] = content; break; default: _pageRightTitle[pageIndex] = content; } break; default: switch (side) { case Left: _pageLeftBody[pageIndex] = content; break; default: _pageRightBody[pageIndex] = content; } } } const std::string& TwoSidedXData::getPageContent(ContentType cc, std::size_t pageIndex, Side side) const { if (pageIndex >= _numPages) throw std::runtime_error(_("Page Index out of bounds.")); switch (cc) { case Title: switch (side) { case Left: return _pageLeftTitle[pageIndex]; default: return _pageRightTitle[pageIndex]; } default: switch (side) { case Left: return _pageLeftBody[pageIndex]; default: return _pageRightBody[pageIndex]; } } } const std::string TwoSidedXData::getContentDef() const { std::stringstream xDataDef; for (std::size_t n = 0; n < _numPages; n++) { //Page Left Title xDataDef << "\t\"page" << n+1 << "_left_title\"\t:\n"; xDataDef << generateTextDef(_pageLeftTitle[n]); //Page Left Body xDataDef << "\t\"page" << n+1 << "_left_body\"\t:\n"; xDataDef << generateTextDef(_pageLeftBody[n]); //Page Right Title xDataDef << "\t\"page" << n+1 << "_right_title\"\t:\n"; xDataDef << generateTextDef(_pageRightTitle[n]); //Page Right Body xDataDef << "\t\"page" << n+1 << "_right_body\"\t:\n"; xDataDef << generateTextDef(_pageRightBody[n]); } return xDataDef.str(); } void TwoSidedXData::togglePageLayout(XDataPtr& target) const { XDataPtr newXData(new OneSidedXData(_name)); newXData->setNumPages(_numPages*2); //delete last page if no content later. newXData->setSndPageTurn(_sndPageTurn); // Add default guiPage to all guiPage-entries. newXData->setGuiPage( StringList( newXData->getNumPages(), DEFAULT_ONESIDED_GUI) ); // Reshuffle the TwoSided pages contents into the OneSided page contents. for (std::size_t n = 0; n < _numPages; n++) { newXData->setPageContent(Title, 2*n, Left, _pageLeftTitle[n] ); newXData->setPageContent(Body, 2*n, Left, _pageLeftBody[n] ); newXData->setPageContent(Title, 2*n+1, Left, _pageRightTitle[n] ); newXData->setPageContent(Body, 2*n+1, Left, _pageRightBody[n] ); } if ( (_pageRightTitle[_numPages-1] == "") && (_pageRightBody[_numPages-1] == "") ) // Last page is empty. Set new numpages accordingly. newXData->setNumPages(newXData->getNumPages()-1); target = newXData; } //OneSidedXData implementations: void OneSidedXData::resizeVectors(std::size_t targetSize) { XData::resizeVectors(targetSize); _pageBody.resize(targetSize, ""); _pageTitle.resize(targetSize, ""); } void OneSidedXData::setPageContent(ContentType cc, std::size_t pageIndex, Side side, const std::string& content) { if (pageIndex >= _numPages) throw std::runtime_error(_("Page Index out of bounds.")); switch (cc) { case Title: _pageTitle[pageIndex] = content; break; case Body: default: _pageBody[pageIndex] = content; } } const std::string& OneSidedXData::getPageContent(ContentType cc, std::size_t pageIndex, Side side) const { if (pageIndex >= _numPages) throw std::runtime_error(_("Page Index out of bounds.")); switch (cc) { case Title: return _pageTitle[pageIndex]; default: return _pageBody[pageIndex]; } } const std::string OneSidedXData::getContentDef() const { std::stringstream xDataDef; for (std::size_t n = 0; n < _numPages; n++) { //Title xDataDef << "\t\"page" << n+1 << "_title\"\t:\n"; xDataDef << generateTextDef(_pageTitle[n]); //Body xDataDef << "\t\"page" << n+1 << "_body\"\t:\n"; xDataDef << generateTextDef(_pageBody[n]); } return xDataDef.str(); } void OneSidedXData::togglePageLayout(XDataPtr& target) const { XDataPtr newXData(new TwoSidedXData(_name)); newXData->setNumPages( (_numPages+1)/2); newXData->setSndPageTurn(_sndPageTurn); // Add default guiPage to all guiPage-entries. newXData->setGuiPage( StringList( newXData->getNumPages(), DEFAULT_TWOSIDED_GUI) ); // Reshuffle the TwoSided pages contents into the OneSided page contents. for (std::size_t n = 0; n < newXData->getNumPages()-1; n++) { newXData->setPageContent(Title, n, Left, _pageTitle[2*n] ); newXData->setPageContent(Body, n, Left, _pageBody[2*n] ); newXData->setPageContent(Title, n, Right, _pageTitle[2*n+1] ); newXData->setPageContent(Body, n, Right, _pageBody[2*n+1] ); } newXData->setPageContent(Title, newXData->getNumPages()-1, Left, _pageTitle[2*(newXData->getNumPages()-1)] ); newXData->setPageContent(Body, newXData->getNumPages()-1, Left, _pageBody[2*(newXData->getNumPages()-1)] ); if ( (_numPages % 2) == 0) { // Prevent vector subscript exceeded. newXData->setPageContent(Title, newXData->getNumPages()-1, Right, _pageTitle[_numPages-1] ); newXData->setPageContent(Body, newXData->getNumPages()-1, Right, _pageBody[_numPages-1] ); } target = newXData; } } // namespace XData DarkRadiant-2.0.2/plugins/dm.gui/XData.h000066400000000000000000000172141245424655700177400ustar00rootroot00000000000000#ifndef XDATA_H #define XDATA_H #include #include #include #include "i18n.h" #include #include "boost/filesystem/fstream.hpp" #include "parser/DefTokeniser.h" namespace XData { namespace { // All vectors of XData-objects are initialized with this size so that no sorting is necessary, which // would otherwise be necessary when e.g. page2_body was defined before page1_body and a simple // vector.push_back(..) was used to store the data instead of a direct access using an Index. const std::size_t MAX_PAGE_COUNT = 20; const char* DEFAULT_TWOSIDED_GUI = "guis/readables/books/book_calig_mac_humaine.gui"; const char* DEFAULT_ONESIDED_GUI = "guis/readables/sheets/sheet_paper_hand_nancy.gui"; const char* DEFAULT_SNDPAGETURN = "readable_page_turn"; } typedef std::vector StringList; enum FileStatus { FileExists, DefinitionExists, MultipleDefinitions, DefinitionMismatch, MergeFailed, OpenFailed, AllOk }; enum ExporterCommand { Normal, Merge, MergeOverwriteExisting, Overwrite, OverwriteMultDef }; enum Side { Left, Right }; enum ContentType { Title, Body }; enum PageLayout { TwoSided, OneSided }; class XData; typedef std::shared_ptr XDataPtr; ///////////////////////////// XData: // XData base-class for exporting, storing and managing XData. class XData { public: //Methods: // Returns the PageLayout of the object: TwoSided or OneSided virtual const PageLayout getPageLayout() const = 0; // Exports the XData class formated properly into the File specified in // Filename (absolute Filepath). If the file already exists this function can overwrite the // file or merge. If the file cannot be opened, OpenFailed is returned. // -Merge: If the definition already exists, DefinitionExists is returned (can also return OpenFailed). // This definition can be overwritten using the command MergeOverWriteExisting AFTER using Merge-cmd. // Otherwise the definition is appended. MergeOverwriteExisting can fail and returns MergeFailed or OpenFailed. // -Overwrite: Returns DefinitionMismatch if the definition in the target-file does not match // the name of the current definition or returns MultipleDefinitions. If a DefinitionMatch // is the case, the file is overwritten. Use the command OverwriteMultDef to overwrite the // file no matter what. With both commands OpenFailed can be returned. // If the target-file has Syntax errors, it is overwritten... FileStatus xport(const std::string& filename, ExporterCommand cmd); // Creates a OneSided XData object of an TwoSided XData object and vice versa without discarding any actual page // contents. numPages is adjusted accordingly and default guiPage-statements are applied. The result is stored // in target. virtual void togglePageLayout(XDataPtr& target) const = 0; virtual ~XData() {}; //Getters and Setters for Attributes: // The page-contents of the Two- and OneSided XData-objects. cc defines whether Title or Body shall be accessed. // The Side-parameter is discarded on OneSidedXData-objects. Throws std::runtime_error when index out of bounds. virtual const std::string& getPageContent(ContentType cc, std::size_t pageIndex, Side side) const = 0; virtual void setPageContent(ContentType cc, std::size_t pageIndex, Side side, const std::string& content) = 0; // The name of the XData-Definition const std::string& getName() const { return _name; } void setName(const std::string& name) { _name = name; } // numPages-statement. Resizes vectors accordingly. Attention: If numPages is lowered, data will obviously be discarded. const std::size_t getNumPages() const { return _numPages; } void setNumPages(std::size_t numPages) { _numPages = numPages; resizeVectors(numPages); } // guiPage-statement. Methods for accessing a whole StringList or single VectorElements. const StringList& getGuiPage() const { return _guiPage; } const std::string& getGuiPage(std::size_t index) const { if (index >= _numPages) throw std::runtime_error(_("GUI Page Index out of bounds.")); return _guiPage[index]; } void setGuiPage(const StringList& guiPage) { _guiPage = guiPage; } void setGuiPage(const std::string& guiPage, std::size_t index) { if (index >= _numPages) throw std::runtime_error(_("GUI Page Index out of bounds.")); _guiPage[index] = guiPage; } // sndPageTurn-statement. const std::string& getSndPageTurn() const{ return _sndPageTurn; } void setSndPageTurn(const std::string& sndPageTurn) { _sndPageTurn = sndPageTurn; } private: //Methods for export: // Generates the XData-Definition for the XData-object. const std::string generateXDataDef() const; // Returns the length of the current definition. The get-pointer has to be at the beginning of that definition. Returns 0 on Syntax errors. const std::size_t getDefLength(const std::string& def) const; // Returns the definition-name found in the file or "" if multiple definitions where found. // Used by the xport()-method in the overwrite-command for checking for a DefinitionMatch or MultipleDefinitions. const std::string getDefinitionNameFromXD(boost::filesystem::ifstream& file) const; // Used to jump out of a definition. Can lead to undefined behavior on Syntax-errors. void jumpOutOfBrackets(parser::DefTokeniser& tok, int currentDepth) const; protected: // Resizes all vectors to TargetSize. virtual void resizeVectors(std::size_t targetSize); // Returns the OneSided or TwoSided Page-content-definition of an XData object. virtual const std::string getContentDef() const = 0; // Generates the XData-compatible definition for Multi-line strings and adds escape-characters before quotes. const std::string generateTextDef(const std::string& rawString) const; //Attributes: std::string _name; //name of the XData-Definition std::size_t _numPages; //numPages-statement StringList _guiPage; //guiPage-statements std::string _sndPageTurn; //sndPageTurn-statement std::size_t _definitionStart; //Marks the start of a definition in an .xd-File. Used by the xport()-method. }; class OneSidedXData : public XData { private: //page contents StringList _pageTitle; StringList _pageBody; //end of page contents const std::string getContentDef() const; void resizeVectors(std::size_t targetSize); public: void setPageContent(ContentType cc, std::size_t pageIndex, Side side, const std::string& content); const std::string& getPageContent(ContentType cc, std::size_t pageIndex, Side side) const; const PageLayout getPageLayout() const { return OneSided; } void togglePageLayout(XDataPtr& target) const; OneSidedXData(const std::string& name) { _name = name; setNumPages(MAX_PAGE_COUNT); } ~OneSidedXData() { _guiPage.clear(); _pageTitle.clear(); _pageBody.clear(); } }; typedef std::shared_ptr OneSidedXDataPtr; class TwoSidedXData : public XData { private: //page contents: StringList _pageLeftTitle; StringList _pageRightTitle; StringList _pageLeftBody; StringList _pageRightBody; //end of page contents const std::string getContentDef() const; void resizeVectors(std::size_t targetSize); public: void setPageContent(ContentType cc, std::size_t pageIndex, Side side, const std::string& content); const std::string& getPageContent(ContentType cc, std::size_t pageIndex, Side side) const; const PageLayout getPageLayout() const { return TwoSided; } void togglePageLayout(XDataPtr& target) const; TwoSidedXData(const std::string& name) { _name=name; setNumPages(MAX_PAGE_COUNT); } ~TwoSidedXData() { _pageLeftTitle.clear(); _pageLeftBody.clear(); _pageRightBody.clear(); _pageRightTitle.clear(); _guiPage.clear(); } }; typedef std::shared_ptr TwoSidedXDataPtr; } //namespace XData #endif /* XDATA_H */ DarkRadiant-2.0.2/plugins/dm.gui/XDataLoader.cpp000066400000000000000000000605721245424655700214270ustar00rootroot00000000000000#include "XDataLoader.h" #include "iarchive.h" #include "boost/lexical_cast.hpp" namespace XData { const bool XDataLoader::importDef( const std::string& definitionName, XDataMap& target, const std::string& filename ) { // Initialization: _errorList.clear(); _newXData.reset(); target.clear(); StringList files; if (filename != "") { //Check fileextension: if (filename.substr( filename.rfind(".")+1 ) != "xd") return reportError("[XDataLoader::import] Error: File-extension is not .xd: " + filename + "\n"); files.push_back(filename); } else { //Find the files in which the definition can be found. retrieveXdInfo(); StringVectorMap::iterator it = _defMap.find(definitionName); if (it == _defMap.end()) return reportError("[XDataLoader::importDef] Error: Specified definition " + definitionName + " not found.\n"); files = it->second; if (files.size() > 1) //Definition contained in multiple files. reportError("[XData::import] Warning: The requested definition " + definitionName + " exists in multiple files.\n"); } // Parse the requested definition from all files: for (std::size_t n = 0; n < files.size(); n++) { // Attempt to open the file in text mode and retrieve DefTokeniser ArchiveTextFilePtr file = GlobalFileSystem().openTextFile(files[n]); if (file == NULL) return reportError("[XDataLoader::importDef] Error: Failed to open file " + files[n] + "\n"); std::istream is(&(file->getInputStream())); parser::BasicDefTokeniser tok(is); // Parse the desired definition: while (tok.hasMoreTokens() && !parseXDataDef(tok,definitionName)) {} if (_newXData) target.insert(XDataMap::value_type(file->getModName() + "/" + file->getName(),_newXData)); else reportError("[XDataLoader::importDef] Error: Failed to load " + definitionName + " from file " + files[n] + ".\n"); } //Summarizing report: if (target.size() == 0) { if (filename == "") reportError("[XDataLoader::importDef] Error: Failed to load " + definitionName + ".\n"); return false; } else { _errorList.push_back("[XDataLoader::importDef] " + definitionName + " loaded successfully with " + boost::lexical_cast(_errorList.size()) + " error(s)/warning(s).\n"); //Summary output: if (_errorList.size() > 1) std::cerr << _errorList[_errorList.size()-1]; else rMessage() << _errorList[0]; } return true; } const bool XDataLoader::import( const std::string& filename, XDataMap& target ) { //initialization: _errorList.clear(); target.clear(); unsigned int ErrorCount = 0; //Check fileextension: if (filename.substr( filename.rfind(".")+1 ) != "xd") return reportError("[XDataLoader::import] Fileextension is not .xd: " + filename + "\n"); // Attempt to open the file in text mode and retrieve DefTokeniser ArchiveTextFilePtr file = GlobalFileSystem().openTextFile(filename); if (file == NULL) return reportError("[XDataLoader::import] Failed to open file: " + filename + "\n"); std::istream is(&(file->getInputStream())); parser::BasicDefTokeniser tok(is); //Parse Loop: while (tok.hasMoreTokens()) { if (parseXDataDef(tok)) target.insert(XDataMap::value_type(_newXData->getName(),_newXData)); else ErrorCount += 1; } //Write summary _errorList.push_back( "[XDataLoader::import] Import finished with " + boost::lexical_cast(_errorList.size()) + " error(s)/warning(s). " + boost::lexical_cast(target.size()) + " XData-definition(s) successfully imported, but failed to import at least " + boost::lexical_cast(ErrorCount) + " definitions.\n" ); //Summary output: if (_errorList.size() == 1) //No errors. rMessage() << _errorList[0]; else std::cerr << _errorList[_errorList.size()-1]; if (target.size() == 0) return false; return true; } // XDataLoader::import const bool XDataLoader::parseXDataDef(parser::DefTokeniser& tok, const std::string& definitionName) { _name = tok.nextToken(); _newXData.reset(); //Check Syntax: try { tok.assertNextToken("{"); } catch (...) { while (tok.hasMoreTokens() && (tok.nextToken() != "{")) {} jumpOutOfBrackets(tok); return reportError(tok, "[XDataLoader::import] Syntaxerror in definition: " + _name + ". '{' expected. Undefined behavior!\n\tTrying to Jump to next XData definition. Might lead to furthers errors.\n"); } //Check if every definition shall be parsed or only a specific one: if (!definitionName.empty() && _name != definitionName) { jumpOutOfBrackets(tok); return false; } //Initialization: _guiPageError.clear(); _maxPageCount = 0; _maxGuiNumber = 0; _guiPageDef = ""; _numPages = 0; _sndPageTurn = ""; _guiPage.clear(); _guiPage.resize(MAX_PAGE_COUNT,""); //see MAX_PAGE_COUNT declaration in XData.h for explanation. //Parse-Loop: while (tok.hasMoreTokens()) { std::string token = tok.nextToken(); if (token == "}") break; if (!storeContent(token, &tok, _name)) return false; } //cleaning up: if ( _maxGuiNumber+1 > _numPages) //Append missing GUI-errormessages... Until now, it wasn't clear how many guipages are actually discarded. { int diff = _maxGuiNumber + 1 - _maxPageCount; for (unsigned int n = _guiPageError.size()-diff; n<_guiPageError.size(); n++) { reportError(_guiPageError[n]); } } // Check if _guiPage-statements for all pages are available. if (_guiPageDef.empty()) { reportError("[XDataLoader::import] Warning for definition: " + _name + ". _guiPage-statement(s) missing. Setting default value...\n"); if (_newXData->getPageLayout() == TwoSided) _guiPageDef = DEFAULT_TWOSIDED_GUI; else _guiPageDef = DEFAULT_ONESIDED_GUI; } for (std::size_t n=0; n<_numPages; n++ ) { if (_guiPage[n].empty()) _guiPage[n] = _guiPageDef; } //Store values: _newXData->setGuiPage(_guiPage); _newXData->setNumPages(_numPages); //Use default sndPageTurn if the statement was missing: if (_sndPageTurn.empty()) { _newXData->setSndPageTurn(DEFAULT_SNDPAGETURN); reportError("[XDataLoader::import] Warning for definition: " + _name + ". _sndPageTurn-statement missing. Setting default value...\n"); } else _newXData->setSndPageTurn(_sndPageTurn); return true; } const bool XDataLoader::storeContent(const std::string& statement, parser::DefTokeniser* tok, const std::string& defName, const std::string& content) { //page-statement: if (statement.substr(0,4) == "page") { //Now that it is known, whether we are dealing with a Two- or OneSidedXDataObject, create the XData object. if (!_newXData) { if (statement.find("left",6) != std::string::npos || statement.find("right",6) != std::string::npos) //TwoSided _newXData = XDataPtr(new TwoSidedXData(_name)); else _newXData = XDataPtr(new OneSidedXData(_name)); } //Acquire PageIndex std::size_t PageIndex; std::size_t numEnd = 4; while (statement[numEnd++] != '_') {} std::string number = statement.substr(4,numEnd-5); try { PageIndex = boost::lexical_cast(number)-1; } catch (...) { if (tok != NULL) { _newXData.reset(); return reportError(*tok, "[XDataLoader::import] Error in definition: " + defName + ", " + statement + " statement. '" + number + "' is not a number.\n\tTrying to Jump to next XData definition. Might lead to furthers errors.\n" ); } _newXData.reset(); return reportError("[XDataLoader::import] Error in definition: " + defName + ", " + statement + " statement. '" + number + "' is not a number.\n" ); } //Read content std::string readContent; if (tok != NULL) { if (!readLines(*tok, readContent)) { _newXData.reset(); return reportError(*tok, "[XDataLoader::import] Error in definition: " + defName + ". Failed to read content of " + statement + " statement.\n\tTrying to Jump to next XData definition. Might lead to furthers errors.\n" ); } } else readContent = content; // Check whether readContent actually has content. (There might be space, linebreaks and tabs that can be discarded) bool hasContent = false; for (std::size_t n = 0; n < readContent.size(); n++) { if ( (readContent[n] != ' ') && (readContent[n] != '\t') && (readContent[n] != '\n') ) { hasContent = true; break; } } //Check PageIndex-Range if (PageIndex >= _numPages ) { if (hasContent) //_numPages is raised automatically, if a page with content is detected... { _numPages = PageIndex+1; reportError("[XDataLoader::import] Warning for definition: " + defName + ", " + statement + " statement.\n\tnumPages not (yet) specified or too low. Raising _numPages to " + number +"...\n" ); } else { reportError("[XDataLoader::import] Warning for definition: " + defName + ", " + statement + " statement.\n\tnumPages not (yet) specified or too low. However, this page does not contain any text and is discarded...\n" ); return true; } } //Refresh the _maxPageCount variable if this page has content. if (hasContent) { if (_maxPageCount < PageIndex+1) _maxPageCount = PageIndex+1; //Write the content into the XData object Side side; if (statement.find("left",6) != std::string::npos) //Side is discarded on OneSidedXData... side = Left; else side = Right; if (statement.find("body",6) != std::string::npos) _newXData->setPageContent(Body, PageIndex, side, readContent); //could throw if PageIndex >= MAX_PAGE_COUNT. Unlikely! else _newXData->setPageContent(Title, PageIndex, side, readContent); } return true; } //gui_page statement else if (statement.substr(0,8) == "gui_page") { //Acquire gui_page number: std::string number = statement.substr(8); std::size_t guiNumber; try { guiNumber = boost::lexical_cast(number)-1; } catch (...) { if (tok != NULL) { _newXData.reset(); return reportError(*tok, "[XDataLoader::import] Error in definition: " + defName + ", gui_page statement. '" + number + "' is not a number.\n\tTrying to Jump to next XData definition. Might lead to furthers errors.\n" ); } _newXData.reset(); return reportError("[XDataLoader::import] Error in definition: " + defName + ", gui_page statement. '" + number + "' is not a number.\n"); } if (_maxGuiNumber < guiNumber) _maxGuiNumber = guiNumber; //Get the GuiPageDef: if (tok != NULL) { if (!readLines(*tok, _guiPageDef)) { _newXData.reset(); return reportError(*tok, "[XDataLoader::import] Error in definition: " + defName + ". Failed to read content of " + statement + " statement.\n\tTrying to Jump to next XData definition. Might lead to furthers errors.\n" ); } } else _guiPageDef = content; _guiPage[ guiNumber ] = _guiPageDef; //could throw if guiNumber >= MAX_PAGE_COUNT //Append error-message if _numPages is exceeded. if (guiNumber >= _numPages) _guiPageError.push_back("[XDataLoader::import] Warning for definition: " + defName + ". More _guiPage statements, than pages. Discarding statement for Page " + number + ".\n" ); return true; } //num_pages statement else if (statement == "num_pages") { //Get num_pages: if (tok != NULL) { std::string number; if (!readLines(*tok, number)) { _newXData.reset(); return reportError(*tok, "[XDataLoader::import] Error in definition: " + defName + ". Failed to read content of " + statement + " statement.\n\tTrying to Jump to next XData definition. Might lead to furthers errors.\n" ); } try { _numPages = boost::lexical_cast(number); } catch(...) { _newXData.reset(); return reportError(*tok, "[XDataLoader::import] Error in definition: " + defName + ", num_pages statement. '" + number + "' is not a number.\n\tTrying to Jump to next XData definition. Might lead to furthers errors.\n" ); } } else { try { _numPages = boost::lexical_cast(content); } catch (...) { return reportError("[XDataLoader::import] Error in definition: " + defName + ", num_pages statement. '" + content + "' is not a number.\n" ); } } //Correct a faulty _numPages value if (_maxPageCount > _numPages) { _numPages = _maxPageCount; reportError("[XDataLoader::import] Warning for definition: " + defName + ". The specified _numPages statement did not match the amount of pages with content.\n\tnumPages is set to " + boost::lexical_cast(_numPages) + ".\n"); } return true; } //snd_page_turn statement else if (statement == "snd_page_turn") { if (tok != NULL) { if (!readLines(*tok, _sndPageTurn)) { _newXData.reset(); return reportError(*tok, "[XDataLoader::import] Error in definition: " + defName + ". Failed to read content of " + statement + " statement.\n\tTrying to Jump to next XData definition. Might lead to furthers errors.\n" ); } } else _sndPageTurn = content; return true; } //import statement else if (statement == "import") { StringPairList importedData; std::string SourceDef; StringMap statements; if (tok == NULL) //Only works with def tokeniser. { _newXData.reset(); return false; } if (!getImportParameters(*tok, statements, SourceDef, defName)) { _newXData.reset(); return false; } retrieveXdInfo(); //refresh defmap. Prevents faulty imports. if (!recursiveImport(SourceDef, statements, defName, importedData)) { _errorList[_errorList.size()-1] += "\tTrying to Jump to next XData definition. Might lead to furthers errors.\n"; jumpOutOfBrackets(*tok); _newXData.reset(); return false; } for (std::size_t n=0; n < importedData.size(); n++) { if (!storeContent(importedData[n].first, NULL, defName, importedData[n].second)) { _newXData.reset(); return reportError(*tok, "[XDataLoader::import] Error in definition: " + defName + ". Import-statement failed.\n\tTrying to Jump to next XData definition. Might lead to furthers errors.\n" ); } } return true; } else if (statement == "precache") { return true; } _newXData.reset(); jumpOutOfBrackets(*tok); return false; } const bool XDataLoader::recursiveImport( const std::string& sourceDef, const StringMap& statements, const std::string& defName, StringPairList& importContent) { //Check where the Definition is stored in the _defMap StringVectorMap::iterator it = _defMap.find(sourceDef); if (it == _defMap.end()) //Definition not found!! return reportError("[XData::import] Error in definition: " + defName + ". Found an import-statement, but not the corresponding definition.\n"); std::size_t FileCount = it->second.size(); if (FileCount > 1) //Definition contained in multiple files. reportError( "[XData::import] Warning for definition: " + defName + ". Found an import-statement and the referenced definition exists multiple times.\n" ); //Try every file the definition is stored in. If import of none succeeded, the import failed. for (std::size_t k = 0; k < FileCount; k++) { //Init StringMap StmtsCpy = statements; StringMap ImpStmts; std::string ImpSrcDef = ""; int BracketDepth = 1; //Open the file ArchiveTextFilePtr file = GlobalFileSystem().openTextFile(it->second[k]); if (file == NULL) return reportError( "[XData::import] Error in definition: " + defName + ". Found an import-statement, but failed to open the corresponding file: " + it->second[k] + ".\n" ); //Find the Source-Definition in the File: std::istream is(&(file->getInputStream())); parser::BasicDefTokeniser ImpTok(is); while (true) { while ( ImpTok.nextToken() != sourceDef) {} if ( ImpTok.nextToken() == "{") break; } //Import-Loop: Find the SourceStatements in the definition and parse the contents. //Further Import-directives possibly have to be handled recursively... while (ImpTok.hasMoreTokens()) { //Find SourceStatements or further import-statements. Count entering and leaving brackets to identify definition end. std::string token = ImpTok.nextToken(); StringMap::iterator StIt = StmtsCpy.find(token); if (StIt != StmtsCpy.end()) { //Token found that matches the Source statement. Parse it and delete statement from StmtsCpy afterwards. std::string StmtCtnt; if (readLines(ImpTok, StmtCtnt)) { importContent.push_back( StringPairList::value_type( StIt->second, StmtCtnt )); StmtsCpy.erase(StIt); } else if (!ImpTok.hasMoreTokens()) { //Syntaxerror! std::string errMSG = "[XData::import] Error in definition: " + defName + ". Found an import-statement, but an sytax-error occured in the definition " + sourceDef + ", in sourcefile " + it->second[k] + ".\n"; if ( (FileCount > 1) && (k+1 < FileCount) ) errMSG += "\tThe referenced definition has been found in multiple files. Trying next file...\n"; reportError(errMSG); break; } else //The found token was not an actual statement. continue; } else if (token == "{") BracketDepth += 1; else if (token == "}") BracketDepth -= 1; else if (token == "import") { //getImportParameters fails on syntax errors or EOF (which is an syntax-error as well), so go on with next file. if (!getImportParameters(ImpTok, ImpStmts, ImpSrcDef, defName)) { std::string errMSG = "[XData::import] Error in definition: " + defName + ". Found an import-statement, but an sytax-error occured in the definition " + sourceDef + ", in sourcefile " + it->second[k] + ".\n"; if ( (FileCount > 1) && (k < FileCount-1) ) errMSG += "\tThe referenced definition has been found in multiple files. Trying next file...\n"; reportError(errMSG); break; } } if (StmtsCpy.size() == 0) //Success: Return! return true; if (BracketDepth == 0) { //Not all Source-statements have been found in the definition. If an import statement has been found //check if all requested statements would be imported by it. if (ImpSrcDef != "") { StringMap ChkStmts = StmtsCpy; StringMap RecoverStatements; for (StringMap::iterator impCheck = ImpStmts.begin(); impCheck != ImpStmts.end(); impCheck++) { StringMap::iterator temp = ChkStmts.find(impCheck->second); if (temp != ChkStmts.end()) { ChkStmts.erase(temp); RecoverStatements.insert(*impCheck); } } if (ChkStmts.size() == 0) { //All necessary statements found in import-directive. StringPairList imported; if (recursiveImport(ImpSrcDef,RecoverStatements,sourceDef,imported)) { //Success! Store imported contents and return! for (std::size_t u = 0; u < imported.size(); u++) { importContent.push_back( StringPairList::value_type( StmtsCpy.find(imported[u].first)->second, imported[u].second )); } return true; } else { std::string errMSG = "[XData::import] Error in definition: " + defName + ". Found an import-statement, but failed to import the requested statements of definition " + sourceDef + ", in sourcefile " + it->second[k] + ".\n"; if ( (FileCount > 1) && (k < FileCount-1) ) errMSG += "\tThe referenced definition has been found in multiple files. Trying next file...\n"; reportError(errMSG); break; } } } //No import-statement found or not all requested definitions in import statement. Move on with next file. std::string errMSG = "[XData::import] Error in definition: " + defName + ". Found an import-statement, but couldn't find all referenced statements in the definition " + sourceDef + ", in sourcefile " + it->second[k] + ".\n"; if ( (FileCount > 1) && (k < FileCount-1) ) errMSG += "\tThe referenced definition has been found in multiple files. Trying next file...\n"; reportError(errMSG); break; } //End of definition was reached! } //End of Import-Loop } //End of File-duplicate-Loop return reportError("[XData::import] Error in definition: " + defName + ". Import-statement failed.\n"); } const bool XDataLoader::getImportParameters(parser::DefTokeniser& tok, StringMap& statements, std::string& sourceDef, const std::string& defName) { std::string token; //Enter content brackets try { tok.assertNextToken("{"); } catch(...) { return reportError(tok, "[XDataLoader::import] Syntax error in definition: " + defName + ", import-statement. '{' expected. Undefined behavior!\n" ); } //Get Source- and DestStatements try { token = tok.nextToken(); while (token != "}") { tok.skipTokens(1); //Skip "->" statements.insert( StringMap::value_type(token,tok.nextToken()) ); token = tok.nextToken(); } } catch (...) { return reportError(tok, "[XDataLoader::import] Error in definition: " + defName + ". Failed to read content of import-statement. Probably Syntax-error.\n" + "\tTrying to Jump to next XData definition. Might lead to furthers errors.\n", 2 ); } //Get Name of Source-Definition try { tok.assertNextToken("from"); } catch (...) { return reportError(tok, "[XDataLoader::import] Syntax error in definition: " + defName + ", import-statement. 'from' expected. Undefined behavior!\n" + "\tTrying to Jump to next XData definition. Might lead to furthers errors.\n" ); } try { sourceDef = tok.nextToken(); } catch (...) { return reportError(tok, "[XDataLoader::import] Error in definition: " + defName + ". Failed to read content of import-statement.\n" + "\tTrying to Jump to next XData definition. Might lead to furthers errors.\n" ); } return true; } inline const bool XDataLoader::readLines(parser::DefTokeniser& tok, std::string& what) const { std::stringstream out; std::string token; //Check Syntax try { tok.assertNextToken(":"); what = tok.nextToken(); if (what != "{" ) //Parsing SingleLine Content return true; //Parse MultiLine Content. token = tok.nextToken(); while (token != "}") { if (token == "/") //newlines can also be signalized by slashed. Ignore them { token = tok.nextToken(); continue; } else if (token.c_str()[token.length()-1] == '\\') //support for escaped quotes in texts... token = token.substr(0,token.length()-1) + "\""; else token = token + "\n"; out << token; token = tok.nextToken(); } } catch (...) { return false; } what = out.str(); return true; } void XDataLoader::jumpOutOfBrackets(parser::DefTokeniser& tok, std::size_t currentDepth) const { while ( tok.hasMoreTokens() && currentDepth > 0) { std::string token = tok.nextToken(); if (token == "{") currentDepth += 1; else if (token == "}") currentDepth -= 1; } } void XDataLoader::retrieveXdInfo() { _defMap.clear(); _fileSet.clear(); _duplicatedDefs.clear(); //ScopedDebugTimer timer("XData definitions parsed: "); GlobalFileSystem().forEachFile(XDATA_DIR, XDATA_EXT, [&](const std::string& filename) { loadFromFile(filename); }, 99); } void XDataLoader::loadFromFile(const std::string& filename) { // Attempt to open the file in text mode ArchiveTextFilePtr file = GlobalFileSystem().openTextFile(XDATA_DIR + filename); if (file != NULL) { // File is open, so add the file to the _fileSet-set and parse the tokens _fileSet.insert(file->getModName() + "/" + file->getName()); try { std::istream is(&(file->getInputStream())); parser::BasicDefTokeniser tok(is); //grab all names from stream: while (tok.hasMoreTokens()) { std::string tempstring = tok.nextToken(); tok.assertNextToken("{"); std::pair ret = _defMap.insert( StringVectorMap::value_type(tempstring, StringList(1, XDATA_DIR + filename) ) ); if (!ret.second) //Definition already exists. { ret.first->second.push_back(XDATA_DIR + filename); rError() << "[XDataLoader] The definition " << tempstring << " of the file " << filename << " already exists. It was defined at least once. First in " << ret.first->second[0] << ".\n"; //Create an entry in the _duplicatedDefs map with the original file. If entry already exists, insert will fail. std::pair duplRet = _duplicatedDefs.insert( StringVectorMap::value_type(tempstring, StringList(1,ret.first->second[0]) ) ); //The new file is appended to the vector. duplRet.first->second.push_back(XDATA_DIR + filename); } jumpOutOfBrackets(tok); } } catch (parser::ParseException& e) { rError() << "[XDataLoader] Failed to parse " << filename << ": " << e.what() << std::endl; } } else { rError() << "[XDataLoader] Unable to open " << filename << std::endl; } } } // namespace XData DarkRadiant-2.0.2/plugins/dm.gui/XDataLoader.h000066400000000000000000000151031245424655700210620ustar00rootroot00000000000000#ifndef XDATALOADER_H #define XDATALOADER_H #include "XData.h" #include "parser/DefTokeniser.h" #include #include "ifilesystem.h" namespace XData { namespace { const std::string XDATA_DIR = "xdata/"; const std::string XDATA_EXT = "xd"; } typedef std::set StringSet; typedef std::map XDataMap; typedef std::map > StringVectorMap; typedef std::map StringMap; typedef std::vector > StringPairList; ///////////////////////////// XDataSelector: // Class for importing XData from files and retrieving fileinfos: duplicated definitions, // List of all definitions with their corresponding filename. class XDataLoader { // Notes: // -Importer cannot cope with multiple definitions in a single file currently. public: // Imports a MultiMap of XData-Pointers sorted by name from the specified File (just the name, not the path). // Returns false if import failed. The import-breaking error-message is the last element of _errorList, which can // be retrieved by calling getImportSummary() and also stores other errors and warnings. // -target: Key Value = definitionName, Mapped Value = XData object. const bool import(const std::string& filename, XDataMap& target); // Imports a single Definition from the specified file (filename) if defined or all duplicated definitions if only // the definitionName is specified. Returns false if import failed. The import-breaking error-message is the last // element of _errorList, which can be retrieved by calling getImportSummary() and also stores other errors and warnings. // -target: Key Value = filepath INCLUDING ModPath(!!), Mapped Value = XData object. const bool importDef(const std::string& definitionName, XDataMap& target, const std::string& filename = ""); virtual ~XDataLoader() { _defMap.clear(); _duplicatedDefs.clear(); _fileSet.clear(); _errorList.clear(); _guiPageError.clear(); _guiPage.clear(); } //Getters: // Returns StringVector with errors and warnings of the last import process // as well as a brief summary in the last element of the vector. const StringList& getImportSummary() const { return _errorList; } // Returns Map of duplicated definitions. (Data might be outdated, maybe use retrieveXdInfo() before) // Key Value = DefinitionNames, Mapped Value = StringVector of corresponding filenames. const StringVectorMap& getDuplicateDefinitions() const { if (_duplicatedDefs.empty()) { throw std::runtime_error("No Data available. Call retrieveXdInfo() before."); } return _duplicatedDefs; } // Returns StringSet of all .xd-files in the VFS. (Data might be outdated, maybe use retrieveXdInfo() before) const StringSet& getXdFilenameList() const { if (_fileSet.empty()) throw std::runtime_error("No Data available. Call retrieveXdInfo() before."); return _fileSet; } // Returns a map of all Definitions and their corresponding filenames found in the VFS. The filenames are stored // in a vector in case a definition exists multiple times. (Data might be outdated, maybe use retrieveXdInfo() before) const StringVectorMap& getDefinitionList() const { if (_defMap.empty()) throw std::runtime_error("No Data available. Call retrieveXdInfo() before."); return _defMap; } // Retrieves all XData-related information found in the VFS. void retrieveXdInfo(); // Functor operator: Adds all definitions found in the target file to the _defMap. void loadFromFile(const std::string& filename); private: // Issues the ErrorMessage to the cerr console and appends it to the _errorList. Returns always false, so that it can be used after a return statement. const bool reportError(const std::string& ErrorMessage) { std::cerr << ErrorMessage; _errorList.push_back(ErrorMessage); return false; } // Additionally to what the upper version of reportError(..) does, this method also tries to jump to the next definition by calling jumpOutOfBrackets. const bool reportError(parser::DefTokeniser& tok, const std::string& ErrorMessage, std::size_t currentDepth = 1) { reportError(ErrorMessage); jumpOutOfBrackets(tok, currentDepth); return false; } // Opens the file in which sourceDef is contained, while handling duplicate definitions. // -statements: Key value = Statements in sourceDef, Mapped value = Statement in the calling definition to whom the imported content shall be parsed. // -defName: Name of the definition that has induced the recursiveImport. This is just used for error reporting. // -importContent: Vector of stringpairs. First = Name of the destination Statement in the calling definition, Second = Imported Content. const bool recursiveImport(const std::string& sourceDef, const StringMap& statements, const std::string& defName, StringPairList& importContent); // Parses the contents of the import-statement. const bool getImportParameters(parser::DefTokeniser& tok, StringMap& statements, std::string& sourceDef, const std::string& defName); // Checks where the content following in the tokenizer has to be stored. DefName is the name of the // definition for whom content is parsed and is just used for error-messages. If tok is NULL, the string content is stored. This // is only induced by the import-directive, which on the contrary must have tok!= NULL. const bool storeContent(const std::string& statement, parser::DefTokeniser* tok, const std::string& defName, const std::string& content = ""); // Parses a single definition from a stream into an XData object and generates warning and error messages. If definitionName // is defined, only matching definitions will be parsed and return false otherwise. const bool parseXDataDef(parser::DefTokeniser& tok, const std::string& definitionName = ""); // Skips the ":" and parses the following SingleLine or MultiLine content into What. const bool readLines(parser::DefTokeniser& tok, std::string& what) const; // Used to jump out of a definition. Can lead to undefined behavior on Syntax-errors. void jumpOutOfBrackets(parser::DefTokeniser& tok, std::size_t currentDepth = 1) const; //General Member variables: StringList _errorList; StringVectorMap _defMap; StringSet _fileSet; StringVectorMap _duplicatedDefs; //Helper-variables for import: XDataPtr _newXData; std::string _name; StringList _guiPageError; std::size_t _maxPageCount; std::size_t _maxGuiNumber; std::string _guiPageDef; std::size_t _numPages; std::string _sndPageTurn; StringList _guiPage; }; // XDataLoader class typedef std::shared_ptr XDataLoaderPtr; } // namespace XData #endif /* XDATALOADER_H */ DarkRadiant-2.0.2/plugins/dm.gui/XDataSelector.cpp000066400000000000000000000063271245424655700217770ustar00rootroot00000000000000#include "XDataSelector.h" #include "i18n.h" #include "imainframe.h" #include "iuimanager.h" #include "ReadableEditorDialog.h" #include #include namespace ui { namespace { const char* const WINDOW_TITLE = N_("Choose an XData Definition..."); const int WINDOW_WIDTH = 500; const int WINDOW_HEIGHT = 600; const char* const XDATA_ICON = "sr_icon_readable.png"; const char* const FOLDER_ICON = "folder16.png"; } XDataSelector::XDataSelector(const XData::StringVectorMap& files, ReadableEditorDialog* editorDialog) : DialogBase(_(WINDOW_TITLE), editorDialog), _store(new wxutil::TreeModel(_columns)), _files(files), _editorDialog(editorDialog) { _xdataIcon.CopyFromBitmap(wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + XDATA_ICON)); _folderIcon.CopyFromBitmap(wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + FOLDER_ICON)); fillTree(); SetSize(WINDOW_WIDTH, WINDOW_HEIGHT); // Add a vbox for the dialog elements SetSizer(new wxBoxSizer(wxVERTICAL)); // Add a vbox for the dialog elements wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); GetSizer()->Add(vbox, 1, wxEXPAND | wxALL, 12); // Create the treeview _view = wxutil::TreeView::CreateWithModel(this, _store, wxDV_NO_HEADER); _view->AppendIconTextColumn(_("Xdata Path"), _columns.name.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); _view->Connect(wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(XDataSelector::onSelectionChanged), NULL, this); // Use the TreeModel's full string search function _view->AddSearchColumn(_columns.name); vbox->Add(_view, 1, wxEXPAND | wxBOTTOM, 6); vbox->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxALIGN_RIGHT); FindWindowById(wxID_OK, this)->Enable(false); CenterOnParent(); } std::string XDataSelector::run(const XData::StringVectorMap& files, ReadableEditorDialog* editorDialog) { XDataSelector* dialog = new XDataSelector(files, editorDialog); std::string rv = ""; if (dialog->ShowModal() == wxID_OK) { rv = dialog->_selection; } dialog->Destroy(); return rv; } void XDataSelector::visit(wxutil::TreeModel& /* store */, wxutil::TreeModel::Row& row, const std::string& path, bool isExplicit) { row[_columns.name] = wxVariant(wxDataViewIconText(path.substr(path.rfind("/") + 1), isExplicit ? _xdataIcon : _folderIcon)); row[_columns.fullName] = path; row[_columns.isFolder] = !isExplicit; row.SendItemAdded(); } void XDataSelector::fillTree() { // Start adding to tree. wxutil::VFSTreePopulator populator(_store); for (XData::StringVectorMap::const_iterator it = _files.begin(); it != _files.end(); ++it) { populator.addPath(it->first); } populator.forEachNode(*this); _store->SortModelFoldersFirst(_columns.name, _columns.isFolder); } void XDataSelector::onSelectionChanged(wxDataViewEvent& ev) { wxDataViewItem item = _view->GetSelection(); if (item.IsOk()) { wxutil::TreeModel::Row row(item, *_store); if (!row[_columns.isFolder].getBool()) { _selection = row[_columns.fullName]; _editorDialog->updateGuiView(this, "", _selection); FindWindowById(wxID_OK, this)->Enable(true); return; } } FindWindowById(wxID_OK, this)->Enable(false); } } // namespace ui DarkRadiant-2.0.2/plugins/dm.gui/XDataSelector.h000066400000000000000000000034541245424655700214420ustar00rootroot00000000000000#pragma once #include "XDataLoader.h" #include "wxutil/dialog/DialogBase.h" #include "wxutil/VFSTreePopulator.h" #include "wxutil/TreeView.h" namespace ui { class ReadableEditorDialog; ///////////////////////////// XDataSelector: // Runs a dialog for choosing XData definitions, which updates the guiView of the calling // ReadableEditorDialog for previewing. class XDataSelector : public wxutil::DialogBase, public wxutil::VFSTreePopulator::Visitor { private: // Treestore enum struct XdataTreeModelColumns : public wxutil::TreeModel::ColumnRecord { XdataTreeModelColumns() : name(add(wxutil::TreeModel::Column::IconText)), fullName(add(wxutil::TreeModel::Column::String)), isFolder(add(wxutil::TreeModel::Column::Boolean)) {} wxutil::TreeModel::Column name; wxutil::TreeModel::Column fullName; wxutil::TreeModel::Column isFolder; }; // The tree XdataTreeModelColumns _columns; wxutil::TreeModel::Ptr _store; wxutil::TreeView* _view; // A Map of XData files. Basically just the keyvalues are needed. XData::StringVectorMap _files; // The name of the chosen definition std::string _selection; // Pointer to the ReadableEditorDialog for updating the guiView. ReadableEditorDialog* _editorDialog; wxIcon _xdataIcon; wxIcon _folderIcon; public: // Runs the dialog and returns the name of the chosen definition. static std::string run(const XData::StringVectorMap& files, ReadableEditorDialog* editorDialog); void visit(wxutil::TreeModel& store, wxutil::TreeModel::Row& row, const std::string& path, bool isExplicit); private: // private contructor called by the run method. XDataSelector(const XData::StringVectorMap& files, ReadableEditorDialog* editorDialog); void fillTree(); void onSelectionChanged(wxDataViewEvent& ev); // view is manually bound }; } //namespace ui DarkRadiant-2.0.2/plugins/dm.gui/XdFileChooserDialog.cpp000066400000000000000000000072661245424655700231160ustar00rootroot00000000000000#include "XdFileChooserDialog.h" #include "wxutil/dialog/MessageBox.h" #include "i18n.h" #include "imainframe.h" #include "ReadableEditorDialog.h" #include #include #include "idialogmanager.h" namespace ui { namespace { const char* const WINDOW_TITLE = N_("Choose a file..."); } int XdFileChooserDialog::Import(const std::string& defName, XData::XDataPtr& newXData, std::string& filename, XData::XDataLoaderPtr& loader, ReadableEditorDialog* editorDialog) { // Import the file: XData::XDataMap xdMap; if (loader->importDef(defName,xdMap)) { if (xdMap.size() > 1) { // The requested definition has been defined in multiple files. Use the XdFileChooserDialog to pick a file. // Optimally, the preview renderer would already show the selected definition. XdFileChooserDialog* fcDialog = new XdFileChooserDialog(defName, xdMap, editorDialog); int result = fcDialog->ShowModal(); if (result == wxID_OK) { XData::XDataMap::iterator ChosenIt = xdMap.find(fcDialog->_chosenFile); filename = ChosenIt->first; newXData = ChosenIt->second; } fcDialog->Destroy(); return result; } else { filename = xdMap.begin()->first; newXData = xdMap.begin()->second; if (loader->getImportSummary().size() > 1) { std::string msg = (boost::format(_("%s successfully imported.")) % defName).str(); msg += "\n\nHowever, there were some problems.\n\n"; msg += _("Do you want to open the import summary?"); wxutil::Messagebox dialog(_("Problems during import"), msg, ui::IDialog::MESSAGE_ASK, editorDialog ); if (dialog.run() == ui::IDialog::RESULT_YES) { editorDialog->showXdImportSummary(); } } } return wxID_OK; } throw ImportFailedException(_("Import failed")); } XdFileChooserDialog::XdFileChooserDialog(const std::string& defName, const XData::XDataMap& xdMap, ReadableEditorDialog* editorDialog) : DialogBase(_(WINDOW_TITLE), editorDialog), _listStore(new wxutil::TreeModel(_columns, true)), _treeview(NULL), _editorDialog(editorDialog), _defName(defName) { SetSizer(new wxBoxSizer(wxVERTICAL)); // Add a vbox for the dialog elements wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); GetSizer()->Add(vbox, 1, wxEXPAND | wxALL, 12); // Create topLabel wxStaticText* topLabel = new wxStaticText(this, wxID_ANY, _("The requested definition has been found in multiple Files. Choose the file:")); // Create the list of files: _treeview = wxutil::TreeView::CreateWithModel(this, _listStore, wxDV_NO_HEADER); _treeview->AppendTextColumn(_("File"), _columns.name.getColumnIndex(), wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE); // Append all xdMap-entries to the list. for (XData::XDataMap::const_iterator it = xdMap.begin(); it != xdMap.end(); ++it) { wxutil::TreeModel::Row row = _listStore->AddItem(); row[_columns.name] = it->first; row.SendItemAdded(); } // Connect the selection change signal _treeview->Connect(wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler(XdFileChooserDialog::onSelectionChanged), NULL, this); //Add everything to the vbox and to the window. vbox->Add(topLabel, 0, wxBOTTOM, 6); vbox->Add(_treeview, 1, wxEXPAND | wxBOTTOM, 6); vbox->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxALIGN_RIGHT); } void XdFileChooserDialog::onSelectionChanged(wxDataViewEvent& ev) { wxDataViewItem item = _treeview->GetSelection(); if (item.IsOk()) { wxutil::TreeModel::Row row(item, *_listStore); _chosenFile = row[_columns.name]; _editorDialog->updateGuiView(this, "", _defName, _chosenFile.substr(_chosenFile.find("/")+1)); } } } // namespace ui DarkRadiant-2.0.2/plugins/dm.gui/XdFileChooserDialog.h000066400000000000000000000034411245424655700225520ustar00rootroot00000000000000#pragma once #include #include "XDataLoader.h" #include "wxutil/dialog/DialogBase.h" #include "wxutil/TreeView.h" namespace ui { class ReadableEditorDialog; ///////////////////////////// XdFileChooserDialog: // Imports a given definition. If the definition has been found in multiple files, // the dialog shows up asking which file to use. class XdFileChooserDialog : public wxutil::DialogBase { public: struct ImportFailedException : public std::runtime_error { ImportFailedException(const std::string& what) : std::runtime_error(what) {} }; private: // Treestore enum struct ListStoreColumns : public wxutil::TreeModel::ColumnRecord { ListStoreColumns() : name(add(wxutil::TreeModel::Column::String)) {} wxutil::TreeModel::Column name; }; // A container for storing enumerated widgets ListStoreColumns _columns; wxutil::TreeModel::Ptr _listStore; wxutil::TreeView* _treeview; // The chosen filename. std::string _chosenFile; // Pointer to the ReadableEditorDialog for updating the guiView. ReadableEditorDialog* _editorDialog; // Definition name std::string _defName; public: // Imports the definition given by defName and stores the result in newXData and the corresponding filename. // If the definition is found in mutliple files a dialog is shown asking the user which file to use. // @throws: ImportFailedException static int Import(const std::string& defName, XData::XDataPtr& newXData, std::string& filename, XData::XDataLoaderPtr& loader, ReadableEditorDialog* editorDialog); private: // Private constructor called by run. XdFileChooserDialog(const std::string& defName, const XData::XDataMap& xdMap, ReadableEditorDialog* editorDialog); void onOk(); void onCancel(); void onSelectionChanged(wxDataViewEvent& ev); }; } // namespace ui DarkRadiant-2.0.2/plugins/dm.gui/dm.gui.def000066400000000000000000000001751245424655700204270ustar00rootroot00000000000000; dm.editing.def : Declares the module parameters for the DLL. EXPORTS ; Explicit exports can go here RegisterModule @1 DarkRadiant-2.0.2/plugins/dm.gui/gui/000077500000000000000000000000001245424655700173455ustar00rootroot00000000000000DarkRadiant-2.0.2/plugins/dm.gui/gui/Gui.cpp000066400000000000000000000032351245424655700206000ustar00rootroot00000000000000#include "Gui.h" #include "itextstream.h" namespace gui { Gui::Gui() { } const GuiWindowDefPtr& Gui::getDesktop() const { return _desktop; } void Gui::setDesktop(const GuiWindowDefPtr& newDesktop) { _desktop = newDesktop; } GuiPtr Gui::createFromTokens(parser::DefTokeniser& tokeniser) { GuiPtr gui(new Gui); while (tokeniser.hasMoreTokens()) { std::string token = tokeniser.nextToken(); if (token == "windowDef") { if (gui->getDesktop() == NULL) { GuiWindowDefPtr desktop(new GuiWindowDef(*gui)); desktop->constructFromTokens(tokeniser); gui->setDesktop(desktop); } else { rError() << "Cannot define multiple top-level windowDefs" << std::endl; } } } return gui; } void Gui::setStateString(const std::string& key, const std::string& value) { _state[key] = value; // TODO: Handle state variable links to windowDef registers } std::string Gui::getStateString(const std::string& key) { GuiState::const_iterator i = _state.find(key); return (i != _state.end()) ? i->second : ""; } void Gui::initTime(const std::size_t time) { if (_desktop != NULL) { _desktop->initTime(time, true); } } void Gui::update(const std::size_t timestep) { if (_desktop != NULL) { // Recursively update child windowDefs _desktop->update(timestep, true); } } GuiWindowDefPtr Gui::findWindowDef(const std::string& name) { // Handle "Desktop" right here if (name == "Desktop") { return _desktop; } return (_desktop != NULL) ? _desktop->findWindowDef(name) : GuiWindowDefPtr(); } void Gui::pepareRendering() { if (_desktop != NULL) { // Recursively prepare child windowDefs _desktop->pepareRendering(true); } } } // namespace DarkRadiant-2.0.2/plugins/dm.gui/gui/Gui.h000066400000000000000000000030631245424655700202440ustar00rootroot00000000000000#ifndef Gui_h__ #define Gui_h__ #include #include #include "parser/DefTokeniser.h" #include "GuiWindowDef.h" namespace gui { class Gui; typedef std::shared_ptr GuiPtr; class GuiWindowDef; typedef std::shared_ptr GuiWindowDefPtr; /** * greebo: This class represents a single D3 GUI. It holds all * the windowDefs and the source code behind. */ class Gui { private: // The desktop window GuiWindowDefPtr _desktop; // The global GUI state variables typedef std::map GuiState; GuiState _state; public: Gui(); const GuiWindowDefPtr& getDesktop() const; void setDesktop(const GuiWindowDefPtr& newDesktop); // Sets the given state variable (gui:: = ) void setStateString(const std::string& key, const std::string& value); // Returns the state string "gui::" or an empty string if non-existent std::string getStateString(const std::string& key); // Sets up the time of the entire GUI (all windowDefs) void initTime(const std::size_t time); // "Think" routine, advances all active windowDefs (where notime == false) void update(const std::size_t timestep); // Returns a reference to the named windowDef, returns NULL if not found GuiWindowDefPtr findWindowDef(const std::string& name); // Called by the GuiRenderer to re-compile text VBOs, etc. void pepareRendering(); // Takes the given token stream and attempts to construct a GUI object from it // Returns NULL on failure static GuiPtr createFromTokens(parser::DefTokeniser& tokeniser); }; } // namespace #endif // Gui_h__ DarkRadiant-2.0.2/plugins/dm.gui/gui/GuiManager.cpp000066400000000000000000000066041245424655700220760ustar00rootroot00000000000000#include "GuiManager.h" #include "iarchive.h" #include "ifilesystem.h" #include "itextstream.h" #include "parser/CodeTokeniser.h" #include "Gui.h" namespace gui { void GuiManager::loadGuiFromFile(const std::string& guiPath) { // Just store the path in the map, for later reference _guis.insert(GuiInfoMap::value_type(GUI_DIR + guiPath, GuiInfo())); } std::size_t GuiManager::getNumGuis() const { return _guis.size(); } void GuiManager::foreachGui(Visitor& visitor) { for (GuiInfoMap::iterator i = _guis.begin(); i != _guis.end(); ++i) { visitor.visit(i->first, i->second.type); } } void GuiManager::reloadGui(const std::string& guiPath) { GuiPtr gui = loadGui(guiPath); determineGuiType(gui); } GuiType GuiManager::getGuiType(const std::string& guiPath) { // Get the GUI (will load the file if necessary) GuiPtr gui = getGui(guiPath); GuiInfoMap::iterator found = _guis.find(guiPath); if (found == _guis.end()) { return FILE_NOT_FOUND; } // Gui Info found, determine readable type if necessary if (found->second.type == UNDETERMINED) { found->second.type = determineGuiType(found->second.gui); } return found->second.type; } GuiType GuiManager::determineGuiType(const GuiPtr& gui) { if (gui) { // TODO: Find a better way of distinguishing GUIs if (gui->findWindowDef("body") != NULL) { return ONE_SIDED_READABLE; } else if (gui->findWindowDef("leftBody") != NULL) { return TWO_SIDED_READABLE; } } else { return IMPORT_FAILURE; } return NO_READABLE; } void GuiManager::findGuis() { _errorList.clear(); // Traverse the file system, using this class as callback GlobalFileSystem().forEachFile(GUI_DIR, GUI_EXT, [&] (const std::string& filename) { loadGuiFromFile(filename); }, 99); rMessage() << "[GuiManager]: Found " << _guis.size() << " guis." << std::endl; } void GuiManager::clear() { _guis.clear(); _errorList.clear(); } GuiPtr GuiManager::getGui(const std::string& guiPath) { GuiInfoMap::iterator i = _guis.find(guiPath); // Path existent? if (i != _guis.end()) { // Found in the map, load if not yet attempted if (i->second.type == NOT_LOADED_YET) { loadGui(guiPath); } return i->second.gui; } // GUI not buffered, try to load afresh return loadGui(guiPath); } GuiPtr GuiManager::loadGui(const std::string& guiPath) { // Insert a new entry in the map, if necessary std::pair result = _guis.insert( GuiInfoMap::value_type(guiPath, GuiInfo()) ); GuiInfo& info = result.first->second; ArchiveTextFilePtr file = GlobalFileSystem().openTextFile(guiPath); if (file == NULL) { std::string errMSG = "Could not open file: " + guiPath + "\n"; _errorList.push_back(errMSG); rError() << errMSG; info.type = FILE_NOT_FOUND; return GuiPtr(); } // Construct a Code Tokeniser, which is able to handle #includes try { std::string whiteSpace = std::string(parser::WHITESPACE) + ","; parser::CodeTokeniser tokeniser(file, whiteSpace.c_str(), "{}(),;"); info.gui = Gui::createFromTokens(tokeniser); info.type = UNDETERMINED; return info.gui; } catch (parser::ParseException& p) { std::string errMSG = "Error while parsing " + guiPath + ": " + p.what() + "\n"; _errorList.push_back(errMSG); rError() << errMSG; info.type = IMPORT_FAILURE; return GuiPtr(); } } GuiManager& GuiManager::Instance() { static GuiManager _instance; return _instance; } } // namespace gui DarkRadiant-2.0.2/plugins/dm.gui/gui/GuiManager.h000066400000000000000000000051021245424655700215330ustar00rootroot00000000000000#ifndef GuiManager_h__ #define GuiManager_h__ #include #include #include #include "ifilesystem.h" #include "string/string.h" #include namespace gui { namespace { const std::string GUI_DIR("guis/readables/"); const std::string GUI_EXT("gui"); } enum GuiType { NOT_LOADED_YET, // no attempt to load the GUI has been made UNDETERMINED, // not checked yet for type ONE_SIDED_READABLE, // 1-sided TWO_SIDED_READABLE, // 2-sided NO_READABLE, // not a readable IMPORT_FAILURE, // failed to load FILE_NOT_FOUND, // file doesn't exist }; class Gui; typedef std::shared_ptr GuiPtr; /** * greebo: This manager keeps track of all the loaded GUIs, * including parsing the .gui files on demand. */ class GuiManager : public boost::noncopyable { public: typedef std::vector StringList; // A visitor class used to traverse all known GUIs by path class Visitor { public: virtual ~Visitor() {} virtual void visit(const std::string& guiPath, const GuiType& guiType) = 0; }; private: struct GuiInfo { // The type of this Gui (NOT_LOADED_YET by default) GuiType type; // the cached GUI pointer, can be NULL if load failed GuiPtr gui; GuiInfo() : type(NOT_LOADED_YET) {} GuiInfo(const GuiPtr& gui_, GuiType type_) : type(type_), gui(gui_) {} }; // The table of all loaded Gui, sorted by VFS path typedef std::map GuiInfoMap; GuiInfoMap _guis; // A List of all the errors occuring lastly. StringList _errorList; public: // Gets a GUI from the given VFS path, parsing it on demand // Returns NULL if the GUI couldn't be found or loaded. GuiPtr getGui(const std::string& guiPath); // Operator used for callback by refreshGuiDefinitions. void loadGuiFromFile(const std::string& guiPath); // Returns the number of known GUIs (or GUI paths) std::size_t getNumGuis() const; // Traverse all known GUIs using the given Visitor void foreachGui(Visitor& visitor); // Returns the GUI appearance type for the given GUI path GuiType getGuiType(const std::string& guiPath); // Reload the gui void reloadGui(const std::string& guiPath); // Returns the _errorList for use in a GUI. const StringList& getErrorList() { return _errorList; } // Provides access to the singleton static GuiManager& Instance(); // Searches the VFS for all available GUI definitions void findGuis(); // Clears all internal objects void clear(); private: GuiType determineGuiType(const GuiPtr& gui); GuiPtr loadGui(const std::string& guiPath); }; } // namespace #endif // GuiManager_h__ DarkRadiant-2.0.2/plugins/dm.gui/gui/GuiRenderer.cpp000066400000000000000000000107431245424655700222710ustar00rootroot00000000000000#include "GuiRenderer.h" #include "igl.h" #include "ifonts.h" #include "ishaders.h" #include "math/Matrix4.h" namespace gui { GuiRenderer::GuiRenderer() : _areaTopLeft(0,0), _areaBottomRight(640, 480), _ignoreVisibility(false) {} void GuiRenderer::setGui(const GuiPtr& gui) { _gui = gui; } void GuiRenderer::setVisibleArea(const Vector2& topLeft, const Vector2& bottomRight) { _areaTopLeft = topLeft; _areaBottomRight = bottomRight; } void GuiRenderer::setIgnoreVisibility(bool ignoreVisibility) { _ignoreVisibility = ignoreVisibility; } void GuiRenderer::render() { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // set up viewpoint glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Initialise the 2D projection matrix with: left, right, bottom, top, znear, zfar glOrtho(_areaTopLeft[0], // left _areaBottomRight[0], // right _areaBottomRight[1], // bottom _areaTopLeft[1], // top -1, 1); // Tell openGL to draw front and back of the polygons in textured mode glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (_gui != NULL) { // Fetch the desktop windowDef and render it render(_gui->getDesktop()); } glDisable(GL_BLEND); } void GuiRenderer::render(const GuiWindowDefPtr& window) { if (window == NULL) return; if (!window->visible && !_ignoreVisibility) return; if (window->backcolor[3] > 0) { glColor4dv(window->backcolor); // Background quad glBegin(GL_QUADS); glVertex2d(window->rect[0], window->rect[1]); // Upper left glVertex2d(window->rect[0] + window->rect[2], window->rect[1]); // Upper right glVertex2d(window->rect[0] + window->rect[2], window->rect[1] + window->rect[3]); // Lower right glVertex2d(window->rect[0], window->rect[1] + window->rect[3]); // Lower left glEnd(); } // Realise background shader if necessary if (!window->background.empty() && window->backgroundShader == NULL) { window->backgroundShader = GlobalMaterialManager().getMaterialForName(window->background); } // Acquire the texture number of the active texture if (window->backgroundShader != NULL && (window->matcolor[3] > 0 || _ignoreVisibility)) { // Get the diffuse layer const ShaderLayerVector& layers = window->backgroundShader->getAllLayers(); TexturePtr tex; for (ShaderLayerVector::const_iterator i = layers.begin(); i != layers.end(); ++i) { if ((*i)->getType() == ShaderLayer::DIFFUSE) { // Found the diffuse tex = (*i)->getTexture(); break; } } if (tex == NULL) { tex = window->backgroundShader->getEditorImage(); } if (tex != NULL) { glBindTexture(GL_TEXTURE_2D, tex->getGLTexNum()); // Draw the textured quad glColor4dv(window->matcolor); // Render background image as opaque if _ignoreVisibility is set to true if (_ignoreVisibility && window->matcolor[3] <= 0) { glColor4d(window->matcolor[0], window->matcolor[1], window->matcolor[2], 1); } glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex2d(window->rect[0], window->rect[1]); // Upper left glTexCoord2f(1,0); glVertex2d(window->rect[0] + window->rect[2], window->rect[1]); // Upper right glTexCoord2f(1,1); glVertex2d(window->rect[0] + window->rect[2], window->rect[1] + window->rect[3]); // Lower right glTexCoord2f(0,1); glVertex2d(window->rect[0], window->rect[1] + window->rect[3]); // Lower left glEnd(); glDisable(GL_TEXTURE_2D); } } // Render the text if (!window->getText().empty()) { glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glColor4dv(window->forecolor); // Render text as opaque if _ignoreVisibility is set to true if (_ignoreVisibility && window->forecolor[3] <= 0) { glColor4d(window->forecolor[0], window->forecolor[1], window->forecolor[2], 1); } window->getRenderableText().render(); glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); } // Push the translation before rendering the children, so that they // can continue rendering in local coordinates, but the results appear relative to // this parent windowDef glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslated(window->rect[0], window->rect[1], 0); for (GuiWindowDef::ChildWindows::const_iterator i = window->children.begin(); i != window->children.end(); ++i) { render(*i); } glMatrixMode(GL_MODELVIEW); glPopMatrix(); } } // namespace DarkRadiant-2.0.2/plugins/dm.gui/gui/GuiRenderer.h000066400000000000000000000015461245424655700217370ustar00rootroot00000000000000#ifndef GuiRenderer_h__ #define GuiRenderer_h__ #include "math/Vector2.h" #include #include "Gui.h" #include namespace gui { class GuiRenderer : public boost::noncopyable { private: GuiPtr _gui; Vector2 _areaTopLeft; Vector2 _areaBottomRight; // Whether invisible windowDefs should be rendered anyway bool _ignoreVisibility; public: // Construct a new renderer GuiRenderer(); void setGui(const GuiPtr& gui); void setIgnoreVisibility(bool ignoreVisibility); // Sets the visible area to be rendered, in absolute GUI coordinates [0,0..640,480] void setVisibleArea(const Vector2& topLeft, const Vector2& bottomRight); // Starts rendering the attached GUI // The GL context must be set before calling this method void render(); private: void render(const GuiWindowDefPtr& window); }; } #endif // GuiRenderer_h__ DarkRadiant-2.0.2/plugins/dm.gui/gui/GuiScript.cpp000066400000000000000000000252321245424655700217660ustar00rootroot00000000000000#include "GuiScript.h" #include "itextstream.h" #include "parser/DefTokeniser.h" #include "Gui.h" #include #include #include #include namespace gui { bool Variable::assignValueFromString(const std::string& val) { return true; } GuiScript::GuiScript(GuiWindowDef& owner) : _owner(owner), _ip(0), _curLevel(0) {} void GuiScript::parseIfStatement(parser::DefTokeniser& tokeniser) { // Prototype: if () [else ] // The initial "if" has already been parsed StatementPtr ifStatement(new Statement(Statement::ST_IF)); tokeniser.assertNextToken("("); ifStatement->args.push_back(getIfExpression(tokeniser)); // condition // Add the statement at the current position pushStatement(ifStatement); // Parse the statement(s) to execute if the above condition is true parseStatement(tokeniser); // Check the next token to see where we need to jump to if the condition evaluates to false std::string nextToken = tokeniser.nextToken(); if (nextToken == "else") { // There is an "else" block, so we need to add a JMP statement before proceeding StatementPtr jmpStatement(new Statement(Statement::ST_JMP)); pushStatement(jmpStatement); // Set the original IF jump position to this else ifStatement->jmpDest = getCurPosition(); // As next step, parse the code in the else block parseStatement(tokeniser); // Finally, position the jump at the location right after the else block jmpStatement->jmpDest = getCurPosition(); } else { // No else, execution falls through, but we need to set the jump destination first ifStatement->jmpDest = getCurPosition(); switchOnToken(nextToken, tokeniser); } } void GuiScript::parseSetStatement(parser::DefTokeniser& tokeniser) { // Prototype: set [window::] StatementPtr st(new Statement(Statement::ST_SET)); st->args.push_back(getExpression(tokeniser)); // variable st->args.push_back(getExpression(tokeniser)); // value tokeniser.assertNextToken(";"); pushStatement(st); } void GuiScript::parseTransitionStatement(parser::DefTokeniser& tokeniser) { // Prototype: transition [window::]