* native surfaceparm noob support (no -custinfoparms needed)
	* -noob in bsp phase: assign surfaceparm noob to all map surfaces
	* surfaceparm ob: skip assigning surfaceparm noob with -noob on that
	* farplane modes: radius+radius, origin2origin, exact (add r/o/e to the number to enable), < 0 works too
	* samples+filter - enabled again, makes sense
	* -vertexscale
	* fixed -novertex, (0..1) sets
	* quick q3map_novertexlight (?)
	* fixed _clone _ins _instance (_clonename)
	* -nolm - no lightmaps
	* ent keys aliases:_sa - shadeangle;_ss - samplesize
	* -shift N -shift X Y Z: shift whole map to some coords
	* more fogs (256) (ingame appearence lots of ones might be bugged due to engine arrangement, needs testing)
	* q3map_remapshader remaps anything fine, on all stages (effect is: postrenaming shader when things are have been done)
	* fixed 'unknown argument 1' at -lightanglehl
	* -nocmdline writting to worldspawn

Radiant:

binds...
	* wasd camera binds, c - deSelect, z - delete
	* ExpandSelectionToEntities - shift+e
	* make detail - alt+d
	* arbitrary rotation - shifr+r
	* arbitrary scale - ctrl+shift+s
misc...
	* fit width, fit height butts in surf inspector (for trims) (saves scales ratio)
	add old TODO with ideas
This commit is contained in:
Garux 2017-08-01 13:26:50 +03:00
parent e995cc897b
commit 9fed37bae0
25 changed files with 786 additions and 52 deletions

149
TODO Normal file
View File

@ -0,0 +1,149 @@
[-z-]: make rotate dialog non-modal
BUGS
MSI: installer bug with new folders? : create custom dir, click New Folder icon, type "FOLDER\" - gets stuck
GTK2: gtk2 crashes when trying to use bitmap fonts such as MS Sans Serif http://bugzilla.gnome.org/show_bug.cgi?id=142579
GTK2: alt+tab while mouse button is held down: see http://bugzilla.gnome.org/show_bug.cgi?id=145156
UI: changing resolution in floating-windows mode can screw up window positions.
HalfLife: half-life maps saved in q1 map format are not supported - currently have to convert them to hammer map format using hammer editor. And vice versa.
Entity: creating a new entity with all the brushes of another entity selected results in the latter entity having no brushes.
SConscript: build fails if SETUP=1
SConscript: svn.py fails if not using C locale - set LC_ALL?
GUI: can't use arrow keys to navigate in camera view when capslock is enabled
GUI: screensaver causes: gdkgc-win32.c: line 905 (gdk_win32_hdc_get): assertion failed: (win32_gc->hdc == NULL)
FEATURES
- paint-select or equivalent (e.g. area-selection with occlusion)
- select-complete-tall or equivalent (e.g. subtract-from-selection modifier key)
- texture pane names are often illegible, becuase 1. they are long and overlap each other and 2. they overlap the outline rectangles around the images themselves.
Build: document build-menu xml format.
The build menu in GtkRadiant 1.5 is entirely customisable - you can make it run qbsp3/qvis3/arghrad or any tool you want. Use 'Build > Customize...' to edit the menu.
Menu commands are the shell commands that Radiant will execute when you choose the menu item. You can add as many commands as you want to a single menu item, and they will be executed in sequence. The commands contain variables, specified using []. The values of variables will be substituted when the command is executed.
For example:
<pre>[q2map] -bsp "[MapFile]"</pre>
becomes:
<pre>"C:\Program Files\GtkRadiant 1.5.0\q2map" -fs_basepath "c:\quake2" -bsp "c:\quake2\baseq2\maps\blah.map"</pre>
This uses the predefined variable 'MapFile' and the custom variable 'q2map'. 'q2map' is defined in the XML file, and 'MapFile' is the full path to your map.
The 'MapFile' variable is enclosed in quotes, because the path to your map may contain spaces.
At the moment you can only create custom variables by editing the XML file. A custom variable for arghrad would look something like this:
<pre><var name="arghrad">"[RadiantPath]arghrad"</var></pre>
This variable could then be used in a command like this:
<pre>[arghrad] "[MapFile]"</pre>
Entity: option to filter non-world entities (e.g. not func_group or func_static)
Rotate Tool: if more than one object is selected, with different local orientations, use parent-space rotation pivot instead of local-space
Brush: MMB+ctrl to paint texture on whole brush/patch.
Camera: add alternative highlighting styles (used to be J).
Doom3: filter func_splinemovers
Entity: draw arrowheads to show direction of connection-lines.
? MMB to select a texture should also apply that texture to all selected faces.
Mouse: support 2-button mouse.
Grid: background colour should be different when the smallest grid is invisible due to being zoomed out.
Brush: option to disable dots on selected faces when not in face mode.
Entity: draw direction arrow for func_door and func_button angle.
Build Menu: support for editing variables.
Shaders: handle doom3 materials with multiple bumpmaps stage - use first stage, ignore later stages.
Brush: warn when a brush is dragged into a configuration with <0 volume
Textures: add option to give new brushes a specific texture instead of the last selected.
? QE-tool: click anywhere on xy view to drag entity instead of requiring clicking directly on entity.
UserDocs: how to use multi-vertex selection - replaces vertex-edit-splits-faces option:
UserDocs: how to use parent-selection:
Parent-selection works like Maya: it allows you to 'reparent' brushes
onto other entities than the one they're currently part of. To use it,
select some brushes, select an entity, Edit -> Parent.
Textures: add anisotropic filtering.
Preferences: allow preference settings to be shared across games.
Preferences: add colour 'theme' files using prefs format.
Preferences: sensible default size for prefs window.
Doom3: add model browser.
Doom3: s_diversity light key.
HalfLife: enable HL-mode on linux/osx.
Renderer: doom3 'parallel' and 'spot' light support.
Entity: add mouse-editing for doom3 light_center key
Shaders: add support for texture transforms.
Shaders: add support for 'addnormals' keyword - e.g. models/mapobjects/healthgui/healthguidirty
TGA Loader: check that true-colour images with palettes are properly handled.
Module System: reinstate 'refresh' feature.
Surface Inspector: add button for 'axial' projection for doom3.
Build: fix hardcoded engine-launch commands - use similar system to build-menu command description.
Filters: use q2/heretic2 content flags to filter brushes.
? Surface Inspector: allow material names not relative to 'textures/' for doom3
Module System: add versioning for module-system api.
svn: remove install/ dir, create it during build process on win32
Editing: add option to choose the default startup tool mode.
Renderer: lighting for doom3 materials without bumpmaps (e.g. mcity/mchangar2)
Renderer: realtime doom3 materials preview
Renderer: realtime doom3 shadows preview
Linux: Provide .tar.gz of example-map data for et/wolf.
Textures Window: add inner dark outline to distinguish 'is-shader' outline from white textures.
HalfLife2: add HL2 map load/save.
Selection: add move-pivot mode to allow rotation/scale around a custom pivot-point.
Selection: add rotate increment for rotate manipulator.
Selection: visibly distinguish between entity and brush selections
Selection: need 'add to selection' and 'subtract from selection' modifiers
Selection: Finish scale manipulator.
FaceCopy/PasteTexture: Make face-copy/paste-texture shortcuts customisable.
Manual: add documentation about search paths for .ent/.def/.fgd, shaders etc for each game.
Halflife: add support for cstrike fgd.
HalfLife: disable patches
HalfLife: add HL .mdl model loader.
HalfLife: add HL .spr support.
HalfLife: support fgd 'flags' attributes.
Model: add support for doom3 md5anim format
Model: support doom3 ragdolls
VFS: add ability to browse VFS from file-open dialogs.
Installer: enable q3 brush-primitives map support.
Installer: add editor manual to linux installer
Map: add conversion between map formats
Map: add conversion between entity definition formats
Build: add build-menu dmap support (doom3)
Entity: optionally draw target connection lines thicker than one pixel.
Entity: add specialised attribute-entry in entity-inspector for integer/real/color attribute types.
Patch: add cap-texture, fit-texture and natural-texture toolbar buttons
Patch: draw patches in wireframe from the back, make patches selectable from the back
Patch: add option for convert-selection-to-new-brush/patch
Patch: fix bobtoolz merge-patches feature
Patch: fix insert/remove rows/cols indicated by current selected patch vertices.
Autosave/Snapshots: Add support for multi-file maps.
Quake2: Q2 hint transparency support
Shortcuts: make shortcut list editable within radiant.
Shortcuts: convert shortcuts.ini to xml.
Shortcuts: warn when duplicate shortcuts are registered
Shortcuts: rename commands in order to group shortcuts list better.
upgrade to new API for SymGetModuleInfo - required for compiling with Visual Studio 8.0
Doom3: lights should stay in place while resizing
LOW priority features
Selection: Add shear manipulator?
Textures Window: Improve texture-manipulation and texture-browsing tools.
Undo: make selections undoable?
Win32 Installer: Automatically upgrade existing installation.
General: refactor game-specific hacks to be parameterised by .game file
Patch: Overlays, Bend Mode, Thicken.
Brush: Add brush-specific plugin API.
Entity: Draw light style numbers.
... Entity: Show models with model2 key.
Entity: Interpret _remap* key (_MindLink_).
Entity: Support _origin _angles _scale on groups.
Selection: Add Primitive-mode shortcut key/button.
Selection: Customisable manipulator size - +/- to change the size of the translate/rotate tool.
Selection: Add optional screen-relative control for constrained rotations.
Clipper: Change selection/manipulation to be consistent with other component editing.
Filtering: Either deselect filtered nodes, or render filtered nodes that are selected.
Filtering: Add customisable filter presets to set/unset multiple filters at once.
Texdef: Make texdef formats abstract, add conversion between texdef formats (use generic affine-texture-matrix format for conversions).
Textures Window: Precise display of texture size when selecting. (tooltip, possibly)
Status: 'Size of brush' display on status bar.
Colours: maya scheme default?
Quake: add support for adjusting gamma on quake palette?

View File

@ -598,6 +598,14 @@ void fit( const Vector3& normal, const Winding& winding, float s_repeat, float t
Texdef_FitTexture( m_projection, m_shader.width(), m_shader.height(), normal, winding, s_repeat, t_repeat );
}
void fitW( const Vector3& normal, const Winding& winding, float s_repeat, float t_repeat ){
Texdef_FitTextureW( m_projection, m_shader.width(), m_shader.height(), normal, winding, s_repeat, t_repeat );
}
void fitH( const Vector3& normal, const Winding& winding, float s_repeat, float t_repeat ){
Texdef_FitTextureH( m_projection, m_shader.width(), m_shader.height(), normal, winding, s_repeat, t_repeat );
}
void emitTextureCoordinates( Winding& winding, const Vector3& normal, const Matrix4& localToWorld ){
Texdef_EmitTextureCoordinates( m_projection, m_shader.width(), m_shader.height(), winding, normal, localToWorld );
}
@ -1199,6 +1207,18 @@ void FitTexture( float s_repeat, float t_repeat ){
texdefChanged();
}
void FitTextureW( float s_repeat, float t_repeat ){
undoSave();
m_texdef.fitW( m_plane.plane3().normal(), m_winding, s_repeat, t_repeat );
texdefChanged();
}
void FitTextureH( float s_repeat, float t_repeat ){
undoSave();
m_texdef.fitH( m_plane.plane3().normal(), m_winding, s_repeat, t_repeat );
texdefChanged();
}
void EmitTextureCoordinates(){
Texdef_EmitTextureCoordinates( m_texdefTransformed, m_shader.width(), m_shader.height(), m_winding, plane3().normal(), g_matrix4_identity );
}

View File

@ -1122,6 +1122,88 @@ void Texdef_FitTexture( TextureProjection& projection, std::size_t width, std::s
Texdef_normalise( projection, (float)width, (float)height );
}
void Texdef_FitTextureW( TextureProjection& projection, std::size_t width, std::size_t height, const Vector3& normal, const Winding& w, float s_repeat, float t_repeat ){
if ( w.numpoints < 3 ) {
return;
}
Matrix4 st2tex;
Texdef_toTransform( projection, (float)width, (float)height, st2tex );
// the current texture transform
Matrix4 local2tex = st2tex;
{
Matrix4 xyz2st;
Texdef_basisForNormal( projection, normal, xyz2st );
matrix4_multiply_by_matrix4( local2tex, xyz2st );
}
// the bounds of the current texture transform
AABB bounds;
for ( Winding::const_iterator i = w.begin(); i != w.end(); ++i )
{
Vector3 texcoord = matrix4_transformed_point( local2tex, ( *i ).vertex );
aabb_extend_by_point_safe( bounds, texcoord );
}
bounds.origin.z() = 0;
bounds.extents.z() = 1;
// the bounds of a perfectly fitted texture transform
AABB perfect( Vector3( s_repeat * 0.5, s_repeat * 0.5 * bounds.extents.y() / bounds.extents.x(), 0 ), Vector3( s_repeat * 0.5, s_repeat * 0.5 * bounds.extents.y() / bounds.extents.x(), 1 ) );
// the difference between the current texture transform and the perfectly fitted transform
Matrix4 matrix( matrix4_translation_for_vec3( bounds.origin - perfect.origin ) );
matrix4_pivoted_scale_by_vec3( matrix, bounds.extents / perfect.extents, perfect.origin );
matrix4_affine_invert( matrix );
// apply the difference to the current texture transform
matrix4_premultiply_by_matrix4( st2tex, matrix );
Texdef_fromTransform( projection, (float)width, (float)height, st2tex );
Texdef_normalise( projection, (float)width, (float)height );
}
void Texdef_FitTextureH( TextureProjection& projection, std::size_t width, std::size_t height, const Vector3& normal, const Winding& w, float s_repeat, float t_repeat ){
if ( w.numpoints < 3 ) {
return;
}
Matrix4 st2tex;
Texdef_toTransform( projection, (float)width, (float)height, st2tex );
// the current texture transform
Matrix4 local2tex = st2tex;
{
Matrix4 xyz2st;
Texdef_basisForNormal( projection, normal, xyz2st );
matrix4_multiply_by_matrix4( local2tex, xyz2st );
}
// the bounds of the current texture transform
AABB bounds;
for ( Winding::const_iterator i = w.begin(); i != w.end(); ++i )
{
Vector3 texcoord = matrix4_transformed_point( local2tex, ( *i ).vertex );
aabb_extend_by_point_safe( bounds, texcoord );
}
bounds.origin.z() = 0;
bounds.extents.z() = 1;
// the bounds of a perfectly fitted texture transform
AABB perfect( Vector3( t_repeat * 0.5 * bounds.extents.x() / bounds.extents.y(), t_repeat * 0.5, 0 ), Vector3( t_repeat * 0.5 * bounds.extents.x() / bounds.extents.y(), t_repeat * 0.5, 1 ) );
// the difference between the current texture transform and the perfectly fitted transform
Matrix4 matrix( matrix4_translation_for_vec3( bounds.origin - perfect.origin ) );
matrix4_pivoted_scale_by_vec3( matrix, bounds.extents / perfect.extents, perfect.origin );
matrix4_affine_invert( matrix );
// apply the difference to the current texture transform
matrix4_premultiply_by_matrix4( st2tex, matrix );
Texdef_fromTransform( projection, (float)width, (float)height, st2tex );
Texdef_normalise( projection, (float)width, (float)height );
}
float Texdef_getDefaultTextureScale(){
return g_texdef_default_scale;
}

View File

@ -106,6 +106,8 @@ void Texdef_Shift( TextureProjection& projection, float s, float t );
void Texdef_Scale( TextureProjection& projection, float s, float t );
void Texdef_Rotate( TextureProjection& projection, float angle );
void Texdef_FitTexture( TextureProjection& projection, std::size_t width, std::size_t height, const Vector3& normal, const Winding& w, float s_repeat, float t_repeat );
void Texdef_FitTextureW( TextureProjection& projection, std::size_t width, std::size_t height, const Vector3& normal, const Winding& w, float s_repeat, float t_repeat );
void Texdef_FitTextureH( TextureProjection& projection, std::size_t width, std::size_t height, const Vector3& normal, const Winding& w, float s_repeat, float t_repeat );
void Texdef_EmitTextureCoordinates( const TextureProjection& projection, std::size_t width, std::size_t height, Winding& w, const Vector3& normal, const Matrix4& localToWorld );
void ShiftScaleRotate_fromFace( texdef_t& shiftScaleRotate, const TextureProjection& projection );

View File

@ -631,6 +631,28 @@ void operator()( Face& face ) const {
}
};
class FaceFitTextureW
{
float m_s_repeat, m_t_repeat;
public:
FaceFitTextureW( float s_repeat, float t_repeat ) : m_s_repeat( s_repeat ), m_t_repeat( t_repeat ){
}
void operator()( Face& face ) const {
face.FitTextureW( m_s_repeat, m_t_repeat );
}
};
class FaceFitTextureH
{
float m_s_repeat, m_t_repeat;
public:
FaceFitTextureH( float s_repeat, float t_repeat ) : m_s_repeat( s_repeat ), m_t_repeat( t_repeat ){
}
void operator()( Face& face ) const {
face.FitTextureH( m_s_repeat, m_t_repeat );
}
};
void Scene_BrushFitTexture_Selected( scene::Graph& graph, float s_repeat, float t_repeat ){
Scene_ForEachSelectedBrush_ForEachFace( graph, FaceFitTexture( s_repeat, t_repeat ) );
SceneChangeNotify();
@ -641,6 +663,26 @@ void Scene_BrushFitTexture_Component_Selected( scene::Graph& graph, float s_repe
SceneChangeNotify();
}
void Scene_BrushFitTexture_SelectedW( scene::Graph& graph, float s_repeat, float t_repeat ){
Scene_ForEachSelectedBrush_ForEachFace( graph, FaceFitTextureW( s_repeat, t_repeat ) );
SceneChangeNotify();
}
void Scene_BrushFitTexture_Component_SelectedW( scene::Graph& graph, float s_repeat, float t_repeat ){
Scene_ForEachSelectedBrushFace( graph, FaceFitTextureW( s_repeat, t_repeat ) );
SceneChangeNotify();
}
void Scene_BrushFitTexture_SelectedH( scene::Graph& graph, float s_repeat, float t_repeat ){
Scene_ForEachSelectedBrush_ForEachFace( graph, FaceFitTextureH( s_repeat, t_repeat ) );
SceneChangeNotify();
}
void Scene_BrushFitTexture_Component_SelectedH( scene::Graph& graph, float s_repeat, float t_repeat ){
Scene_ForEachSelectedBrushFace( graph, FaceFitTextureH( s_repeat, t_repeat ) );
SceneChangeNotify();
}
TextureProjection g_defaultTextureProjection;
const TextureProjection& TextureTransform_getDefault(){
TexDef_Construct_Default( g_defaultTextureProjection );
@ -1371,7 +1413,7 @@ void Brush_registerCommands(){
GlobalCommands_insert( "SplitSelected", FreeCaller<SplitSelected>(), Accelerator( GDK_Return, (GdkModifierType)GDK_SHIFT_MASK ) );
GlobalCommands_insert( "FlipClip", FreeCaller<FlipClipper>(), Accelerator( GDK_Return, (GdkModifierType)GDK_CONTROL_MASK ) );
GlobalCommands_insert( "MakeDetail", FreeCaller<Select_MakeDetail>(), Accelerator( 'M', (GdkModifierType)GDK_CONTROL_MASK ) );
GlobalCommands_insert( "MakeDetail", FreeCaller<Select_MakeDetail>(), Accelerator( 'D', (GdkModifierType)GDK_MOD1_MASK ) );
GlobalCommands_insert( "MakeStructural", FreeCaller<Select_MakeStructural>(), Accelerator( 'S', (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) );
}

View File

@ -70,6 +70,10 @@ void Scene_BrushSelectByShader( scene::Graph& graph, const char* name );
void Scene_BrushSelectByShader_Component( scene::Graph& graph, const char* name );
void Scene_BrushFitTexture_Selected( scene::Graph& graph, float s_repeat, float t_repeat );
void Scene_BrushFitTexture_Component_Selected( scene::Graph& graph, float s_repeat, float t_repeat );
void Scene_BrushFitTexture_SelectedW( scene::Graph& graph, float s_repeat, float t_repeat );
void Scene_BrushFitTexture_Component_SelectedW( scene::Graph& graph, float s_repeat, float t_repeat );
void Scene_BrushFitTexture_SelectedH( scene::Graph& graph, float s_repeat, float t_repeat );
void Scene_BrushFitTexture_Component_SelectedH( scene::Graph& graph, float s_repeat, float t_repeat );
typedef struct _GtkMenu GtkMenu;
void Brush_constructMenu( GtkMenu* menu );

View File

@ -954,27 +954,27 @@ void CamWnd_registerCommands( CamWnd& camwnd ){
ReferenceCaller<camera_t, Camera_PitchUp_KeyUp>( camwnd.getCamera() )
);
GlobalKeyEvents_insert( "CameraFreeMoveForward", Accelerator( GDK_Up ),
GlobalKeyEvents_insert( "CameraFreeMoveForward", Accelerator( 'W' ),
FreeMoveCameraMoveForwardKeyDownCaller( camwnd.getCamera() ),
FreeMoveCameraMoveForwardKeyUpCaller( camwnd.getCamera() )
);
GlobalKeyEvents_insert( "CameraFreeMoveBack", Accelerator( GDK_Down ),
GlobalKeyEvents_insert( "CameraFreeMoveBack", Accelerator( 'S' ),
FreeMoveCameraMoveBackKeyDownCaller( camwnd.getCamera() ),
FreeMoveCameraMoveBackKeyUpCaller( camwnd.getCamera() )
);
GlobalKeyEvents_insert( "CameraFreeMoveLeft", Accelerator( GDK_Left ),
GlobalKeyEvents_insert( "CameraFreeMoveLeft", Accelerator( 'A' ),
FreeMoveCameraMoveLeftKeyDownCaller( camwnd.getCamera() ),
FreeMoveCameraMoveLeftKeyUpCaller( camwnd.getCamera() )
);
GlobalKeyEvents_insert( "CameraFreeMoveRight", Accelerator( GDK_Right ),
GlobalKeyEvents_insert( "CameraFreeMoveRight", Accelerator( 'D' ),
FreeMoveCameraMoveRightKeyDownCaller( camwnd.getCamera() ),
FreeMoveCameraMoveRightKeyUpCaller( camwnd.getCamera() )
);
GlobalKeyEvents_insert( "CameraFreeMoveUp", Accelerator( 'D' ),
GlobalKeyEvents_insert( "CameraFreeMoveUp", Accelerator( GDK_period ),
FreeMoveCameraMoveUpKeyDownCaller( camwnd.getCamera() ),
FreeMoveCameraMoveUpKeyUpCaller( camwnd.getCamera() )
);
GlobalKeyEvents_insert( "CameraFreeMoveDown", Accelerator( 'C' ),
GlobalKeyEvents_insert( "CameraFreeMoveDown", Accelerator( GDK_comma ),
FreeMoveCameraMoveDownKeyDownCaller( camwnd.getCamera() ),
FreeMoveCameraMoveDownKeyUpCaller( camwnd.getCamera() )
);
@ -1900,15 +1900,15 @@ void CamWnd_Construct(){
GlobalShortcuts_insert( "CameraStrafeRight", Accelerator( GDK_period ) );
GlobalShortcuts_insert( "CameraStrafeLeft", Accelerator( GDK_comma ) );
GlobalShortcuts_insert( "CameraUp", Accelerator( 'D' ) );
GlobalShortcuts_insert( "CameraDown", Accelerator( 'C' ) );
GlobalShortcuts_insert( "CameraAngleUp", Accelerator( 'A' ) );
GlobalShortcuts_insert( "CameraAngleDown", Accelerator( 'Z' ) );
GlobalShortcuts_insert( "CameraUp", accelerator_null() );
GlobalShortcuts_insert( "CameraDown", accelerator_null() );
GlobalShortcuts_insert( "CameraAngleUp", accelerator_null() );
GlobalShortcuts_insert( "CameraAngleDown", accelerator_null() );
GlobalShortcuts_insert( "CameraFreeMoveForward", Accelerator( GDK_Up ) );
GlobalShortcuts_insert( "CameraFreeMoveBack", Accelerator( GDK_Down ) );
GlobalShortcuts_insert( "CameraFreeMoveLeft", Accelerator( GDK_Left ) );
GlobalShortcuts_insert( "CameraFreeMoveRight", Accelerator( GDK_Right ) );
GlobalShortcuts_insert( "CameraFreeMoveForward", Accelerator( 'W' ) );
GlobalShortcuts_insert( "CameraFreeMoveBack", Accelerator( 'S' ) );
GlobalShortcuts_insert( "CameraFreeMoveLeft", Accelerator( 'A' ) );
GlobalShortcuts_insert( "CameraFreeMoveRight", Accelerator( 'D' ) );
GlobalToggles_insert( "ShowStats", ShowStatsToggleCaller(), ToggleItem::AddCallbackCaller( g_show_stats ) );

View File

@ -3201,13 +3201,15 @@ void MainFrame_Construct(){
GlobalCommands_insert( "PasteToCamera", FreeCaller<PasteToCamera>(), Accelerator( 'V', (GdkModifierType)GDK_MOD1_MASK ) );
GlobalCommands_insert( "CloneSelection", FreeCaller<Selection_Clone>(), Accelerator( GDK_space ) );
GlobalCommands_insert( "CloneSelectionAndMakeUnique", FreeCaller<Selection_Clone_MakeUnique>(), Accelerator( GDK_space, (GdkModifierType)GDK_SHIFT_MASK ) );
GlobalCommands_insert( "DeleteSelection", FreeCaller<deleteSelection>(), Accelerator( GDK_BackSpace ) );
// GlobalCommands_insert( "DeleteSelection", FreeCaller<deleteSelection>(), Accelerator( GDK_BackSpace ) );
GlobalCommands_insert( "DeleteSelection", FreeCaller<deleteSelection>(), Accelerator( 'Z' ) );
GlobalCommands_insert( "ParentSelection", FreeCaller<Scene_parentSelected>() );
GlobalCommands_insert( "UnSelectSelection", FreeCaller<Selection_Deselect>(), Accelerator( GDK_Escape ) );
// GlobalCommands_insert( "UnSelectSelection", FreeCaller<Selection_Deselect>(), Accelerator( GDK_Escape ) );
GlobalCommands_insert( "UnSelectSelection", FreeCaller<Selection_Deselect>(), Accelerator( 'C' ) );
GlobalCommands_insert( "InvertSelection", FreeCaller<Select_Invert>(), Accelerator( 'I' ) );
GlobalCommands_insert( "SelectInside", FreeCaller<Select_Inside>() );
GlobalCommands_insert( "SelectTouching", FreeCaller<Select_Touching>() );
GlobalCommands_insert( "ExpandSelectionToEntities", FreeCaller<Scene_ExpandSelectionToEntities>(), Accelerator( 'E', (GdkModifierType)( GDK_MOD1_MASK | GDK_CONTROL_MASK ) ) );
GlobalCommands_insert( "ExpandSelectionToEntities", FreeCaller<Scene_ExpandSelectionToEntities>(), Accelerator( 'E', (GdkModifierType)GDK_SHIFT_MASK ) );
GlobalCommands_insert( "Preferences", FreeCaller<PreferencesDialog_showDialog>(), Accelerator( 'P' ) );
GlobalCommands_insert( "ToggleConsole", FreeCaller<Console_ToggleShow>(), Accelerator( 'O' ) );
@ -3228,8 +3230,8 @@ void MainFrame_Construct(){
GlobalCommands_insert( "MirrorSelectionZ", FreeCaller<Selection_Flipz>() );
GlobalCommands_insert( "RotateSelectionZ", FreeCaller<Selection_Rotatez>() );
GlobalCommands_insert( "ArbitraryRotation", FreeCaller<DoRotateDlg>() );
GlobalCommands_insert( "ArbitraryScale", FreeCaller<DoScaleDlg>() );
GlobalCommands_insert( "ArbitraryRotation", FreeCaller<DoRotateDlg>(), Accelerator( 'R', (GdkModifierType)GDK_SHIFT_MASK ) );
GlobalCommands_insert( "ArbitraryScale", FreeCaller<DoScaleDlg>(), Accelerator( 'S', (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) );
GlobalCommands_insert( "BuildMenuCustomize", FreeCaller<DoBuildMenu>() );

View File

@ -692,6 +692,24 @@ void Select_FitTexture( float horizontal, float vertical ){
SceneChangeNotify();
}
void Select_FitTextureW( float horizontal, float vertical ){
if ( GlobalSelectionSystem().Mode() != SelectionSystem::eComponent ) {
Scene_BrushFitTexture_SelectedW( GlobalSceneGraph(), horizontal, vertical );
}
Scene_BrushFitTexture_Component_SelectedW( GlobalSceneGraph(), horizontal, vertical );
SceneChangeNotify();
}
void Select_FitTextureH( float horizontal, float vertical ){
if ( GlobalSelectionSystem().Mode() != SelectionSystem::eComponent ) {
Scene_BrushFitTexture_SelectedH( GlobalSceneGraph(), horizontal, vertical );
}
Scene_BrushFitTexture_Component_SelectedH( GlobalSceneGraph(), horizontal, vertical );
SceneChangeNotify();
}
inline void hide_node( scene::Node& node, bool hide ){
hide
? node.enable( scene::Node::eHidden )

View File

@ -62,6 +62,8 @@ void Select_RotateTexture( float amt );
void Select_ScaleTexture( float x, float y );
void Select_ShiftTexture( float x, float y );
void Select_FitTexture( float horizontal = 1, float vertical = 1 );
void Select_FitTextureW( float horizontal = 1, float vertical = 1 );
void Select_FitTextureH( float horizontal = 1, float vertical = 1 );
void FindReplaceTextures( const char* pFind, const char* pReplace, bool bSelected );
void HideSelected();

View File

@ -441,6 +441,16 @@ void SurfaceInspector_FitTexture(){
Select_FitTexture( getSurfaceInspector().m_fitHorizontal, getSurfaceInspector().m_fitVertical );
}
void SurfaceInspector_FitTextureW(){
UndoableCommand undo( "textureAutoFitW" );
Select_FitTextureW( getSurfaceInspector().m_fitHorizontal, getSurfaceInspector().m_fitVertical );
}
void SurfaceInspector_FitTextureH(){
UndoableCommand undo( "textureAutoFitH" );
Select_FitTextureH( getSurfaceInspector().m_fitHorizontal, getSurfaceInspector().m_fitVertical );
}
static void OnBtnPatchdetails( GtkWidget *widget, gpointer data ){
Scene_PatchCapTexture_Selected( GlobalSceneGraph() );
}
@ -495,6 +505,18 @@ static void OnBtnFaceFit( GtkWidget *widget, gpointer data ){
SurfaceInspector_FitTexture();
}
static void OnBtnFaceFitW( GtkWidget *widget, gpointer data ){
getSurfaceInspector().exportData();
SurfaceInspector_FitTextureW();
}
static void OnBtnFaceFitH( GtkWidget *widget, gpointer data ){
getSurfaceInspector().exportData();
SurfaceInspector_FitTextureH();
}
typedef const char* FlagName;
const FlagName surfaceflagNamesDefault[32] = {
@ -853,18 +875,24 @@ GtkWindow* SurfaceInspector::BuildDialog(){
(GtkAttachOptions) ( 0 ), 0, 0 );
}
{
GtkWidget* label = gtk_label_new( "Width" );
gtk_widget_show( label );
gtk_table_attach( GTK_TABLE( table ), label, 2, 3, 0, 1,
(GtkAttachOptions) ( GTK_FILL ),
GtkWidget* button = gtk_button_new_with_label( "Width" );
gtk_widget_show( button );
gtk_table_attach( GTK_TABLE( table ), button, 2, 3, 0, 1,
(GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
(GtkAttachOptions) ( 0 ), 0, 0 );
g_signal_connect( G_OBJECT( button ), "clicked",
G_CALLBACK( OnBtnFaceFitW ), 0 );
gtk_widget_set_usize( button, 60, -2 );
}
{
GtkWidget* label = gtk_label_new( "Height" );
gtk_widget_show( label );
gtk_table_attach( GTK_TABLE( table ), label, 3, 4, 0, 1,
(GtkAttachOptions) ( GTK_FILL ),
GtkWidget* button = gtk_button_new_with_label( "Height" );
gtk_widget_show( button );
gtk_table_attach( GTK_TABLE( table ), button, 3, 4, 0, 1,
(GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
(GtkAttachOptions) ( 0 ), 0, 0 );
g_signal_connect( G_OBJECT( button ), "clicked",
G_CALLBACK( OnBtnFaceFitH ), 0 );
gtk_widget_set_usize( button, 60, -2 );
}
{
GtkWidget* button = gtk_button_new_with_label( "Axial" );

View File

@ -196,7 +196,7 @@ static void SetCloneModelNumbers( void ){
Sys_Printf( "WARNING: Cloned entity %s referenced entity without model\n", value2 );
continue;
}
models = atoi( &value2[ 1 ] );
models = atoi( &value3[ 1 ] );
/* add the model key */
sprintf( modelValue, "*%d", models );
@ -981,6 +981,10 @@ int BSPMain( int argc, char **argv ){
else if ( !strcmp( argv[ i ], "-bsp" ) ) {
Sys_Printf( "-bsp argument unnecessary\n" );
}
else if ( !strcmp( argv[ i ], "-noob" ) ) {
Sys_Printf( "No oBs!\n" );
noob = qtrue;
}
else
{
Sys_Printf( "WARNING: Unknown option \"%s\"\n", argv[ i ] );

View File

@ -169,7 +169,7 @@ void SwapBlock( int *block, int size ){
void SwapBSPFile( void ){
int i, j;
shaderInfo_t *si;
/* models */
SwapBlock( (int*) bspModels, numBSPModels * sizeof( bspModels[ 0 ] ) );
@ -177,6 +177,11 @@ void SwapBSPFile( void ){
/* shaders (don't swap the name) */
for ( i = 0; i < numBSPShaders ; i++ )
{
si = ShaderInfoForShader( bspShaders[ i ].shader );
if ( si->remapShader && si->remapShader[ 0 ] ) {
strcpy( bspShaders[ i ].shader, si->remapShader );
}
bspShaders[ i ].contentFlags = LittleLong( bspShaders[ i ].contentFlags );
bspShaders[ i ].surfaceFlags = LittleLong( bspShaders[ i ].surfaceFlags );
}
@ -592,6 +597,10 @@ void InjectCommandLine( char **argv, int beginArgs, int endArgs ){
char *sentinel = newCommandLine + sizeof( newCommandLine ) - 1;
int i;
if (nocmdline)
{
return;
}
previousCommandLine = ValueForKey( &entities[0], "_q3map2_cmdline" );
if ( previousCommandLine && *previousCommandLine ) {
inpos = previousCommandLine;

View File

@ -86,6 +86,7 @@
#define Q_SURF_ALPHASHADOW 0x10000 /* do per-pixel light shadow casting in q3map */
#define Q_SURF_NODLIGHT 0x20000 /* don't dlight even if solid (solid lava, skies) */
#define Q_SURF_DUST 0x40000 /* leave a dust trail when walking on this surface */
#define Q_SURF_NOOB 0x80000 /* no overbounces on this surface */
/* ydnar flags */
#define Q_SURF_VERTEXLIT ( Q_SURF_POINTLIGHT | Q_SURF_NOLIGHTMAP )
@ -197,6 +198,9 @@
{ "nosteps", 0, 0, Q_SURF_NOSTEPS, 0, 0, 0 },
{ "nodlight", 0, 0, Q_SURF_NODLIGHT, 0, 0, 0 },
{ "dust", 0, 0, Q_SURF_DUST, 0, 0, 0 },
{ "noob", 0, 0, Q_SURF_NOOB, 0, 0, 0 },
{ "ob", 0, 0, 0, 0, C_OB, 0 },
/* null */
{ NULL, 0, 0, 0, 0, 0, 0 }

View File

@ -2248,6 +2248,18 @@ int LightMain( int argc, char **argv ){
i++;
}
else if ( !strcmp( argv[ i ], "-vertexscale" ) ) {
f = atof( argv[ i + 1 ] );
vertexglobalscale *= f;
Sys_Printf( "Vertexlight scaled by %f to %f\n", f, vertexglobalscale );
i++;
}
else if ( !strcmp( argv[ i ], "-nolm" ) ) {
nolm = qtrue;
Sys_Printf( "No lightmaps yo\n" );
}
else if ( !strcmp( argv[ i ], "-bouncescale" ) ) {
f = atof( argv[ i + 1 ] );
bounceScale *= f;
@ -2744,8 +2756,15 @@ int LightMain( int argc, char **argv ){
Sys_Printf( "Lightmaps sample scale set to %d\n", sampleScale );
}
else if ( !strcmp( argv[ i ], "-novertex" ) ) {
noVertexLighting = qtrue;
Sys_Printf( "Disabling vertex lighting\n" );
noVertexLighting = 1;
if ( ( atof( argv[ i + 1 ] ) != 0 ) && ( atof( argv[ i + 1 ] )) < 1 ) {
noVertexLighting = ( atof( argv[ i + 1 ] ) );
i++;
Sys_Printf( "Setting vertex lighting globally to %d\n", noVertexLighting );
}
else{
Sys_Printf( "Disabling vertex lighting\n" );
}
}
else if ( !strcmp( argv[ i ], "-nogrid" ) ) {
noGridLighting = qtrue;
@ -2772,9 +2791,11 @@ int LightMain( int argc, char **argv ){
lightAngleHL = ( atoi( argv[ i + 1 ] ) != 0 );
if ( lightAngleHL ) {
Sys_Printf( "Enabling half lambert light angle attenuation\n" );
i++;
}
else{
Sys_Printf( "Disabling half lambert light angle attenuation\n" );
i++;
}
}
}

View File

@ -2222,7 +2222,7 @@ void IlluminateRawLightmap( int rawLightmapNum ){
}
/* allocate sampling flags storage */
if ( ( lightSamples > 1 || lightRandomSamples ) && luxelFilterRadius == 0 ) {
if ( lightSamples > 1 || lightRandomSamples ) {
size = lm->sw * lm->sh * SUPER_LUXEL_SIZE * sizeof( unsigned char );
if ( lm->superFlags == NULL ) {
lm->superFlags = safe_malloc( size );
@ -2276,7 +2276,7 @@ void IlluminateRawLightmap( int rawLightmapNum ){
}
/* check for evilness */
if ( trace.forceSubsampling > 1.0f && ( lightSamples > 1 || lightRandomSamples ) && luxelFilterRadius == 0 ) {
if ( trace.forceSubsampling > 1.0f && ( lightSamples > 1 || lightRandomSamples ) ) {
totalLighted++;
*flag |= FLAG_FORCE_SUBSAMPLING; /* force */
}
@ -2295,7 +2295,7 @@ void IlluminateRawLightmap( int rawLightmapNum ){
/* secondary pass, adaptive supersampling (fixme: use a contrast function to determine if subsampling is necessary) */
/* 2003-09-27: changed it so filtering disamples supersampling, as it would waste time */
if ( ( lightSamples > 1 || lightRandomSamples ) && luxelFilterRadius == 0 ) {
if ( lightSamples > 1 || lightRandomSamples ) {
/* walk luxels */
for ( y = 0; y < ( lm->sh - 1 ); y++ )
{
@ -2858,6 +2858,14 @@ void IlluminateVertexes( int num ){
radVertLuxel[ 2 ] = ( verts[ i ].normal[ 2 ] + 1.0f ) * 127.5f;
}
else if ( info->si->noVertexLight ) {
VectorSet( radVertLuxel, 127.5f, 127.5f, 127.5f );
}
else if ( noVertexLighting > 0 ) {
VectorSet( radVertLuxel, 127.5f * noVertexLighting, 127.5f * noVertexLighting, 127.5f * noVertexLighting );
}
/* illuminate the vertex */
else
{
@ -3107,6 +3115,14 @@ void IlluminateVertexes( int num ){
VectorCopy( debugColors[ num % 12 ], radVertLuxel );
}
else if ( info->si->noVertexLight ) {
VectorSet( radVertLuxel, 127.5f, 127.5f, 127.5f );
}
else if ( noVertexLighting > 0 ) {
VectorSet( radVertLuxel, 127.5f * noVertexLighting, 127.5f * noVertexLighting, 127.5f * noVertexLighting );
}
/* divine color from the superluxels */
else
{

View File

@ -1092,7 +1092,8 @@ void SetupSurfaceLightmaps( void ){
/* determine if surface requires a lightmap */
if ( ds->surfaceType == MST_TRIANGLE_SOUP ||
ds->surfaceType == MST_FOLIAGE ||
( info->si->compileFlags & C_VERTEXLIT ) ) {
( info->si->compileFlags & C_VERTEXLIT ) ||
nolm == qtrue ) {
numSurfsVertexLit++;
}
else

View File

@ -1291,13 +1291,13 @@ int ScaleBSPMain( int argc, char **argv ){
GetVectorForKey( &entities[ i ], "origin", vec );
if ( ( vec[ 0 ] || vec[ 1 ] || vec[ 2 ] ) ) {
if ( !strncmp( ValueForKey( &entities[i], "classname" ), "info_player_", 12 ) ) {
vec[2] += spawn_ref;
// vec[2] += spawn_ref;
}
vec[0] *= scale[0];
vec[1] *= scale[1];
vec[2] *= scale[2];
if ( !strncmp( ValueForKey( &entities[i], "classname" ), "info_player_", 12 ) ) {
vec[2] -= spawn_ref;
vec[2] += spawn_ref;
}
sprintf( str, "%f %f %f", vec[ 0 ], vec[ 1 ], vec[ 2 ] );
SetKeyValue( &entities[ i ], "origin", str );
@ -1469,6 +1469,265 @@ int ScaleBSPMain( int argc, char **argv ){
}
/*
ShiftBSPMain()
shifts a map: works correctly only with axial faces, placed in positive half of axis
for testing physics with huge coordinates
*/
int ShiftBSPMain( int argc, char **argv ){
int i, j;
float f, a;
vec3_t scale;
vec3_t vec;
char str[ 1024 ];
int uniform, axis;
qboolean texscale;
float *old_xyzst = NULL;
float spawn_ref = 0;
/* arg checking */
if ( argc < 3 ) {
Sys_Printf( "Usage: q3map [-v] -shift [-tex] [-spawn_ref <value>] <value> <mapname>\n" );
return 0;
}
texscale = qfalse;
for ( i = 1; i < argc - 2; ++i )
{
if ( !strcmp( argv[i], "-tex" ) ) {
texscale = qtrue;
}
else if ( !strcmp( argv[i], "-spawn_ref" ) ) {
spawn_ref = atof( argv[i + 1] );
++i;
}
else{
break;
}
}
/* get scale */
// if(argc-2 >= i) // always true
scale[2] = scale[1] = scale[0] = atof( argv[ argc - 2 ] );
if ( argc - 3 >= i ) {
scale[1] = scale[0] = atof( argv[ argc - 3 ] );
}
if ( argc - 4 >= i ) {
scale[0] = atof( argv[ argc - 4 ] );
}
uniform = ( ( scale[0] == scale[1] ) && ( scale[1] == scale[2] ) );
/* do some path mangling */
strcpy( source, ExpandArg( argv[ argc - 1 ] ) );
StripExtension( source );
DefaultExtension( source, ".bsp" );
/* load the bsp */
Sys_Printf( "Loading %s\n", source );
LoadBSPFile( source );
ParseEntities();
/* note it */
Sys_Printf( "--- ShiftBSP ---\n" );
Sys_FPrintf( SYS_VRB, "%9d entities\n", numEntities );
/* scale entity keys */
for ( i = 0; i < numBSPEntities && i < numEntities; i++ )
{
/* scale origin */
GetVectorForKey( &entities[ i ], "origin", vec );
if ( ( vec[ 0 ] || vec[ 1 ] || vec[ 2 ] ) ) {
if ( !strncmp( ValueForKey( &entities[i], "classname" ), "info_player_", 12 ) ) {
vec[2] += spawn_ref;
}
vec[0] += scale[0];
vec[1] += scale[1];
vec[2] += scale[2];
if ( !strncmp( ValueForKey( &entities[i], "classname" ), "info_player_", 12 ) ) {
vec[2] -= spawn_ref;
}
sprintf( str, "%f %f %f", vec[ 0 ], vec[ 1 ], vec[ 2 ] );
SetKeyValue( &entities[ i ], "origin", str );
}
}
/* scale models */
for ( i = 0; i < numBSPModels; i++ )
{
bspModels[ i ].mins[0] += scale[0];
bspModels[ i ].mins[1] += scale[1];
bspModels[ i ].mins[2] += scale[2];
bspModels[ i ].maxs[0] += scale[0];
bspModels[ i ].maxs[1] += scale[1];
bspModels[ i ].maxs[2] += scale[2];
}
/* scale nodes */
for ( i = 0; i < numBSPNodes; i++ )
{
bspNodes[ i ].mins[0] += scale[0];
bspNodes[ i ].mins[1] += scale[1];
bspNodes[ i ].mins[2] += scale[2];
bspNodes[ i ].maxs[0] += scale[0];
bspNodes[ i ].maxs[1] += scale[1];
bspNodes[ i ].maxs[2] += scale[2];
}
/* scale leafs */
for ( i = 0; i < numBSPLeafs; i++ )
{
bspLeafs[ i ].mins[0] += scale[0];
bspLeafs[ i ].mins[1] += scale[1];
bspLeafs[ i ].mins[2] += scale[2];
bspLeafs[ i ].maxs[0] += scale[0];
bspLeafs[ i ].maxs[1] += scale[1];
bspLeafs[ i ].maxs[2] += scale[2];
}
/*
if ( texscale ) {
Sys_Printf( "Using texture unlocking (and probably breaking texture alignment a lot)\n" );
old_xyzst = safe_malloc( sizeof( *old_xyzst ) * numBSPDrawVerts * 5 );
for ( i = 0; i < numBSPDrawVerts; i++ )
{
old_xyzst[5 * i + 0] = bspDrawVerts[i].xyz[0];
old_xyzst[5 * i + 1] = bspDrawVerts[i].xyz[1];
old_xyzst[5 * i + 2] = bspDrawVerts[i].xyz[2];
old_xyzst[5 * i + 3] = bspDrawVerts[i].st[0];
old_xyzst[5 * i + 4] = bspDrawVerts[i].st[1];
}
}
*/
/* scale drawverts */
for ( i = 0; i < numBSPDrawVerts; i++ )
{
bspDrawVerts[i].xyz[0] += scale[0];
bspDrawVerts[i].xyz[1] += scale[1];
bspDrawVerts[i].xyz[2] += scale[2];
// bspDrawVerts[i].normal[0] /= scale[0];
// bspDrawVerts[i].normal[1] /= scale[1];
// bspDrawVerts[i].normal[2] /= scale[2];
// VectorNormalize( bspDrawVerts[i].normal, bspDrawVerts[i].normal );
}
/*
if ( texscale ) {
for ( i = 0; i < numBSPDrawSurfaces; i++ )
{
switch ( bspDrawSurfaces[i].surfaceType )
{
case SURFACE_FACE:
case SURFACE_META:
if ( bspDrawSurfaces[i].numIndexes % 3 ) {
Error( "Not a triangulation!" );
}
for ( j = bspDrawSurfaces[i].firstIndex; j < bspDrawSurfaces[i].firstIndex + bspDrawSurfaces[i].numIndexes; j += 3 )
{
int ia = bspDrawIndexes[j] + bspDrawSurfaces[i].firstVert, ib = bspDrawIndexes[j + 1] + bspDrawSurfaces[i].firstVert, ic = bspDrawIndexes[j + 2] + bspDrawSurfaces[i].firstVert;
bspDrawVert_t *a = &bspDrawVerts[ia], *b = &bspDrawVerts[ib], *c = &bspDrawVerts[ic];
float *oa = &old_xyzst[ia * 5], *ob = &old_xyzst[ib * 5], *oc = &old_xyzst[ic * 5];
// extrapolate:
// a->xyz -> oa
// b->xyz -> ob
// c->xyz -> oc
ExtrapolateTexcoords(
&oa[0], &oa[3],
&ob[0], &ob[3],
&oc[0], &oc[3],
a->xyz, a->st,
b->xyz, b->st,
c->xyz, c->st );
}
break;
}
}
}
*/
/* scale planes */
for ( i = 0; i < numBSPPlanes; i++ )
{
if ( bspPlanes[ i ].dist > 0 ){
if ( bspPlanes[ i ].normal[0] ){
bspPlanes[ i ].dist += scale[0];
continue;
}
else if ( bspPlanes[ i ].normal[1] ){
bspPlanes[ i ].dist += scale[1];
continue;
}
else if ( bspPlanes[ i ].normal[2] ){
bspPlanes[ i ].dist += scale[2];
continue;
}
}
else{
if ( bspPlanes[ i ].normal[0] ){
bspPlanes[ i ].dist -= scale[0];
continue;
}
else if ( bspPlanes[ i ].normal[1] ){
bspPlanes[ i ].dist -= scale[1];
continue;
}
else if ( bspPlanes[ i ].normal[2] ){
bspPlanes[ i ].dist -= scale[2];
continue;
}
}
}
/* if ( uniform ) {
for ( i = 0; i < numBSPPlanes; i++ )
{
bspPlanes[ i ].dist += scale[0];
}
}
else
{
for ( i = 0; i < numBSPPlanes; i++ )
{
// bspPlanes[ i ].normal[0] /= scale[0];
// bspPlanes[ i ].normal[1] /= scale[1];
// bspPlanes[ i ].normal[2] /= scale[2];
f = 1 / VectorLength( bspPlanes[i].normal );
VectorScale( bspPlanes[i].normal, f, bspPlanes[i].normal );
bspPlanes[ i ].dist *= f;
}
}*/
/* scale gridsize */
/*
GetVectorForKey( &entities[ 0 ], "gridsize", vec );
if ( ( vec[ 0 ] + vec[ 1 ] + vec[ 2 ] ) == 0.0f ) {
VectorCopy( gridSize, vec );
}
vec[0] *= scale[0];
vec[1] *= scale[1];
vec[2] *= scale[2];
sprintf( str, "%f %f %f", vec[ 0 ], vec[ 1 ], vec[ 2 ] );
SetKeyValue( &entities[ 0 ], "gridsize", str );
*/
/* inject command line parameters */
InjectCommandLine( argv, 0, argc - 1 );
/* write the bsp */
UnparseEntities();
StripExtension( source );
DefaultExtension( source, "_sh.bsp" );
Sys_Printf( "Writing %s\n", source );
WriteBSPFile( source );
/* return to sender */
return 0;
}
/*
PseudoCompileBSP()
a stripped down ProcessModels
@ -1771,6 +2030,13 @@ int main( int argc, char **argv ){
numthreads = atoi( argv[ i ] );
argv[ i ] = NULL;
}
else if( !strcmp( argv[ i ], "-nocmdline" ) )
{
Sys_Printf( "noCmdLine\n" );
nocmdline = qtrue;
argv[ i ] = NULL;
}
}
/* init model library */
@ -1859,6 +2125,11 @@ int main( int argc, char **argv ){
r = ScaleBSPMain( argc - 1, argv + 1 );
}
/* bsp shifting */
else if ( !strcmp( argv[ 1 ], "-shift" ) ) {
r = ShiftBSPMain( argc - 1, argv + 1 );
}
/* ydnar: bsp conversion */
else if ( !strcmp( argv[ 1 ], "-convert" ) ) {
r = ConvertBSPMain( argc - 1, argv + 1 );

View File

@ -1769,6 +1769,9 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups )
else if ( strcmp( "", ValueForKey( mapEnt, "_sn" ) ) ) {
shadeAngle = FloatForKey( mapEnt, "_sn" );
}
else if ( strcmp( "", ValueForKey( mapEnt, "_sa" ) ) ) {
shadeAngle = FloatForKey( mapEnt, "_sa" );
}
else if ( strcmp( "", ValueForKey( mapEnt, "_smooth" ) ) ) {
shadeAngle = FloatForKey( mapEnt, "_smooth" );
}
@ -1789,6 +1792,9 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups )
else if ( strcmp( "", ValueForKey( mapEnt, "_samplesize" ) ) ) {
lightmapSampleSize = IntForKey( mapEnt, "_samplesize" );
}
else if ( strcmp( "", ValueForKey( mapEnt, "_ss" ) ) ) {
lightmapSampleSize = IntForKey( mapEnt, "_ss" );
}
if ( lightmapSampleSize < 0 ) {
lightmapSampleSize = 0;

View File

@ -418,7 +418,15 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap
if ( ( si != NULL && si->forceMeta ) || ( spawnFlags & 4 ) ) { /* 3rd bit */
ds->type = SURFACE_FORCED_META;
}
/* else
{
//fix not requested lightmapping of models :E
// else force vertexlit
// ApplySurfaceParm( "pointlight", &si->contentFlags, &si->surfaceFlags, &si->compileFlags );
// si->compileFlags |= C_VERTEXLIT;
//ds->type == SURFACE_TRIANGLES;
}
*/
/* fix the surface's normals (jal: conditioned by shader info) */
if ( !( spawnFlags & 64 ) && ( shadeAngle == 0.0f || ds->type != SURFACE_FORCED_META ) ) {
PicoFixSurfaceNormals( surface );
@ -875,6 +883,9 @@ void AddTriangleModels( entity_t *e ){
else if ( strcmp( "", ValueForKey( e2, "_samplesize" ) ) ) {
lightmapSampleSize = IntForKey( e2, "_samplesize" );
}
else if ( strcmp( "", ValueForKey( e2, "_ss" ) ) ) {
lightmapSampleSize = IntForKey( e2, "_ss" );
}
if ( lightmapSampleSize < 0 ) {
lightmapSampleSize = 0;
@ -917,6 +928,9 @@ void AddTriangleModels( entity_t *e ){
else if ( strcmp( "", ValueForKey( e2, "_sn" ) ) ) {
shadeAngle = FloatForKey( e2, "_sn" );
}
else if ( strcmp( "", ValueForKey( e2, "_sa" ) ) ) {
shadeAngle = FloatForKey( e2, "_sa" );
}
else if ( strcmp( "", ValueForKey( e2, "_smooth" ) ) ) {
shadeAngle = FloatForKey( e2, "_smooth" );
}

View File

@ -176,6 +176,7 @@
#define C_ANTIPORTAL 0x00004000 /* like hint, but doesn't generate portals */
#define C_SKIP 0x00008000 /* like hint, but skips this face (doesn't split bsp) */
#define C_NOMARKS 0x00010000 /* no decals */
#define C_OB 0x00020000 /* skip -noob for this */
#define C_DETAIL 0x08000000 /* THIS MUST BE THE SAME AS IN RADIANT! */
@ -316,7 +317,7 @@
/* ok to increase these at the expense of more memory */
#define MAX_MAP_AREAS 0x100 /* MAX_MAP_AREA_BYTES in q_shared must match! */
#define MAX_MAP_FOGS 30 //& 0x100 /* RBSP (32 - world fog - goggles) */
#define MAX_MAP_FOGS 0x100 //& 0x100 /* RBSP (32 - world fog - goggles) */
#define MAX_MAP_LEAFS 0x20000
#define MAX_MAP_PORTALS 0x20000
#define MAX_MAP_LIGHTING 0x800000
@ -324,7 +325,7 @@
#define MAX_MAP_VISCLUSTERS 0x4000 // <= MAX_MAP_LEAFS
#define MAX_MAP_VISIBILITY ( VIS_HEADER_SIZE + MAX_MAP_VISCLUSTERS * ( ( ( MAX_MAP_VISCLUSTERS + 63 ) & ~63 ) >> 3 ) )
#define MAX_MAP_DRAW_SURFS 0x20000
#define MAX_MAP_DRAW_SURFS 0x20000
#define MAX_MAP_ADVERTISEMENTS 30
@ -1517,6 +1518,7 @@ char *Q_strcat( char *dst, size_t dlen, const char *src )
char *Q_strncat( char *dst, size_t dlen, const char *src, size_t slen );
int BSPInfo( int count, char **fileNames );
int ScaleBSPMain( int argc, char **argv );
int ShiftBSPMain( int argc, char **argv );
int ConvertMain( int argc, char **argv );
@ -1999,6 +2001,7 @@ Q_EXTERN float jitters[ MAX_JITTERS ];
/* commandline arguments */
Q_EXTERN qboolean nocmdline Q_ASSIGN( qfalse );
Q_EXTERN qboolean verbose;
Q_EXTERN qboolean verboseEntities Q_ASSIGN( qfalse );
Q_EXTERN qboolean force Q_ASSIGN( qfalse );
@ -2043,6 +2046,7 @@ Q_EXTERN qboolean lightmapFill Q_ASSIGN( qfalse );
Q_EXTERN int metaAdequateScore Q_ASSIGN( -1 );
Q_EXTERN int metaGoodScore Q_ASSIGN( -1 );
Q_EXTERN float metaMaxBBoxDistance Q_ASSIGN( -1 );
Q_EXTERN qboolean noob Q_ASSIGN( qfalse );
#if Q3MAP2_EXPERIMENTAL_SNAP_NORMAL_FIX
// Increasing the normalEpsilon to compensate for new logic in SnapNormal(), where
@ -2172,6 +2176,7 @@ Q_EXTERN char inbase[ MAX_QPATH ];
Q_EXTERN char globalCelShader[ MAX_QPATH ];
Q_EXTERN float farPlaneDist; /* rr2do2, rf, mre, ydnar all contributed to this one... */
Q_EXTERN int farPlaneDistMode;
Q_EXTERN int numportals;
Q_EXTERN int portalclusters;
@ -2217,7 +2222,8 @@ Q_EXTERN qboolean keepLights Q_ASSIGN( qfalse );
Q_EXTERN int sampleSize Q_ASSIGN( DEFAULT_LIGHTMAP_SAMPLE_SIZE );
Q_EXTERN int minSampleSize Q_ASSIGN( DEFAULT_LIGHTMAP_MIN_SAMPLE_SIZE );
Q_EXTERN qboolean noVertexLighting Q_ASSIGN( qfalse );
Q_EXTERN float noVertexLighting Q_ASSIGN( 0.0f );
Q_EXTERN qboolean nolm Q_ASSIGN( qfalse );
Q_EXTERN qboolean noGridLighting Q_ASSIGN( qfalse );
Q_EXTERN qboolean noTrace Q_ASSIGN( qfalse );
@ -2293,6 +2299,7 @@ Q_EXTERN float spotScale Q_ASSIGN( 7500.0f );
Q_EXTERN float areaScale Q_ASSIGN( 0.25f );
Q_EXTERN float skyScale Q_ASSIGN( 1.0f );
Q_EXTERN float bounceScale Q_ASSIGN( 0.25f );
Q_EXTERN float vertexglobalscale Q_ASSIGN( 1.0f );
/* jal: alternative angle attenuation curve */
Q_EXTERN qboolean lightAngleHL Q_ASSIGN( qfalse );

View File

@ -660,7 +660,7 @@ static shaderInfo_t *AllocShaderInfo( void ){
si->patchShadows = qfalse;
si->vertexShadows = qtrue; /* ydnar: changed default behavior */
si->forceSunlight = qfalse;
si->vertexScale = 1.0;
si->vertexScale = vertexglobalscale;
si->notjunc = qfalse;
/* ydnar: set texture coordinate transform matrix to identity */
@ -727,6 +727,9 @@ void FinishShader( shaderInfo_t *si ){
}
}
}
if (noob && !(si->compileFlags & C_OB)){
ApplySurfaceParm( "noob", &si->contentFlags, &si->surfaceFlags, &si->compileFlags );
}
/* set to finished */
si->finished = qtrue;
@ -1603,11 +1606,11 @@ static void ParseShaderFile( const char *filename ){
/* q3map_vertexScale (scale vertex lighting by this fraction) */
else if ( !Q_stricmp( token, "q3map_vertexScale" ) ) {
GetTokenAppend( shaderText, qfalse );
si->vertexScale = atof( token );
si->vertexScale *= atof( token );
}
/* q3map_noVertexLight */
else if ( !Q_stricmp( token, "q3map_noVertexLight" ) ) {
else if ( !Q_stricmp( token, "q3map_noVertexLight" ) ) {
si->noVertexLight = qtrue;
}

View File

@ -598,7 +598,7 @@ void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ){
----------------------------------------------------------------- */
/* vertex lit surfaces don't need this information */
if ( si->compileFlags & C_VERTEXLIT || ds->type == SURFACE_TRIANGLES ) {
if ( si->compileFlags & C_VERTEXLIT || ds->type == SURFACE_TRIANGLES || nolm == qtrue ) {
VectorClear( ds->lightmapAxis );
//% VectorClear( ds->lightmapVecs[ 2 ] );
ds->sampleSize = 0;
@ -3648,10 +3648,10 @@ void FilterDrawsurfsIntoTree( entity_t *e, tree_t *tree ){
}
/* ydnar: remap shader */
if ( ds->shaderInfo->remapShader && ds->shaderInfo->remapShader[ 0 ] ) {
/* if ( ds->shaderInfo->remapShader && ds->shaderInfo->remapShader[ 0 ] ) {
ds->shaderInfo = ShaderInfoForShader( ds->shaderInfo->remapShader );
}
*/
/* ydnar: gs mods: handle the various types of surfaces */
switch ( ds->type )
{

View File

@ -318,16 +318,25 @@ void CalcVis( void ){
}
if ( value[ 0 ] != '\0' ) {
farPlaneDist = atof( value );
if ( farPlaneDist > 0.0f ) {
farPlaneDistMode = value[strlen(value) - 1 ];
if ( farPlaneDist != 0.0f ) {
Sys_Printf( "farplane distance = %.1f\n", farPlaneDist );
}
else{
farPlaneDist = 0.0f;
if ( farPlaneDist != 0.0f && farPlaneDistMode == 'o' ) {
Sys_Printf( "farplane Origin2Origin mode on\n" );
}
if ( farPlaneDist != 0.0f && farPlaneDistMode == 'r' ) {
Sys_Printf( "farplane Radius+Radius mode on\n" );
}
if ( farPlaneDist != 0.0f && farPlaneDistMode == 'e' ) {
Sys_Printf( "farplane Exact distance mode on\n" );
}
}
Sys_Printf( "\n--- BasePortalVis (%d) ---\n", numportals * 2 );
RunThreadsOnIndividual( numportals * 2, qtrue, BasePortalVis );

View File

@ -1614,8 +1614,28 @@ void BasePortalVis( int portalnum ){
}
*/
if( !p->sky && !tp->sky && farPlaneDist != 0.0f && farPlaneDistMode == 'o' )
{
VectorSubtract( p->origin, tp->origin, dir );
if( VectorLength( dir ) > farPlaneDist )
continue;
}
if( !p->sky && !tp->sky && farPlaneDist != 0.0f && farPlaneDistMode == 'e' )
{
VectorSubtract( p->origin, tp->origin, dir );
if( VectorLength( dir ) + p->radius + tp->radius > 2.0f * farPlaneDist )
continue;
}
if( !p->sky && !tp->sky && farPlaneDist != 0.0f && farPlaneDistMode == 'r' )
{
if( p->radius + tp->radius > farPlaneDist )
continue;
}
/* ydnar: this is known-to-be-working farplane code */
if ( !p->sky && !tp->sky && farPlaneDist > 0.0f ) {
if ( !p->sky && !tp->sky && farPlaneDist != 0.0f ) {
VectorSubtract( p->origin, tp->origin, dir );
if ( VectorLength( dir ) - p->radius - tp->radius > farPlaneDist ) {
continue;