jvoisin
2ef2e93a46
Merge branch 'collection-lowercase' into 'master'
...
Makes key inside Collection::getCollection use lowercase
Closes #6483
See merge request OpenMW/openmw!2135
3 years ago
ζeh Matt
92e209c62a
Simplify getIsHungAppWindow
3 years ago
Matt
888d009a1e
Apply 1 suggestion(s) to 1 file(s)
3 years ago
Matt
32d50765ab
Apply 1 suggestion(s) to 1 file(s)
3 years ago
Igor Fedosov
68887e79a0
Makes key inside Collection::getCollection use lowercase
3 years ago
ζeh Matt
0d625abde0
Declare utf8ToUtf16 static
3 years ago
ζeh Matt
100e400fed
Dynamically obtain the function pointer to IsHungAppWindow
3 years ago
psi29a
80adcf3c88
Merge branch 'maybe_lock' into 'master'
...
Refactor Maybe*Locks
See merge request OpenMW/openmw!2126
3 years ago
Andrei Kortunov
d3da09878d
Drop line about non-existent UnrefQueue
3 years ago
elsid
22ed6d5c1e
Use unsigned to define number of threads
3 years ago
psi29a
54db3a97bb
Merge branch 'multiview-refactor' into 'master'
...
[Multiview] refactoring
See merge request OpenMW/openmw!2122
3 years ago
Petr Mikheev
9fbcc5df5e
Merge branch 'localization' into 'master'
...
Use Lua's YAML-based localization for MyGUI
See merge request OpenMW/openmw!2099
3 years ago
Andrei Kortunov
ccbb5e03fb
Use YAML files to translate MyGUI's localization tags
3 years ago
Mads Buvik Sandvei
b277fa48c7
Refactor multiview to avoid littering OSG_HAS_MULTIVIEW and multiview-related uniforms around the code, keep them all in multiview.cpp.
3 years ago
psi29a
aaaeed572a
Merge branch 'fix_6841' into 'master'
...
Treat empty `RootCollisionNode` in NIF as NC flag and generate VisualOnly collision shape
Closes #6841
See merge request OpenMW/openmw!2084
3 years ago
Petr Mikheev
8b8c304953
Treat empty `RootCollisionNode` in NIF as NCC flag and generate CameraOnly collision shape
3 years ago
Petr Mikheev
dc3ba3a75b
Fix #6862
3 years ago
elsid
9ac3bb753e
Move declaration private static member variables of LightManager to .cpp
...
There is no need to expose them to other translation units.
3 years ago
elsid
4211cf1c24
Use uniform indent and apply openmw naming policy
3 years ago
psi29a
510a9b9a5e
Merge branch 'navmeshtilescache_find' into 'master'
...
Avoid redundant copy when finding item in NavMeshTilesCache
See merge request OpenMW/openmw!2109
3 years ago
elsid
6fb7af3b63
Avoid redundant copy when finding item in NavMeshTilesCache
...
std::make_tuple returns a tuple for types with removed references which makes it
to copy arguments. std::tie leaves references.
3 years ago
elsid
b4f12aace1
Explicitly ignore result of std::unique_ptr::release call
...
components/nifbullet/bulletnifloader.cpp:206:13: warning: the value returned by this function should be used [bugprone-unused-return-value]
boxShape.release();
^~~~~~~~~~~~~~~~~~
components/nifbullet/bulletnifloader.cpp:232:13: warning: the value returned by this function should be used [bugprone-unused-return-value]
child.release();
^~~~~~~~~~~~~~~
components/nifbullet/bulletnifloader.cpp:233:13: warning: the value returned by this function should be used [bugprone-unused-return-value]
mStaticMesh.release();
^~~~~~~~~~~~~~~~~~~~~
components/nifbullet/bulletnifloader.cpp:240:9: warning: the value returned by this function should be used [bugprone-unused-return-value]
mStaticMesh.release();
^~~~~~~~~~~~~~~~~~~~~
components/nifbullet/bulletnifloader.cpp:246:9: warning: the value returned by this function should be used [bugprone-unused-return-value]
mAvoidStaticMesh.release();
^~~~~~~~~~~~~~~~~~~~~~~~~~
components/nifbullet/bulletnifloader.cpp:411:9: warning: the value returned by this function should be used [bugprone-unused-return-value]
childMesh.release();
^~~~~~~~~~~~~~~~~~~
components/nifbullet/bulletnifloader.cpp:425:9: warning: the value returned by this function should be used [bugprone-unused-return-value]
childShape.release();
^~~~~~~~~~~~~~~~~~~~
3 years ago
elsid
72bda2bd10
Avoid redundant initialization
...
components/nifbullet/bulletnifloader.cpp:79:24: warning: Value stored to 'a' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
unsigned short a = strip[0], b = strip[0], c = strip[1];
^ ~~~~~~~~
3 years ago
elsid
5b9ca3b979
Avoid possible division by zero
...
components/detournavigator/navmeshdb.cpp:183:43: warning: Division by zero [clang-analyzer-core.DivideZero]
setMaxPageCount(*mDb, maxFileSize / dbPageSize + static_cast<std::uint64_t>((maxFileSize % dbPageSize) != 0));
~~~~~~~~~~~~^~~~~~~~~~~~
components/detournavigator/navmeshdb.cpp:182:33: note: Calling 'getPageSize'
const auto dbPageSize = getPageSize(*mDb);
^~~~~~~~~~~~~~~~~
components/detournavigator/navmeshdb.cpp:144:13: note: 'value' initialized to 0
std::uint64_t value = 0;
^~~~~~~~~~~~~~~~~~~
components/detournavigator/navmeshdb.cpp:145:13: note: Calling 'request<DetourNavigator::(anonymous namespace)::GetPageSize, unsigned long *, >'
request(db, statement, &value, 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
components/sqlite3/request.hpp:254:64: note: Left side of '&&' is false
for (std::size_t i = 0; executeStep(db, statement) && i < max; ++i)
^
components/detournavigator/navmeshdb.cpp:145:13: note: Returning from 'request<DetourNavigator::(anonymous namespace)::GetPageSize, unsigned long *, >'
request(db, statement, &value, 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
components/detournavigator/navmeshdb.cpp:146:13: note: Returning zero (loaded from 'value')
return value;
^~~~~~~~~~~~
components/detournavigator/navmeshdb.cpp:182:33: note: Returning from 'getPageSize'
const auto dbPageSize = getPageSize(*mDb);
^~~~~~~~~~~~~~~~~
components/detournavigator/navmeshdb.cpp:182:9: note: 'dbPageSize' initialized to 0
const auto dbPageSize = getPageSize(*mDb);
^~~~~~~~~~~~~~~~~~~~~
components/detournavigator/navmeshdb.cpp:183:43: note: Division by zero
setMaxPageCount(*mDb, maxFileSize / dbPageSize + static_cast<std::uint64_t>((maxFileSize % dbPageSize) != 0));
~~~~~~~~~~~~^~~~~~~~~~~~
3 years ago
AnyOldName3
2bb28b5e27
Merge branch 'fix_typo' into 'master'
...
Fix particle flags typo (#6857 )
Closes #6857
See merge request OpenMW/openmw!2102
3 years ago
glassmancody.info
0954597fa7
fix typo with wrong flags in particle nifloader
3 years ago
Andrei Kortunov
38042fd7a2
Init missing variables
3 years ago
Andrei Kortunov
aed0da46a9
Check a result of dynamic_cast
3 years ago
jvoisin
f451b09f10
Merge branch 'rm_stream_include' into 'master'
...
Remove redundant ostream, istream, iostream and sstream includes
See merge request OpenMW/openmw!2097
3 years ago
psi29a
9003e83470
Merge branch 'particle_vertex' into 'master'
...
Soft enforce vertex lighting on particle systems (i.e. with exception of normal maps)
See merge request OpenMW/openmw!2098
3 years ago
psi29a
85a8359b36
Merge branch 'only_when_necassary' into 'master'
...
Conditional soft particles
See merge request OpenMW/openmw!2078
3 years ago
glassmancody.info
7bed2208e9
only force ppl on particles with normal maps
3 years ago
elsid
bef15edf0b
Remove redundant ostream, istream, iostream and sstream includes
...
* Replace by std::to_string and operator+ where possible.
* Move the code requiring to include <sstream> from .hpp to .cpp files.
3 years ago
elsid
782d3d9680
Avoid calling getMultiview from ~StereoFrustumManager
...
Otherwise coverity complains about a function throwing exceptions called from a
destructor.
3 years ago
Andrei Kortunov
f6a07ab603
Merge branch 'fix_image_button_scale' into 'master'
...
Use float based scale factor for ImageButton texture (#6849 )
Closes #6849
See merge request OpenMW/openmw!2076
3 years ago
elsid
a16c55c93f
Use float based scale factor for ImageButton texture
3 years ago
jvoisin
bbcc12262f
Merge branch 'fix_icu_from_utf8_debug_crash' into 'master'
...
Avoid constructing icu::StringPiece from std::string directly (#6782 )
Closes #6782
See merge request OpenMW/openmw!2073
3 years ago
jvoisin
498a835b77
Merge branch 'coverity' into 'master'
...
Fix some Coverity issues
See merge request OpenMW/openmw!2082
3 years ago
Andrei Kortunov
fe785ea788
Don't cast away const when we can avoid it
3 years ago
Andrei Kortunov
14b5674d32
Init missing data members
3 years ago
Andrei Kortunov
124db67496
Add an assert to detect possible nullptr dereference
3 years ago
Andrei Kortunov
5d94a94a98
Use a Boost API to resolve symlinks instead of low-level code
3 years ago
Andrei Kortunov
7cce341822
Fix initializer
3 years ago
Andrei Kortunov
d2a1cc954f
Remove unused variable
3 years ago
Andrei Kortunov
aa349f2ed9
Initialize some missing variables
3 years ago
Andrei Kortunov
523ad825c2
There is no point to compare an unsigned value with 0
3 years ago
glassmancody.info
a0265ffb89
only enable soft particles when enabled in settings
3 years ago
AnyOldName3
6609243c87
Merge branch 'dont_notice_me_launcher_senpai' into 'master'
...
Don't load content entries from global and local configs
Closes #6441
See merge request OpenMW/openmw!2068
3 years ago
Petr Mikheev
11d1a54626
Merge branch 'more-stereo-woes' into 'master'
...
More stereo-postprocessing integration
See merge request OpenMW/openmw!2054
3 years ago
Mads Buvik Sandvei
6dc727cf8f
More stereo-postprocessing integration
3 years ago
florent.teppe
4f832f479b
Fixes compressed BSA loading
...
When creating the folders map, the folder name without / is hashed, but when trying to get a file record, when looking for a folder it was hashed wit the /
So now in getFileRecord parent_path is used instead
3 years ago
AnyOldName3
58593a1e62
Merge branch 'disable_crash_catcher' into 'master'
...
Allow to disable crash catcher on Windows
See merge request OpenMW/openmw!2072
3 years ago
elsid
d2ed62ec3a
Allow to disable crash catcher on Windows
3 years ago
elsid
316f666e77
Avoid constructing icu::StringPiece from std::string directly
...
Otherwise it causes a crash on Windows when OpenMW is built in debug
mode but ICU not.
3 years ago
elsid
5891d58f63
Fix C4456 msvc warning
...
declaration of 'it' hides previous local declaration
3 years ago
elsid
8544aa481c
Fix C4459 msvc warning
...
declaration of 'navMeshVersion' hides global declaration
3 years ago
elsid
2d6e048d88
Fix C4589 msvc warning
...
Constructor of abstract class 'SceneUtil::KeyframeController' ignores initializer for virtual base class 'osg::Object'
3 years ago
elsid
7e6c13630a
Use target_precompile_headers for the most expensive headers
3 years ago
Evil Eye
c081b8cfa9
Don't load content entries from global and local configs
3 years ago
psi29a
56187ad977
Merge branch 'soften_me_up_like_one_of_your_french_meshes' into 'master'
...
Allow soft particle effect on any NIF
See merge request OpenMW/openmw!2015
3 years ago
glassmancody.info
b09411d396
allow soft particles on meshes and add extra data extensions
3 years ago
Petr Mikheev
d0deb37f5c
Fix several issues with sky blending
3 years ago
elsid
1a5932a669
Move std::ostream& operator<< to .cpp
3 years ago
elsid
10fbf170a2
Reduce number of includes for boost/program_options
3 years ago
psi29a
c3599ada2e
Merge branch 'imayhaverunoutofclevernifbranchnames' into 'master'
...
Clean up NIF record flags/modes
See merge request OpenMW/openmw!2047
3 years ago
psi29a
ede09309a6
Merge branch 'groundcover_progress' into 'master'
...
Show groundcover loading progress
See merge request OpenMW/openmw!1978
3 years ago
Alexei Kotov
e673f9fa76
Clean up NIF flags
3 years ago
elsid
6abb963bd9
Use string_view for StringUtils functions
3 years ago
psi29a
1a478875f0
Merge branch 'navmesh_agent_bounds' into 'master'
...
Support different agent collision shape type for pathfinding
See merge request OpenMW/openmw!2030
3 years ago
psi29a
736ea1a8a0
Merge branch 'fix_new_children_visibility' into 'master'
...
Add missing workaround for a MyGUI visibility bug
Closes #6783
See merge request OpenMW/openmw!2041
3 years ago
psi29a
feef257584
Merge branch 'postprocessor-stereo' into 'master'
...
[Postprocessing] Stereo integration
See merge request OpenMW/openmw!1988
3 years ago
Mads Buvik Sandvei
b0e4c7e76a
[Postprocessing] Stereo integration
3 years ago
psi29a
a822044199
Merge branch 'riggeoosgaext' into 'master'
...
custom class for osgAnimation::RigGeometry, Collada animated deforming body parts
See merge request OpenMW/openmw!1682
3 years ago
Nelsson Huotari
334c6dde0b
custom class for osgAnimation::RigGeometry, Collada animated deforming body parts
3 years ago
elsid
1a12c453d6
Support different agent collision shape type for pathfinding
...
Actors may have different collision shapes. Currently there are axis-aligned
bounding boxes and rotating bounding boxes. With AABB it's required to use
bounding cylinder for navmesh agent to avoid providing paths where actor can't
pass. But for rotating bounding boxes cylinder with diameter equal to the front
face width should be used to not reduce of available paths. For example rats
have rotating bounding box as collision shape because of the difference between
front and side faces width.
* Add agent bounds to navmesh tile db cache key. This is required to distinguish
tiles for agents with different bounds.
* Increase navmesh version because navmesh tile db cache key and data has changed.
* Move navmesh version to the code to avoid misconfiguration by users.
* Fix all places where wrong half extents were used for pathfinding.
3 years ago
Petr Mikheev
3bf18c601c
Better fog
3 years ago
uramer
591fa9b700
Add missing workaround for a MyGUI visibility bug
3 years ago
psi29a
aeed99ca2c
Merge branch 'clean_qt_headers' into 'master'
...
Clean up Qt includes
See merge request OpenMW/openmw!2027
3 years ago
Cody Glassman
66aa546e97
[Postprocessing] Small cleanup
3 years ago
psi29a
e40461a8e3
Merge branch 'niboundingvolume' into 'master'
...
Correct NiBoundingVolume loading (#6710 )
Closes #6710
See merge request OpenMW/openmw!2029
3 years ago
psi29a
2a789de8d3
Merge branch 'hacky-windows-unicode-fixes' into 'master'
...
Hacky windows unicode fixes
See merge request OpenMW/openmw!2024
3 years ago
AnyOldName3
c3d23b4948
Extra hack to make this build on Ubuntu with old CMake
3 years ago
elsid
e03e0db55d
Use std::string_view to access settings
...
There is no more need to copy std::string into a pair when need to call
std::map::find.
Remove unused resetPendingChange function.
3 years ago
Alexei Kotov
e6f7a2f1ef
Correct NiBoundingVolume loading
3 years ago
jvoisin
8b9ed57348
Clean up Qt includes
3 years ago
AnyOldName3
bdcac26d8c
Fix regressions from https://gitlab.com/OpenMW/openmw/-/merge_requests/1917
3 years ago
AnyOldName3
6a5ad4ca43
Fix regression from https://gitlab.com/OpenMW/openmw/-/merge_requests/1776
3 years ago
elsid
fdd84265b3
Use proper agent height and radius when render actor path
...
That are based on half extents used to find path over navmesh which is different
for interior and exterior cells.
Use common functions to get agent height and radius for actor path rendering and
navmesh generation.
3 years ago
uramer
1fb136a417
Correct icon and mesh paths in Lua records
3 years ago
psi29a
bb0dad7c08
Update to C++20 and see if our CI can handle it.
3 years ago
uramer
6d2dcaea50
Lua UI: Enable autoSize for single line text edit
3 years ago
psi29a
9c1970dce4
Merge branch 'lua_esm' into 'master'
...
Advanced Lua scripts configuration in omwaddon
See merge request OpenMW/openmw!1947
3 years ago
Alexei Kotov
dd758f8fd1
Always update the current matrix in KeyframeController
3 years ago
psi29a
d7641ce943
Merge branch 'keyframe' into 'master'
...
Encapsulate NIF transformations, round 2 (#6709 )
Closes #6709
See merge request OpenMW/openmw!1989
3 years ago
psi29a
ee89eccb06
Merge branch 'reload_l10n' into 'master'
...
Console command `reloadlua` also reloads l10n used by Lua scripts
See merge request OpenMW/openmw!1984
3 years ago
psi29a
f687827f98
Merge branch 'compile-times' into 'master'
...
Improve compile time a bit
See merge request OpenMW/openmw!1985
3 years ago
Alexei Kotov
21f6e2e419
Encapsulate NIF transformations, round 2 (task #6709 )
3 years ago
ζeh Matt
38b6927b31
Fix missing includes
3 years ago
ζeh Matt
e185d186bf
Move Log implementation to cpp, remove expensive mutex include in hpp
3 years ago
ζeh Matt
14bf9af056
Move implementation details of debugging.hpp to cpp, reduce includes
3 years ago
Petr Mikheev
1240b60a24
Console command `reloadlua` also reloads l10n used by Lua scripts
3 years ago
uramer
6c9c832927
Lua UI: Support autosized multiline text
3 years ago
ζeh Matt
d5ec959449
Create platform component for platform specific things
3 years ago
psi29a
5aeee0a520
Merge branch 'threading_gone_wrong' into 'master'
...
[Postprocessing] Fix race condition when techniques are dirtied
See merge request OpenMW/openmw!1979
3 years ago
psi29a
5725b5a29c
Merge branch 'close_lights' into 'master'
...
[Postprocessing] Pass sorted lights and ones with associated geometry
See merge request OpenMW/openmw!1976
3 years ago
Evil Eye
10e4eb8e8e
Append orphaned dialogue instead of always appending it
3 years ago
glassmancody.info
acc209c294
fix threading issue when dispatching frame dependent data
3 years ago
elsid
9c93de65be
Show groundcover loading progress
3 years ago
psi29a
c7449dc272
Merge branch 'bullet_includes' into 'master'
...
Clean up bullet includes
See merge request OpenMW/openmw!1974
3 years ago
glassmancody.info
8146b05c92
pass only lights with visible geometry
3 years ago
glassmancody.info
327b8ecdcb
pass sorted lights to light postprocess light buffers
3 years ago
Petr Mikheev
a70d5831c5
Lua scripts configuration in omwaddon
3 years ago
psi29a
58fd560ce9
Merge branch 'esm_readers_cache' into 'master'
...
Limit the number of simultaneously open not actively used content files (#6756 )
Closes #6756
See merge request OpenMW/openmw!1966
3 years ago
psi29a
70f0aae14d
Merge branch 'const_sRecordId' into 'master'
...
Make the sRedcordId constexpr
See merge request OpenMW/openmw!1973
3 years ago
psi29a
22ad2615e3
Merge branch 'mygui_includes' into 'master'
...
Clean up MyGUI includes
See merge request OpenMW/openmw!1972
3 years ago
jvoisin
72a6d1f69f
Clean up bullet includes
3 years ago
jvoisin
df0cd86cf4
Use the proper types
3 years ago
jvoisin
6c71071083
Make the sRedcordId constexpr
3 years ago
jvoisin
33c66e3d5e
Merge branch 'light_origin' into 'master'
...
Attach lights at origin when missing AttachLight node
Closes #6794
See merge request OpenMW/openmw!1970
3 years ago
Cody Glassman
ce49aa1202
Attach lights at origin when missing AttachLight node
3 years ago
Cody Glassman
bc0eed9843
[Postprocessing] Typos in docs and state attributes
3 years ago
jvoisin
0cc304e659
Clean up MyGUI includes
...
This should improve incremental compilation.
3 years ago
jvoisin
075ecc8558
Merge branch 'minor_simp_multidircoll' into 'master'
...
Minor simplification in multidircollection.cpp
See merge request OpenMW/openmw!1963
3 years ago
elsid
3affe9913f
Limit the number of simultaneously open not actively used content files
...
Use LRU cache for ESMReaders. When cache capacity is reached close least
recently used ESMReader. Remember the file name if a reader was open. Once the
reader requested again open the file if there is stored name for it. Put
released ESMReader to the back of the free items list. Close ESMReader's from
the front of the free items list.
Cached item can be used only by one client at the same time. If the same item is
requested twice exception is thrown. This should never happen in practice. If
this happens need to fix the client logic.
It's allowed to go over the capacity limit when requesting different readers.
Ideally this should never happen but there will be system error anyway
signalizing about too many open files. Need to fix client logic in this case.
All places that were using a vector of ESMReaders now using the cache. Cache is
local for each use case and there is no need for a thread safety.
3 years ago
jvoisin
a204f392c9
Minor simplification in multidircollection.cpp
3 years ago
Petr Mikheev
23f1d21e48
Make the behaviour of `omw.weatherTransition` in omwfx more reasonable
3 years ago
glassmancody.info
4dee9acd1e
fill bars to postprocess hud
3 years ago
Cody Glassman
447b586d7d
[Postprocessing] Fix a couple awkward issues with Lua API
3 years ago
AnyOldName3
e24a85419a
Merge branch 'master' into 'master'
...
When building Win32 (VS 2019), there are problems in line 45.
See merge request OpenMW/openmw!1953
3 years ago
jvoisin
4366ec11fc
Merge branch 'blank_is_bad' into 'master'
...
0 initialize mRecordFlags
Closes #6719
See merge request OpenMW/openmw!1949
3 years ago
psi29a
1712a8779c
Merge branch 'remove_moar_booooost' into 'master'
...
Remove boost:: constructs
See merge request OpenMW/openmw!1948
3 years ago
Evil Eye
bb495bffeb
0 initialize mRecordFlags
3 years ago
jvoisin
aeb3733e57
Remove boost:: constructs
...
Namely boost::scoped_array and boost::to_lower_copy.
3 years ago
psi29a
fc24ffcaab
Merge branch 'folllllllowup' into 'master'
...
Replace a `c_str()` with an `native()`
See merge request OpenMW/openmw!1938
3 years ago
Evil Eye
a95b6e050a
Replace new with make_unique in components
3 years ago
jvoisin
bd5ccaac3c
Followup to 21efb74b58
3 years ago
jvoisin
21efb74b58
Remove even most boost::
3 years ago
psi29a
d74ee0f3fe
Merge branch 'postprocess_hud' into 'master'
...
[Postprocessing] Improve HUD
See merge request OpenMW/openmw!1933
3 years ago
cody glassman
424b828ff8
add ability to use display names
3 years ago
cody glassman
11845e7d9b
improve layout of postprocessor hud
3 years ago
jvoisin
cb226e00f9
Remove some more of boost::
3 years ago
Petr Mikheev
29328867dc
Merge branch 'moar_noboost' into 'master'
...
Remove even more of boost::filesystem
See merge request OpenMW/openmw!1927
3 years ago
jvoisin
4e4debb1cb
Remove even more of boost::filesystem
3 years ago
psi29a
a14285bff5
Merge branch 'light_tweaks' into 'master'
...
[Postprocessing] Tweaks to light collection
See merge request OpenMW/openmw!1928
3 years ago
cody glassman
30a64ee82a
move to world space, fix bug with uniform size updates
3 years ago
jvoisin
6feb92a9bf
Remove boost::filesystem from a couple of files
3 years ago
psi29a
a737b05d84
Merge branch 'faster_toLower' into 'master'
...
Improve the speed of toLower
See merge request OpenMW/openmw!1889
3 years ago
glassmancody.info
a987b01717
don't resize user defined samplers to power of 2
3 years ago
jvoisin
998f1c960e
Improve the speed of toLower
...
This significantly improves the speed of my fuzzer,
by something like 15%.
3 years ago
Petr Mikheev
a4b23aad05
Validate l10n context name
3 years ago