Compare commits

...
Sign in to create a new pull request.

29 commits

Author SHA1 Message Date
Fedora Release Engineering
5110f7b0d3 Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild 2026-07-17 08:26:08 +00:00
Fedora Release Engineering
7b46880dec Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild 2026-01-17 19:51:27 +00:00
Fedora Release Engineering
cc1371337c Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild 2025-07-25 20:02:15 +00:00
Fedora Release Engineering
5db265cd51 Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild 2025-01-19 14:14:36 +00:00
Fedora Release Engineering
fc786dfa74 Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild 2024-07-20 08:41:18 +00:00
Gwyn Ciesla
6c9fe122f4 Fix FTBFS 2024-02-06 15:01:23 -06:00
Fedora Release Engineering
8c262a3ef9 Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-27 07:35:37 +00:00
Fedora Release Engineering
790e9f3aa2 Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-07-22 17:32:20 +00:00
Gwyn Ciesla
e0a3446465 migrated to SPDX license 2023-03-04 17:00:55 -06:00
Fedora Release Engineering
88eabdee26 Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-01-21 06:12:51 +00:00
Lumir Balhar
30d292cec3 Switch from pathfix.py to %py3_shebang_fix
For more info see https://fedoraproject.org/wiki/Changes/Python3.12#pathfix.py_tool_will_be_removed
2022-11-01 07:20:50 +01:00
Fedora Release Engineering
7b72879535 Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2022-07-23 11:47:34 +00:00
Fedora Release Engineering
0da11c751c - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2022-01-22 03:53:32 +00:00
Fedora Release Engineering
5e344ba1df - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2021-07-23 20:23:19 +00:00
3d47c56b01 update code and data, rebuild 2021-02-12 09:05:38 -05:00
Fedora Release Engineering
ba043190bc - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2021-01-27 22:59:27 +00:00
Fedora Release Engineering
f4faf3a528 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2020-07-29 13:37:57 +00:00
Gwyn Ciesla
3f5bbdda3a Fix crash. 2020-03-23 11:33:27 -05:00
Fedora Release Engineering
f4a5ce258b - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2020-01-31 03:03:01 +00:00
Gwyn Ciesla
bb7a2f68f6 Ugh. 2019-08-19 10:44:01 -05:00
Gwyn Ciesla
dff7d07a25 Another path fix. 2019-08-19 10:26:31 -05:00
Gwyn Ciesla
78d7325629 Adjust for flatpak 2019-08-19 09:55:00 -05:00
Gwyn Ciesla
f6a0856898 Fix FTBFS. 2019-08-03 12:46:15 -05:00
Fedora Release Engineering
e9a08b351f - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2019-07-27 02:53:27 +00:00
Fedora Release Engineering
91bfb6394e - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2019-02-03 11:11:42 +00:00
Gwyn Ciesla
cd7bf3177c Fix shebang handling. 2018-09-11 08:01:02 -05:00
Gwyn Ciesla
2ff375f69d Fix FTBFS. 2018-08-21 12:40:48 -05:00
Gwyn Ciesla
a886ee252c FTBFS work. 2018-08-21 10:19:00 -05:00
Fedora Release Engineering
eff7c80936 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2018-07-14 08:28:53 +00:00
9 changed files with 96 additions and 1024 deletions

2
.gitignore vendored
View file

@ -3,3 +3,5 @@ vdrift-2009-06-15-src.tar.bz2
/vdrift-2011-10-22.tar.bz2
/vdrift-2012-07-22.tar.bz2
/vdrift-2014-10-20.tar.bz2
/vdrift-5ae309f.tar.gz
/vdrift-data-20210211.tar.xz

View file

@ -1 +1,2 @@
524751fab341b36f59d0747ea52f0c41 vdrift-2014-10-20.tar.bz2
SHA512 (vdrift-5ae309f.tar.gz) = 54f578e70ef6a9b8d8697ad842b803adfff77230a392bb4e069469422f472571f2b47a6a87aecb46bf17f3d2cafce2a3989857fda43030ad67e5b6d9a8c13953
SHA512 (vdrift-data-20210211.tar.xz) = d7beece201129b7be8cdca4d1d4e84c9656f2d6a03650f6576dad29d8231367402e7d32d4e24df22cbce2af842c930b8ed9492e4a1e7e480fe7569acdd992cf5

View file

@ -1,11 +0,0 @@
--- SConstruct~ 2010-07-01 16:07:10.000000000 -0500
+++ SConstruct 2010-07-01 16:15:43.529291853 -0500
@@ -138,7 +138,7 @@
CPPPATH = ['#include', '#bullet'],
CCFLAGS = ['-Wall', '-Wextra', '-Wno-unused-parameter', '-pthread'],
LIBPATH = ['.', '#lib'],
- LINKFLAGS = ['-pthread'],
+ LINKFLAGS = ['-pthread','-lGLU','-lGL'],
CC = 'gcc', CXX = 'g++',
options = opts)
check_headers = ['asio.hpp', 'boost/bind.hpp', 'GL/gl.h', 'GL/glu.h', 'SDL/SDL.h', 'SDL/SDL_image.h', 'SDL/SDL_rotozoom.h', 'vorbis/vorbisfile.h', 'GL/glew.h']

View file

@ -1,34 +0,0 @@
Index: include/cardynamics.h
===================================================================
--- include/cardynamics.h
+++ include/cardynamics.h 2011-02-19 15:58:42.924055598 +0100
@@ -20,6 +20,7 @@
#include "collision_contact.h"
#include "cartelemetry.h"
#include "BulletDynamics/Dynamics/btActionInterface.h"
+#include "BulletDynamics/Dynamics/btRigidBody.h"
class MODEL;
class CONFIGFILE;
--- src/SConscript.orig 2011-02-19 17:32:57.927061608 +0100
+++ src/SConscript 2011-02-19 17:33:41.211055956 +0100
@@ -233,7 +233,7 @@
#--------------------------#
appdir = ""
vdrift_install = None
-common_libs = ['SDL_image', 'SDL_gfx', 'vorbisfile', 'vdriftbullet']
+common_libs = ['SDL_image', 'SDL_gfx', 'vorbisfile']
if (sys.platform == 'freebsd6') or (sys.platform == 'freebsd7') or (sys.platform == 'freebsd8'):
common_libs.append('libbulletcollision')
@@ -305,9 +305,8 @@
# Compile Executable #
#--------------------#
#vdrift = local_env.Program(target='%s${EXECUTABLE_NAME}' % appdir, source=[src, vamosobjs, guiobjs])
-vdriftbullet = local_env.Library('vdriftbullet', bullet_src);
+local_env.ParseConfig('pkg-config bullet --libs --cflags')
vdrift = local_env.Program(target='%s${EXECUTABLE_NAME}' % appdir, source=src)
-Depends(vdrift, vdriftbullet)
Default(Alias('vdrift', vdrift))
#---------#

View file

@ -1,12 +0,0 @@
diff -up ./src/dynamicsworld.cpp.bullet281 ./src/dynamicsworld.cpp
--- ./src/dynamicsworld.cpp.bullet281 2012-10-13 14:18:39.646677972 -0400
+++ ./src/dynamicsworld.cpp 2012-10-13 14:18:52.874174967 -0400
@@ -101,7 +101,7 @@ bool DynamicsWorld::castRay(
int patch_id = -1;
const BEZIER * b = 0;
const TRACKSURFACE * s = TRACKSURFACE::None();
- btCollisionObject * c = 0;
+ const btCollisionObject * c = 0;
MyRayResultCallback ray(origin, p, caster);
rayTest(origin, p, ray);

View file

@ -1,889 +0,0 @@
--- data/skins/simple/menus/AssignControl Mon Jan 19 23:26:36 1970
+++ data/skins/simple/menus/AssignControl Mon Jan 19 23:26:36 1970
@@ -46,7 +46,7 @@
image = white.png
color = 0.172, 0.161, 0.169
alpha = 0.7
-left = 0.2
-right = 0.2
+left = 0.1
+right = 0.1
top = 0.48
height = 0.04
--- data/skins/simple/menus/GuiControls Mon Jan 19 23:26:36 1970
+++ data/skins/simple/menus/GuiControls Mon Jan 19 23:26:36 1970
@@ -82,7 +82,7 @@
onselect = controledit.string:gui_select:0
onmoveleft = widget-01d
onmoveright = widget-01c
-onmoveup = widget-13b
+onmoveup = widget-08b
onmovedown = widget-02b
onfocus = widget-01b.sat:0.56
onblur = widget-01b.sat:0.0
@@ -101,7 +101,7 @@
onselect = controledit.string:gui_select:1
onmoveleft = widget-01b
onmoveright = widget-01d
-onmoveup = widget-13b
+onmoveup = widget-08b
onmovedown = widget-02c
onfocus = widget-01c.sat:0.56
onblur = widget-01c.sat:0.0
@@ -120,7 +120,7 @@
onselect = controledit.string:gui_select:2
onmoveleft = widget-01c
onmoveright = widget-01b
-onmoveup = widget-13b
+onmoveup = widget-08b
onmovedown = widget-02d
onfocus = widget-01d.sat:0.56
onblur = widget-01d.sat:0.0
--- data/skins/simple/menus/InGameMain Mon Jan 19 23:26:36 1970
+++ data/skins/simple/menus/InGameMain Mon Jan 19 23:26:36 1970
@@ -44,10 +44,10 @@
[ widget-01 ]
-text = Return to Game
+text = Continue
fontsize = 0.035
align = left
-tip = Leave the menu and unpause the game.
+tip = Leave the menu and continue the game.
onselect = ReturnToGame
onmoveup = widget-05
onmovedown = widget-02
@@ -72,7 +72,7 @@
[ widget-02 ]
-text = Restart Game
+text = Restart
fontsize = 0.035
align = left
tip = Restart this game using the same car and track settings.
@@ -100,7 +100,7 @@
[ widget-03 ]
-text = Leave Game
+text = Abort
fontsize = 0.035
align = left
tip = Leave game and return to the Main menu.
--- data/skins/simple/menus/InputDevice Mon Jan 19 23:26:36 1970
+++ data/skins/simple/menus/InputDevice Mon Jan 19 23:26:36 1970
@@ -82,7 +82,7 @@
onselect = joystick.type.prev
onmoveleft = joystick.type.prev
onmoveright = joystick.type.next
-onmoveup = widget-13b
+onmoveup = widget-11b
onmovedown = widget-02b
onfocus = widget-01b.alpha:1 widget-01c.alpha:1 widget-01d.sat:0.56
onblur = widget-01b.alpha:0 widget-01c.alpha:0 widget-01d.sat:0.0
@@ -102,7 +102,7 @@
onselect = joystick.type.next
onmoveleft = joystick.type.prev
onmoveright = joystick.type.next
-onmoveup = widget-13b
+onmoveup = widget-11b
onmovedown = widget-02b
onfocus = widget-01b.alpha:1 widget-01c.alpha:1 widget-01d.sat:0.56
onblur = widget-01b.alpha:0 widget-01c.alpha:0 widget-01d.sat:0.0
--- data/skins/simple/menus/SingleRace Mon Jan 19 23:26:36 1970
+++ data/skins/simple/menus/SingleRace Mon Jan 19 23:26:36 1970
@@ -860,7 +860,7 @@
onmoveleft = game.vehicle_damage.prev
onmoveright = game.vehicle_damage.next
onmoveup = widget-14b
-onmovedown = widget-16
+onmovedown = widget-16b
onfocus = widget-15b.alpha:1 widget-15c.alpha:1 widget-15d.sat:0.56
onblur = widget-15b.alpha:0 widget-15c.alpha:0 widget-15d.sat:0.0
focus = false
--- src/camera.h Mon Jan 19 23:26:36 1970
+++ src/camera.h Mon Jan 19 23:26:36 1970
@@ -16,7 +16,7 @@
const std::string & GetName() const { return name; }
- void SetFOV(float value) { fov = std::max(40.0f, std::min(160.0f, value)); }
+ void SetFOV(float value) { fov = std::max(0.0f, std::min(120.0f, value)); }
float GetFOV() const { return fov; }
--- src/carcontrolmap_local.cpp Mon Jan 19 23:26:36 1970
+++ src/carcontrolmap_local.cpp Mon Jan 19 23:26:36 1970
@@ -830,16 +830,6 @@
keycodes["y"] = SDLK_y;
keycodes["z"] = SDLK_z;
keycodes["DELETE"] = SDLK_DELETE;
- keycodes["KP0"] = SDLK_KP_0;
- keycodes["KP1"] = SDLK_KP_1;
- keycodes["KP2"] = SDLK_KP_2;
- keycodes["KP3"] = SDLK_KP_3;
- keycodes["KP4"] = SDLK_KP_4;
- keycodes["KP5"] = SDLK_KP_5;
- keycodes["KP6"] = SDLK_KP_6;
- keycodes["KP7"] = SDLK_KP_7;
- keycodes["KP8"] = SDLK_KP_8;
- keycodes["KP9"] = SDLK_KP_9;
keycodes["KP_PERIOD"] = SDLK_KP_PERIOD;
keycodes["KP_DIVIDE"] = SDLK_KP_DIVIDE;
keycodes["KP_MULTIPLY"] = SDLK_KP_MULTIPLY;
@@ -872,20 +862,50 @@
keycodes["F14"] = SDLK_F14;
keycodes["F15"] = SDLK_F15;
keycodes["MENU"] = SDLK_MENU;
- keycodes["APPLICATION"] = SDLK_APPLICATION;
- keycodes["NUMLOCK"] = SDLK_NUMLOCKCLEAR;
keycodes["CAPSLOCK"] = SDLK_CAPSLOCK;
- keycodes["SCROLLLOCK"] = SDLK_SCROLLLOCK;
keycodes["RSHIFT"] = SDLK_RSHIFT;
keycodes["LSHIFT"] = SDLK_LSHIFT;
keycodes["RCTRL"] = SDLK_RCTRL;
keycodes["LCTRL"] = SDLK_LCTRL;
keycodes["RALT"] = SDLK_RALT;
keycodes["LALT"] = SDLK_LALT;
+#if SDL_VERSION_ATLEAST(2,0,0)
+ keycodes["KP0"] = SDLK_KP_0;
+ keycodes["KP1"] = SDLK_KP_1;
+ keycodes["KP2"] = SDLK_KP_2;
+ keycodes["KP3"] = SDLK_KP_3;
+ keycodes["KP4"] = SDLK_KP_4;
+ keycodes["KP5"] = SDLK_KP_5;
+ keycodes["KP6"] = SDLK_KP_6;
+ keycodes["KP7"] = SDLK_KP_7;
+ keycodes["KP8"] = SDLK_KP_8;
+ keycodes["KP9"] = SDLK_KP_9;
+ keycodes["COMPOSE"] = SDLK_APPLICATION;
+ keycodes["NUMLOCK"] = SDLK_NUMLOCKCLEAR;
+ keycodes["SCROLLLOCK"] = SDLK_SCROLLLOCK;
keycodes["RMETA"] = SDLK_RGUI;
keycodes["LMETA"] = SDLK_LGUI;
keycodes["LSUPER"] = SDLK_LGUI;
keycodes["RSUPER"] = SDLK_RGUI;
+#else
+ keycodes["KP0"] = SDLK_KP0;
+ keycodes["KP1"] = SDLK_KP1;
+ keycodes["KP2"] = SDLK_KP2;
+ keycodes["KP3"] = SDLK_KP3;
+ keycodes["KP4"] = SDLK_KP4;
+ keycodes["KP5"] = SDLK_KP5;
+ keycodes["KP6"] = SDLK_KP6;
+ keycodes["KP7"] = SDLK_KP7;
+ keycodes["KP8"] = SDLK_KP8;
+ keycodes["KP9"] = SDLK_KP9;
+ keycodes["COMPOSE"] = SDLK_COMPOSE;
+ keycodes["NUMLOCK"] = SDLK_NUMLOCK;
+ keycodes["SCROLLLOCK"] = SDLK_SCROLLOCK;
+ keycodes["LMETA"] = SDLK_LMETA;
+ keycodes["RMETA"] = SDLK_RMETA;
+ keycodes["LSUPER"] = SDLK_LSUPER;
+ keycodes["RSUPER"] = SDLK_RSUPER;
+#endif
return keycodes;
}
--- src/game.cpp Mon Jan 19 23:26:36 1970
+++ src/game.cpp Mon Jan 19 23:26:36 1970
@@ -324,10 +324,6 @@
info_output << "Shutting down..." << std::endl;
- // Stop the sound thread.
- if (sound.Enabled())
- sound.Pause(true);
-
LeaveGame();
// Save settings first incase later deinits cause crashes.
@@ -499,16 +495,7 @@
}
// Connect game actions to gui options
- set_car_name.connect(gui.GetOption("game.car").signal_val);
- set_car_paint.connect(gui.GetOption("game.car_paint").signal_val);
- set_car_color_hue.connect(gui.GetOption("game.car_color_hue").signal_val);
- set_car_color_sat.connect(gui.GetOption("game.car_color_sat").signal_val);
- set_car_color_val.connect(gui.GetOption("game.car_color_val").signal_val);
- set_car_ai_type.connect(gui.GetOption("game.ai_type").signal_val);
- set_car_ai_level.connect(gui.GetOption("game.ai_level").signal_val);
- set_cars_num.connect(gui.GetOption("game.cars_num").signal_val);
- set_track_image.connect(gui.GetOption("game.track").signal_val);
- set_control.connect(gui.GetOption("controledit.string").signal_val);
+ BindActionsToGUI();
// Set options from game settings.
std::map<std::string, std::string> optionmap;
@@ -531,7 +518,6 @@
if (sound.Init(2048, info_output, error_output))
{
sound.SetVolume(settings.GetSoundVolume());
- //sound.Pause(false);
content.setSound(sound.GetDeviceInfo());
}
else
@@ -932,22 +918,18 @@
if (sound.Enabled())
{
bool pause_sound = pause || gui.Active();
- sound.Pause(pause_sound);
- if (!pause_sound)
- {
- PROFILER.beginBlock("sound");
- MATHVECTOR <float, 3> pos;
- QUATERNION <float> rot;
- if (active_camera)
- {
- pos = active_camera->GetPosition();
- rot = active_camera->GetOrientation();
- }
- sound.SetListenerPosition(pos[0], pos[1], pos[2]);
- sound.SetListenerRotation(rot[0], rot[1], rot[2], rot[3]);
- sound.Update();
- PROFILER.endBlock("sound");
- }
+ PROFILER.beginBlock("sound");
+ MATHVECTOR <float, 3> pos;
+ QUATERNION <float> rot;
+ if (active_camera)
+ {
+ pos = active_camera->GetPosition();
+ rot = active_camera->GetOrientation();
+ }
+ sound.SetListenerPosition(pos[0], pos[1], pos[2]);
+ sound.SetListenerRotation(rot[0], rot[1], rot[2], rot[3]);
+ sound.Update(pause_sound);
+ PROFILER.endBlock("sound");
}
//PROFILER.beginBlock("force-feedback");
@@ -1798,9 +1780,12 @@
// get car start position marker for camera setup
MATHVECTOR<float, 3> car_pos = track.GetStart(0).first;
- // car setup
+ // clear previous car
cars.clear();
+ // remove previous car sounds
+ sound.Update(true);
+
if (LoadCar(
cars_name[car_edit_id],
cars_paint[car_edit_id],
@@ -1808,14 +1793,13 @@
car_pos, track.GetStart(0).second,
true, false))
{
- // update car
+ // set car
CAR & car = cars.back();
dynamics.update(timestep);
car.Update(timestep);
- // process car sound sources
- // should they be loaded for garage car in the first place?
- sound.Update();
+ // add car sounds
+ sound.Update(true);
// use car shape center for camera setup
car_pos = car.GetPosition();
@@ -1958,7 +1942,7 @@
}
if (numreplays == 0)
- replaylist.push_back(std::make_pair("", "None"));
+ replaylist.push_back(std::make_pair("none", "None"));
settings.SetSelectedReplay(replaylist.begin()->first);
}
@@ -2411,6 +2395,7 @@
track.Clear();
cars.clear();
+ sound.Update(true);
hud.SetVisible(false);
inputgraph.Hide();
trackmap.Unload();
@@ -2419,7 +2404,6 @@
pause = false;
race_laps = 0;
tire_smoke.Clear();
- sound.Update();
}
void GAME::StartPractice()
@@ -2473,7 +2457,7 @@
void GAME::StartReplay()
{
- if (!settings.GetSelectedReplay().empty() && !NewGame(true))
+ if (settings.GetSelectedReplay() != "none" && !NewGame(true))
{
gui.ActivatePage("ReplayStartError", 0.25, error_output);
}
@@ -2855,6 +2839,19 @@
EditControl();
}
+void GAME::BindActionsToGUI()
+{
+ set_car_name.connect(gui.GetOption("game.car").signal_val);
+ set_car_paint.connect(gui.GetOption("game.car_paint").signal_val);
+ set_car_color_hue.connect(gui.GetOption("game.car_color_hue").signal_val);
+ set_car_color_sat.connect(gui.GetOption("game.car_color_sat").signal_val);
+ set_car_color_val.connect(gui.GetOption("game.car_color_val").signal_val);
+ set_car_ai_type.connect(gui.GetOption("game.ai_type").signal_val);
+ set_car_ai_level.connect(gui.GetOption("game.ai_level").signal_val);
+ set_cars_num.connect(gui.GetOption("game.cars_num").signal_val);
+ set_track_image.connect(gui.GetOption("game.track").signal_val);
+ set_control.connect(gui.GetOption("controledit.string").signal_val);
+}
void GAME::RegisterActions()
{
--- src/game.h Mon Jan 19 23:26:36 1970
+++ src/game.h Mon Jan 19 23:26:36 1970
@@ -201,6 +201,7 @@
void SetTrackImage(const std::string & value);
void SetControl(const std::string & value);
+ void BindActionsToGUI();
void RegisterActions();
void InitActionMap(std::map<std::string, Slot0*> & actionmap);
--- src/sound.cpp Mon Jan 19 23:26:36 1970
+++ src/sound.cpp Mon Jan 19 23:26:36 1970
@@ -30,17 +30,20 @@
}
SOUND::SOUND() :
+ log_error(0),
deviceinfo(0, 0, 0, 0),
+ sound_volume(0),
initdone(false),
disable(false),
- paused(true),
sampler_lock(0),
source_lock(0),
+ set_pause(true),
max_active_sources(64),
sources_num(0),
- samplers_num(0)
+ sources_pause(true),
+ samplers_num(0),
+ samplers_pause(true)
{
- volume_filter.SetFilterOrder0(1.0);
sources.reserve(64);
samplers.reserve(64);
}
@@ -115,11 +118,13 @@
}
deviceinfo = SOUNDINFO(samples, frequency, channels, bytespersample);
-
+ log_error = &error_output;
initdone = true;
-
SetVolume(1.0);
+ // enable sound, run callback
+ SDL_PauseAudio(false);
+
return true;
}
@@ -138,46 +143,21 @@
disable = true;
}
-void SOUND::Pause(bool value)
-{
- if (paused != value)
- {
- SDL_PauseAudio(value);
- paused = value;
- }
-}
-
-void SOUND::Update()
+void SOUND::Update(bool pause)
{
if (disable) return;
+ set_pause = pause;
+
GetSourceChanges();
ProcessSourceStop();
- ProcessSourceRemove();
-
ProcessSources();
- SetSamplerChanges();
-
- // short circuit if paused(sound thread blocked)
- if (paused)
- {
- GetSamplerChanges();
-
- ProcessSamplerAdd();
-
- ProcessSamplerRemove();
-
- SetSourceChanges();
-
- GetSourceChanges();
-
- ProcessSourceStop();
+ ProcessSourceRemove();
- ProcessSourceRemove();
- }
+ SetSamplerChanges();
}
void SOUND::SetMaxActiveSources(size_t value)
@@ -192,18 +172,24 @@
size_t id = item_num;
if (id < items.size())
{
+ // reuse free slot
size_t idn = items[id].id;
if (idn != id)
{
- // swap back redirected item
+ // free slot is redirecting to other item
assert(idn < id);
+
+ // swap redirected item back
items[id] = items[idn];
+
+ // use now free slot
id = idn;
}
items[id] = item;
}
else
{
+ // add item to new slot
items.push_back(item);
}
items[id].id = id;
@@ -217,9 +203,14 @@
inline void RemoveItem(size_t id, std::vector<T> & items, size_t & item_num)
{
assert(id < items.size());
+
+ // get item true id
size_t idn = items[id].id;
assert(idn < item_num);
+
+ // pop last item
--item_num;
+
// swap last item with current
size_t idl = items[item_num].id;
if (idl != item_num)
@@ -270,14 +261,13 @@
ns.id = -1;
sampler_add.getFirst().push_back(ns);
- //std::cout << "Add sound source: " << id << " " << buffer->GetName() << std::endl;
+ //*log_error << "Add sound source: " << id << " " << buffer->GetName() << std::endl;
return id;
}
void SOUND::RemoveSource(size_t id)
{
- // notify sound thread, it will notify main thread to remove the source
- //std::cout << "To be removed source: " << id << " " << sources[sources[id].id].buffer->GetName() << std::endl;
+ // notify sound and main thread to remove the source/sampler
sampler_remove.getFirst().push_back(id);
}
@@ -343,14 +333,13 @@
void SOUND::SetVolume(float value)
{
- volume_filter.SetFilterOrder0(clamp(value, 0.f, 1.f));
+ sound_volume = value;
}
void SOUND::GetSourceChanges()
{
Lock(source_lock);
source_stop.swapFirst();
- source_remove.swapFirst();
Unlock(source_lock);
}
@@ -368,17 +357,18 @@
void SOUND::ProcessSourceRemove()
{
- std::vector<size_t> & sremove = source_remove.getFirst();
+ std::vector<size_t> & sremove = sampler_remove.getFirst();
for (size_t i = 0; i < sremove.size(); ++i)
{
size_t id = sremove[i];
assert(id < sources.size());
+
size_t idn = sources[id].id;
assert(idn < sources_num);
- //std::cout << "Remove sound source: " << id << " " << sources[idn].buffer->GetName() << std::endl;
+ //*log_error << "Remove sound source: " << id << " " << sources[idn].buffer->GetName() << std::endl;
+
RemoveItem(id, sources, sources_num);
}
- sremove.clear();
}
void SOUND::ProcessSources()
@@ -436,8 +426,11 @@
}
}
- supdate[i].gain1 = gain1 * Sampler::denom;
- supdate[i].gain2 = gain2 * Sampler::denom;
+ // fade sound volume
+ float volume = set_pause ? 0 : sound_volume;
+
+ supdate[i].gain1 = volume * gain1 * Sampler::denom;
+ supdate[i].gain2 = volume * gain2 * Sampler::denom;
supdate[i].pitch = src.pitch * Sampler::denom;
}
@@ -471,6 +464,7 @@
if (sampler_update.getFirst().size()) sampler_update.swapFirst();
if (sampler_add.getFirst().size()) sampler_add.swapFirst();
if (sampler_remove.getFirst().size()) sampler_remove.swapFirst();
+ sources_pause = set_pause;
Unlock(sampler_lock);
}
@@ -478,33 +472,41 @@
{
Lock(sampler_lock);
sampler_update.swapLast();
- sampler_remove.swapLast();
sampler_add.swapLast();
+ sampler_remove.swapLast();
+ samplers_fade = samplers_pause != sources_pause;
+ samplers_pause = sources_pause;
Unlock(sampler_lock);
}
void SOUND::ProcessSamplerUpdate()
{
std::vector<SamplerUpdate> & supdate = sampler_update.getLast();
- if (samplers_num == supdate.size())
+ if (supdate.empty()) return;
+
+ assert(samplers_num == supdate.size());
+ for (size_t i = 0; i < samplers_num; ++i)
{
- for (size_t i = 0; i < samplers_num; ++i)
- {
- samplers[i].gain1 = supdate[i].gain1;
- samplers[i].gain2 = supdate[i].gain2;
- samplers[i].pitch = supdate[i].pitch;
- }
+ samplers[i].gain1 = supdate[i].gain1;
+ samplers[i].gain2 = supdate[i].gain2;
+ samplers[i].pitch = supdate[i].pitch;
}
supdate.clear();
}
void SOUND::ProcessSamplers(unsigned char *stream, int len)
{
- // set buffers and clear stream
+ // clear stream
+ memset(stream, 0, len);
+
+ // pause sampling
+ if (samplers_pause && !samplers_fade)
+ return;
+
+ // init sampling buffers
int len4 = len / 4;
buffer1.resize(len4);
buffer2.resize(len4);
- memset(stream, 0, len);
// run samplers
short * sstream = (short*)stream;
@@ -519,13 +521,17 @@
{
SampleAndAdvanceWithPitch16bit(smp, &buffer1[0], &buffer2[0], len4);
- volume_filter.Filter(&buffer1[0], &buffer2[0], len4);
-
for (int n = 0; n < len4; ++n)
{
int pos = n * 2;
- sstream[pos] = clamp(sstream[pos] + buffer1[n], -32768, 32767);
- sstream[pos + 1] = clamp(sstream[pos + 1] + buffer2[n], -32768, 32767);
+ int val1 = sstream[pos] + buffer1[n];
+ int val2 = sstream[pos + 1] + buffer2[n];
+
+ val1 = clamp(val1, -32768, 32767);
+ val2 = clamp(val2, -32768, 32767);
+
+ sstream[pos] = val1;
+ sstream[pos + 1] = val2;
}
}
else
@@ -541,17 +547,13 @@
void SOUND::ProcessSamplerRemove()
{
std::vector<size_t> & sremove = sampler_remove.getLast();
- if (!sremove.empty())
+ for (size_t i = 0; i < sremove.size(); ++i)
{
- for (size_t i = 0; i < sremove.size(); ++i)
- {
- size_t id = sremove[i];
- assert(id < samplers.size());
- RemoveItem(id, samplers, samplers_num);
- }
- source_remove.getLast() = sremove;
- sremove.clear();
+ size_t id = sremove[i];
+ assert(id < samplers.size());
+ RemoveItem(id, samplers, samplers_num);
}
+ sremove.clear();
}
void SOUND::ProcessSamplerAdd()
@@ -589,7 +591,6 @@
{
Lock(source_lock);
if (source_stop.getLast().size()) source_stop.swapLast();
- if (source_remove.getLast().size()) source_remove.swapLast();
Unlock(source_lock);
}
@@ -600,12 +601,12 @@
GetSamplerChanges();
+ ProcessSamplerAdd();
+
ProcessSamplerUpdate();
ProcessSamplers(stream, len);
- ProcessSamplerAdd();
-
ProcessSamplerRemove();
SetSourceChanges();
@@ -622,9 +623,10 @@
assert(len > 0);
assert(sampler.buffer);
- // if not playing, fill output buffers with silence, should not happen
+ // if not playing, fill output buffers with silence
if (!sampler.playing)
{
+ // should be dealt with before getting here
assert(0);
for (int i = 0; i < len; ++i)
{
--- src/sound.h Mon Jan 19 23:26:36 1970
+++ src/sound.h Mon Jan 19 23:26:36 1970
@@ -33,11 +33,8 @@
// disable sound
void Disable();
- // pause sound
- void Pause(bool value);
-
// commit state changes
- void Update();
+ void Update(bool pause);
// active sources limit can be adjusted at runtime
void SetMaxActiveSources(size_t value);
@@ -69,14 +66,14 @@
void SetVolume(float value);
private:
+ std::ostream * log_error;
SOUNDINFO deviceinfo;
- SOUNDFILTER volume_filter;
MATHVECTOR<float, 3> listener_pos;
MATHVECTOR<float, 3> listener_vel;
QUATERNION<float> listener_rot;
+ float sound_volume;
bool initdone;
bool disable;
- bool paused;
// state structs
struct Source
@@ -95,8 +92,8 @@
struct Sampler
{
- static const int denom = 1 << 15;
- static const int max_gain_delta = (denom * 100) / 44100;
+ static const int denom = 32768;
+ static const int max_gain_delta = (denom * 173) / 44100; // 256 samples from min to max gain
const SOUNDBUFFER * buffer;
int samples_per_channel;
int sample_pos;
@@ -135,21 +132,24 @@
TrippleBuffer<SamplerUpdate> sampler_update;
TrippleBuffer<SamplerAdd> sampler_add;
TrippleBuffer<size_t> sampler_remove;
- TrippleBuffer<size_t> source_remove;
TrippleBuffer<size_t> source_stop;
SDL_mutex * sampler_lock;
SDL_mutex * source_lock;
+ bool set_pause;
// sound sources state
std::vector<SourceActive> sources_active;
std::vector<Source> sources;
size_t max_active_sources;
size_t sources_num;
+ bool sources_pause;
// sound thread state
std::vector<int> buffer1, buffer2;
std::vector<Sampler> samplers;
size_t samplers_num;
+ bool samplers_pause;
+ bool samplers_fade;
// main thread methods
void GetSourceChanges();
--- src/texture.cpp Mon Jan 19 23:26:36 1970
+++ src/texture.cpp Mon Jan 19 23:26:36 1970
@@ -179,6 +179,7 @@
else
{
error << "Error loading texture file: " + path << std::endl;
+ error << IMG_GetError();
return false;
}
@@ -303,6 +304,7 @@
else
{
error << "Error loading texture file: " + path + " (" + cubefiles[i] + ")" << std::endl;
+ error << IMG_GetError();
return false;
}
@@ -477,6 +479,7 @@
if (!orig_surface)
{
error << "Error loading texture file: " << path << std::endl;
+ error << IMG_GetError();
return false;
}
}
--- src/cardynamics.cpp Mon Jan 19 23:26:36 1970
+++ src/cardynamics.cpp Mon Jan 19 23:26:36 1970
@@ -1791,23 +1791,29 @@
bool CARDYNAMICS::WheelContactCallback(
btManifoldPoint& cp,
- const btCollisionObject* colObj0,
- int partId0,
+ const btCollisionObjectWrapper* col0,
+ int part0,
int index0,
- const btCollisionObject* colObj1,
- int partId1,
+ const btCollisionObjectWrapper* col1,
+ int part1,
int index1)
{
- // cars are fracture bodies, wheel is a cylinder shape
- const btCollisionShape* shape = colObj0->getCollisionShape();
- if ((colObj0->getInternalType() & CO_FRACTURE_TYPE) &&
+#if (BT_BULLET_VERSION < 281)
+ const btCollisionObject* obj = col0;
+ const btCollisionShape* shape = obj->getCollisionShape();
+ const btCollisionShape* rootshape = obj->getRootCollisionShape();
+#else
+ const btCollisionObject* obj = col0->getCollisionObject();
+ const btCollisionShape* shape = col0->getCollisionShape();
+ const btCollisionShape* rootshape = obj->getCollisionShape();
+#endif
+ if ((obj->getInternalType() & CO_FRACTURE_TYPE) &&
(shape->getShapeType() == CYLINDER_SHAPE_PROXYTYPE))
{
- // is contact within contact patch?
- const btCompoundShape* car = static_cast<const btCompoundShape*>(colObj0->getRootCollisionShape());
- const btCylinderShapeX* wheel = static_cast<const btCylinderShapeX*>(shape);
- btVector3 contactPoint = cp.m_localPointA - car->getChildTransform(cp.m_index0).getOrigin();
- if (-direction::up.dot(contactPoint) > 0.5 * wheel->getRadius())
+ const btCompoundShape* carshape = static_cast<const btCompoundShape*>(rootshape);
+ const btCylinderShapeX* wheelshape = static_cast<const btCylinderShapeX*>(shape);
+ btVector3 contactPoint = cp.m_localPointA - carshape->getChildTransform(cp.m_index0).getOrigin();
+ if (-direction::up.dot(contactPoint) > 0.5 * wheelshape->getRadius())
{
// break contact (hack)
cp.m_normalWorldOnB = btVector3(0, 0, 0);
--- src/cardynamics.h Mon Jan 19 23:26:36 1970
+++ src/cardynamics.h Mon Jan 19 23:26:36 1970
@@ -25,6 +25,12 @@
class FractureBody;
class PTree;
+#if (BT_BULLET_VERSION < 281)
+#define btCollisionObjectWrapper btCollisionObject
+#else
+struct btCollisionObjectWrapper;
+#endif
+
class CARDYNAMICS : public btActionInterface
{
friend class PERFORMANCE_TESTING;
@@ -151,11 +157,11 @@
static bool WheelContactCallback(
btManifoldPoint& cp,
- const btCollisionObject* colObj0,
- int partId0,
+ const btCollisionObjectWrapper* col0,
+ int part0,
int index0,
- const btCollisionObject* colObj1,
- int partId1,
+ const btCollisionObjectWrapper* col1,
+ int part1,
int index1);
protected:
--- src/dynamicsworld.cpp Mon Jan 19 23:26:36 1970
+++ src/dynamicsworld.cpp Mon Jan 19 23:26:36 1970
@@ -221,6 +221,7 @@
void DynamicsWorld::fractureCallback()
{
+#if (BT_BULLET_VERSION < 281)
m_activeConnections.resize(0);
int numManifolds = getDispatcher()->getNumManifolds();
@@ -268,4 +269,5 @@
btRigidBody* child = body->updateConnection(con_id);
if (child) addRigidBody(child);
}
+#endif
}

View file

@ -1,12 +0,0 @@
diff -up ./src/graphics/model_obj.cpp.gcc6 ./src/graphics/model_obj.cpp
--- ./src/graphics/model_obj.cpp.gcc6 2016-02-09 19:02:50.282554264 -0500
+++ ./src/graphics/model_obj.cpp 2016-02-09 19:03:10.566308088 -0500
@@ -221,7 +221,7 @@ bool ModelObj::Save(const std::string &
std::ofstream f(strFileName.c_str());
if (!f)
{
- error_output << "Error opening file for writing: " << error_output << endl;
+ error_output << "Error opening file for writing: " << strFileName << endl;
return false;
}

View file

@ -1,13 +0,0 @@
--- SConstruct~ 2011-09-01 04:22:58.000000000 -0500
+++ SConstruct 2012-01-18 14:40:08.535239681 -0600
@@ -507,8 +507,8 @@
# Subdirectories #
#----------------#
Export(['env', 'version', 'src_dir', 'bin_dir'])
-if 'install' in COMMAND_LINE_TARGETS:
- SConscript('data/SConscript')
+#if 'install' in COMMAND_LINE_TARGETS:
+# SConscript('data/SConscript')
if 'src-package' in COMMAND_LINE_TARGETS:
SConscript('tools/SConscript')

View file

@ -1,40 +1,29 @@
%global commit 5ae309f1048c863f4745cd50c8cd81f98340b1d4
%global shortcommit %(c=%{commit}; echo ${c:0:7})
Name: vdrift
Version: 20141020
Release: 13%{?dist}
Release: 36.git%{shortcommit}%{?dist}
Summary: Driving/drift racing simulation
Group: Amusements/Games
License: GPLv3+
License: GPL-3.0-or-later
URL: http://vdrift.net
#Source0: %{name}-2010-06-30.tar.bz2
Source0: http://downloads.sourceforge.net/%{name}/%{name}-2014-10-20.tar.bz2
#Original upstream:
#Source0: http://downloads.sourceforge.net/%{name}/%{name}-2009-06-15-src.tar.bz2
# Modified:
# cd docs
# rm SConscript INSTALL
# cd ..
# rm -rf tools/win
Source0: https://github.com/VDrift/vdrift/archive/%{commit}/%{name}-%{shortcommit}.tar.gz
Source1: vdrift.desktop
Source2: vdrift.png
#Patch0: vdrift-SConstruct.patch
# Data
# svn checkout https://svn.code.sf.net/p/vdrift/code/ vdrift-code
# mv vdrift-code/vdrift-data data
# tar cvfJ vdrift-data-20210211.tar.xz data
Source3: vdrift-data-20210211.tar.xz
Patch1: vdrift-20071226-paths.patch
Patch4: vdrift-20090215-joepack-includes.patch
#Patch5: vdrift-20090615-dsolink.patch
# patch to unbundle bullet, not upstreamable
#Patch6: vdrift-2010-06-30-unbundle.patch
#Patch7: vdrift-2011-09-09-curl.patch
#Patch8: vdrift-20111022-constfix.patch
#Patch9: vdrift-2012-07-22c_bullet281_patch.patch
# Fix bug where ostream was being written instead of filename to ostream
# Not submitted upstream
Patch10: vdrift-20141020-gcc6.patch
BuildRequires: mesa-libGL-devel
BuildRequires: SDL2-devel
BuildRequires: SDL2_image-devel
BuildRequires: SDL_gfx-devel
BuildRequires: scons
BuildRequires: libGL-devel
BuildRequires: python3-scons
BuildRequires: libvorbis-devel
BuildRequires: desktop-file-utils
BuildRequires: glew-devel
@ -43,12 +32,11 @@ BuildRequires: asio-devel
BuildRequires: bullet-devel
BuildRequires: libarchive-devel
BuildRequires: libcurl-devel
BuildRequires: python2
BuildRequires: python3-devel
BuildRequires: gcc-c++
BuildRequires: subversion
Requires: vdrift-data = %{version}
#Obsoletes: vdrift-data <= 20071226
#Provides: vdrift-data = %{version}-%{release}
%description
VDrift is a cross-platform, open source driving simulation made with drift
@ -58,7 +46,6 @@ available for Linux, FreeBSD, Mac OS X and Windows (Cygwin).
%package data
Summary: Driving/drift racing simulation data
Group: Amusements/Games
Requires: vdrift = %{version}
BuildArch: noarch
@ -72,7 +59,7 @@ These are the data files.
%prep
%setup -qn vdrift
%setup -qn vdrift-%{commit} -a 3
# unbundling
rm -rf bullet
@ -80,31 +67,16 @@ rm -rf bullet
sed -i 's/linuxx86/linuxppc/' src/SConscript
%endif
#%patch0 -p0
%patch1 -p0
%patch4 -p0
#%patch5 -p0
#%patch6 -p0
#%patch7 -p0
#%patch8 -p0
#%patch9 -p0
%patch10 -p0 -b .gcc6
%patch -P 1 -p0
%patch -P 4 -p0
%py3_shebang_fix .
#/bin/chmod -x src/gamestate.cpp
#/bin/chmod -x src/logo.cpp
#/bin/chmod -x src/objects.cpp
/bin/chmod -x src/main.cpp
/bin/chmod -x src/game.cpp
%build
CC="gcc" CXX="g++" CXXFLAGS="%{optflags}" \
python2 %{_bindir}/scons \
bin=/bin prefix=/usr use_binreloc=0 \
release=1 os_cc=1 os_cxx=1 os_cxxflags=1 \
NLS=0 \
verbose=1 \
%{?_smp_mflags}
scons %{?_smp_mflags}
%install
# As described in the README scons install is broken so DIY
@ -161,7 +133,8 @@ SentUpstream: 2014-09-25
EOF
%files
%doc README.md LICENSE
%license LICENSE
%doc README.md
%{_bindir}/vdrift
%{_datadir}/appdata/%{name}.appdata.xml
%{_datadir}/applications/vdrift.desktop
@ -171,6 +144,73 @@ EOF
%{_datadir}/vdrift
%changelog
* Fri Jul 17 2026 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-36.git5ae309f
- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild
* Sat Jan 17 2026 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-35.git5ae309f
- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild
* Fri Jul 25 2025 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-34.git5ae309f
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
* Sun Jan 19 2025 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-33.git5ae309f
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
* Sat Jul 20 2024 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-32.git5ae309f
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
* Sat Jan 27 2024 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-31.git5ae309f
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Sat Jul 22 2023 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-30.git5ae309f
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Sat Mar 04 2023 Gwyn Ciesla <gwync@protonmail.com> - 20141020-29.git5ae309f
- migrated to SPDX license
* Sat Jan 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-28.git5ae309f
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Sat Jul 23 2022 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-27.git5ae309f
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Sat Jan 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-26.git5ae309f
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-25.git5ae309f
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
* Thu Feb 11 2021 Tom Callaway <spot@fedoraproject.org> - 20141020-24.git5ae309f
- update code to latest git
- update data from latest svn
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-23
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-22
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Mon Mar 23 2020 Gwyn Ciesla <gwync@protonmail.com> - 2014-1020-21
- Change build options to fix crash.
* Fri Jan 31 2020 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-20
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Fri Aug 02 2019 Gwyn Ciesla <gwync@protonmail.com> - 20141020-18
- Fix FTBFS.
* Sat Jul 27 2019 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-17
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Sun Feb 03 2019 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-16
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Mon Sep 10 2018 Gwyn Ciesla <limburgher@gmail.com> - 20171020-15
- Fix shebang.
* Sat Jul 14 2018 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-14
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 20141020-13
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild