[MOD] Real Grass 2

A curated forum for compatible and maintained mods. Users are unable to create new topics in this forum but can reply to existing topics. Please message a moderator to have your mod moved into this forum area.
ifkopifko
Posts: 195
Joined: Thu Apr 02, 2015 9:03 am

Re: [MOD] Real Grass 2

Post by ifkopifko »

Hey there. I've a little graphical bug to report.

The grass generated by this mod seems to render some unintended slim vertical lines. I only noticed it when "realistic grass" is turned on, does not matter whether "shader" or "billboard" version is used... probably something with the used textures in this mod. I'll attach some screenshots.
The lines are really thin, and are almost invisible when playing in FullHD. They become very annoying when retro rendering mode is enabled (or simply using low resolutions) because of aliasing.
Attachments
Grass bug report.jpg
Grass bug report.jpg (230.8 KiB) Viewed 3454 times

User avatar
Teralitha
Posts: 359
Joined: Wed Jul 17, 2019 3:44 pm

Re: [MOD] Real Grass 2

Post by Teralitha »

My player.log file
Attachments
PlayerLog.zip
(13.94 KiB) Downloaded 148 times

User avatar
TheLacus
Posts: 1305
Joined: Wed Sep 14, 2016 6:22 pm

Re: [MOD] Real Grass 2

Post by TheLacus »

haloterm wrote: Sat Oct 03, 2020 12:21 pm I played around with grass distance using console commands and noticed I can easily go up to a distance of 1000 without major performance issues. Since I use distant terrain, this improves the look in the distance incredibly. But I have to set this each time I load a save. I tried to modify the json settings file of the mod directly, but the mod ignores this and stays at 300.

Would it be possible to allow such high values to set in the mod options in the next version, instead of the current maximum of 300?
ifkopifko wrote: Sun Dec 20, 2020 1:04 pm Hey there. I've a little graphical bug to report.

The grass generated by this mod seems to render some unintended slim vertical lines. I only noticed it when "realistic grass" is turned on, does not matter whether "shader" or "billboard" version is used... probably something with the used textures in this mod. I'll attach some screenshots.
The lines are really thin, and are almost invisible when playing in FullHD. They become very annoying when retro rendering mode is enabled (or simply using low resolutions) because of aliasing.
Hi, I uploaded a new version that should address these requests and issues. :)

User avatar
TheLacus
Posts: 1305
Joined: Wed Sep 14, 2016 6:22 pm

Re: [MOD] Real Grass 2

Post by TheLacus »

Teralitha wrote: Sat Apr 17, 2021 2:58 am My player.log file
Hi, thank you for log file. The crash happens when Distant Terrain is instantiating terrains as part of transition ring (quoting relevant part of log for future reference).

Code: Select all

0x250AE994 (Mono JIT Code) (wrapper managed-to-native) UnityEngine.TerrainData:set_detailPrototypes (UnityEngine.TerrainData,UnityEngine.DetailPrototype[])
0x250A71A0 (Mono JIT Code) RealGrass.RealGrass:AddTerrainDetails (DaggerfallWorkshop.DaggerfallTerrain,UnityEngine.TerrainData)
0x250A6F80 (Mono JIT Code) RealGrass.RealGrass:DaggerfallTerrain_OnPromoteTerrainData (DaggerfallWorkshop.DaggerfallTerrain,UnityEngine.TerrainData)
0x250A5B80 (Mono JIT Code) (wrapper delegate-invoke) <Module>:invoke_void_DaggerfallTerrain_TerrainData (DaggerfallWorkshop.DaggerfallTerrain,UnityEngine.TerrainData)
0x250A5AB5 (Mono JIT Code) DaggerfallWorkshop.DaggerfallTerrain:RaiseOnPromoteTerrainDataEvent (UnityEngine.TerrainData)
0x250A5997 (Mono JIT Code) DaggerfallWorkshop.DaggerfallTerrain:PromoteTerrainData ()
0x2541B4E8 (Mono JIT Code) DistantTerrain.DistantTerrain:UpdateTerrainDataTransitionRing (DistantTerrain.DistantTerrain/TransitionTerrainDesc)
0x2541B1E0 (Mono JIT Code) DistantTerrain.DistantTerrain:PlaceTerrainOfTransitionRing (int)
0x2541AC8C (Mono JIT Code) DistantTerrain.DistantTerrain/<UpdateTerrainsTransitionRing>c__Iterator0:MoveNext ()
0x22A61430 (Mono JIT Code) UnityEngine.SetupCoroutine:InvokeMoveNext (System.Collections.IEnumerator,intptr)
I can't replicate this crash and i don't believe is a compatibility issue, more likely an out of memory issue caused by combination of mods. I can't suggest anything other than to reduce memory usage (i.e. reduce terrain distance and/or disable flowers/plants/stones).

However this doesn't explain why you don't see any grass at all when only this mod is enabled. If you would like to investigate a bit more i can give you a save made in an in-game season where grass is surely present.
Attachments
SAVE416.zip
(235.5 KiB) Downloaded 142 times

User avatar
Teralitha
Posts: 359
Joined: Wed Jul 17, 2019 3:44 pm

Re: [MOD] Real Grass 2

Post by Teralitha »

I had disabled distant terrain and the dream textures, while lowering various real grass settings and I got it to work without crashing. Not sure if its worth it though. I also looked in that log and I saw some messages saying something about how a shader was incompatible with my gpu or something.

User avatar
Daniel87
Posts: 391
Joined: Thu Nov 28, 2019 6:25 pm

Re: [MOD] Real Grass 2

Post by Daniel87 »

Hey TheLacus,

I used you mod in conjunction with my own and it looks pretty damn amazing! Your mod perfectly compensates for the shortcomings of mine. It looks almost as if they are made for each other <3.

One problem remains nevertheless:

I have a different tile texture layout for MapPixels without Locations. This allowes me to swap the Texture2DArray for these MapPixels (which should make up the majority of the game world) and replace it with a Texture Set that doesnt have the "only in location" textures, allowing me to add additional transitions between stone, dirt and grass.

But whenever this is the case, it is quite random if the grass of your mod is actually spawned on textures that are actually not grass:
Image
Image

Since now the texture order is different than from the original, see picture below.
Left: Original Textures, Right: My own Texture Set.
Image

Would you be willing to write a quick fix in the future, once my mod is released?

Secondary problem resulting from the first problem is:
If the MapPixel features a location, the original textures are used.
This means your mod, when running with mine, would have to actively check if the MapPixel has a location and choose either the original DFU grass layout or the one for my mod, depending on the MapPixel that is loaded. something along the lines of

if (dfTerrain.MapData.hasLocation && WOModEnabled) {
// adjusted Real Grass 2 grass layout
} else {
// original Real Grass 2 grass layout
}
In Julianos we Trust.

User avatar
King of Worms
Posts: 4752
Joined: Mon Oct 17, 2016 11:18 pm
Location: Scourg Barrow (CZ)
Contact:

Re: [MOD] Real Grass 2

Post by King of Worms »

I kind of like some patches of the grass even on the rocky surface. Maybe just reduce the grass amount there to 50% or even less compared to grass surface. Just a impression based on that image. It might be a bad idea ofc

User avatar
TheLacus
Posts: 1305
Joined: Wed Sep 14, 2016 6:22 pm

Re: [MOD] Real Grass 2

Post by TheLacus »

Daniel87 wrote: Sat May 01, 2021 2:57 pm Hey TheLacus,

I used you mod in conjunction with my own and it looks pretty damn amazing! Your mod perfectly compensates for the shortcomings of mine. It looks almost as if they are made for each other <3.

One problem remains nevertheless:

I have a different tile texture layout for MapPixels without Locations. This allowes me to swap the Texture2DArray for these MapPixels (which should make up the majority of the game world) and replace it with a Texture Set that doesnt have the "only in location" textures, allowing me to add additional transitions between stone, dirt and grass.

But whenever this is the case, it is quite random if the grass of your mod is actually spawned on textures that are actually not grass:
Hi, I would be happy to make this mod compatible :)

I'll need more informations about additional transitions that include grass. This mod defines grass layout for all tiles as shown in the tilemap atlas. Is it only a matter of mapping different tile indexes (for example i see that that tile 10 in your mod corresponds to tile 15 of classic game), or does your mod also have additional layouts not shown in the picture that should receive grass? Can you make an example of how grass should be positioned on those additional transitions?

User avatar
Daniel87
Posts: 391
Joined: Thu Nov 28, 2019 6:25 pm

Re: [MOD] Real Grass 2

Post by Daniel87 »

TheLacus wrote: Sat May 01, 2021 11:31 pm
Daniel87 wrote: Sat May 01, 2021 2:57 pm Hey TheLacus,

I used you mod in conjunction with my own and it looks pretty damn amazing! Your mod perfectly compensates for the shortcomings of mine. It looks almost as if they are made for each other <3.

One problem remains nevertheless:

I have a different tile texture layout for MapPixels without Locations. This allowes me to swap the Texture2DArray for these MapPixels (which should make up the majority of the game world) and replace it with a Texture Set that doesnt have the "only in location" textures, allowing me to add additional transitions between stone, dirt and grass.

But whenever this is the case, it is quite random if the grass of your mod is actually spawned on textures that are actually not grass:
Hi, I would be happy to make this mod compatible :)

I'll need more informations about additional transitions that include grass. This mod defines grass layout for all tiles as shown in the tilemap atlas. Is it only a matter of mapping different tile indexes (for example i see that that tile 10 in your mod corresponds to tile 15 of classic game), or does your mod also have additional layouts not shown in the picture that should receive grass? Can you make an example of how grass should be positioned on those additional transitions?
Hy!

I use 80% of the original atlas, but I removed many of its textures, since they are only used in location blocks.
I utilize the two rotation and flip Bits the same way as in the original atlas. The tiles I added are only mirrored versions of original tiles as well as some corner tiles. Mostly its only a matter of different tile indexes, but for 2-4 tiles, you might have to place the grass in a different corner of the tile.

Let me send you my custom lookup table for further clarification:

Code: Select all

static protected TileObject[] tileTable = {
            // Water - Dirt
            new TileObject(MakeLookup(0, false, false),  0,0,0,0),

            new TileObject(MakeLookup(4, true, false),   1,0,0,0),
            new TileObject(MakeLookup(4, false, true),   0,1,0,0),
            new TileObject(MakeLookup(4, true, true),    0,0,1,0),
            new TileObject(MakeLookup(4, false, false),  0,0,0,1),

            new TileObject(MakeLookup(5, true, false),   1,1,0,0),
            new TileObject(MakeLookup(5, false, true),   0,1,1,0),
            new TileObject(MakeLookup(5, true, true),    0,0,1,1),
            new TileObject(MakeLookup(5, false, false),  1,0,0,1),

            new TileObject(MakeLookup(6, false, true),   1,1,1,0),
            new TileObject(MakeLookup(6, true, true),    0,1,1,1),
            new TileObject(MakeLookup(6, false, false),  1,0,1,1),
            new TileObject(MakeLookup(6, true, false),   1,1,0,1),

            new TileObject(MakeLookup(21, false, false), 0,1,0,1),
            new TileObject(MakeLookup(21, true, false),  1,0,1,0),

            new TileObject(MakeLookup(1, false, false),  1,1,1,1),

            // Dirt - Grass
            new TileObject(MakeLookup(7, true, false),   2,1,1,1),
            new TileObject(MakeLookup(7, false, true),   1,2,1,1),
            new TileObject(MakeLookup(7, true, true),    1,1,2,1),
            new TileObject(MakeLookup(7, false, false),  1,1,1,2),

            new TileObject(MakeLookup(8, true, false),   2,2,1,1),
            new TileObject(MakeLookup(8, false, true),   1,2,2,1),
            new TileObject(MakeLookup(8, true, true),    1,1,2,2),
            new TileObject(MakeLookup(8, false, false),  2,1,1,2),

            new TileObject(MakeLookup(9, false, true),   2,2,2,1),
            new TileObject(MakeLookup(9, true, true),    1,2,2,2),
            new TileObject(MakeLookup(9, false, false),  2,1,2,2),
            new TileObject(MakeLookup(9, true, false),   2,2,1,2),

            new TileObject(MakeLookup(22, true, false),  2,1,2,1),
            new TileObject(MakeLookup(22, false, false), 1,2,1,2),

            new TileObject(MakeLookup(2, false, false),  2,2,2,2),

            // Grass - Stone
            new TileObject(MakeLookup(10, true, false),  3,2,2,2),
            new TileObject(MakeLookup(10, false, true),  2,3,2,2),
            new TileObject(MakeLookup(10, true, true),   2,2,3,2),
            new TileObject(MakeLookup(10, false, false), 2,2,2,3),

            new TileObject(MakeLookup(11, true, false),  3,3,2,2),
            new TileObject(MakeLookup(11, false, true),  2,3,3,2),
            new TileObject(MakeLookup(11, true, true),   2,2,3,3),
            new TileObject(MakeLookup(11, false, false), 3,2,2,3),

            new TileObject(MakeLookup(12, false, true),  3,3,3,2),
            new TileObject(MakeLookup(12, true, true),   2,3,3,3),
            new TileObject(MakeLookup(12, false, false), 3,2,3,3),
            new TileObject(MakeLookup(12, true, false),  3,3,2,3),

            new TileObject(MakeLookup(24, true, false),  3,2,3,2),
            new TileObject(MakeLookup(24, false, false), 2,3,2,3),

            new TileObject(MakeLookup(3, false, false),  3,3,3,3),

            // Dirt - Stone
            new TileObject(MakeLookup(13, true, false),  3,1,1,1),
            new TileObject(MakeLookup(13, false, true),  1,3,1,1),
            new TileObject(MakeLookup(13, true, true),   1,1,3,1),
            new TileObject(MakeLookup(13, false, false), 1,1,1,3),

            new TileObject(MakeLookup(14, true, false),  3,3,1,1),
            new TileObject(MakeLookup(14, false, true),  1,3,3,1),
            new TileObject(MakeLookup(14, true, true),   1,1,3,3),
            new TileObject(MakeLookup(14, false, false), 3,1,1,3),

            new TileObject(MakeLookup(15, false, true),  3,3,3,1),
            new TileObject(MakeLookup(15, true, true),   1,3,3,3),
            new TileObject(MakeLookup(15, false, false), 3,1,3,3),
            new TileObject(MakeLookup(15, true, false),  3,3,1,3),

            new TileObject(MakeLookup(23, true, false),  3,1,3,1),
            new TileObject(MakeLookup(23, false, false), 1,3,1,3),

            //Dirt - Grass - Stone
            new TileObject(MakeLookup(16, true, false),  1,1,2,3),
            new TileObject(MakeLookup(16, false, true),  3,1,1,2),
            new TileObject(MakeLookup(16, true, true),   2,3,1,1),
            new TileObject(MakeLookup(16, false, false), 1,2,3,1),

            new TileObject(MakeLookup(27, true, false),  1,1,3,2),
            new TileObject(MakeLookup(27, false, true),  2,1,1,3),
            new TileObject(MakeLookup(27, true, true),   3,2,1,1),
            new TileObject(MakeLookup(27, false, false), 1,3,2,1),

            new TileObject(MakeLookup(17, true, false),  2,2,1,3),
            new TileObject(MakeLookup(17, false, true),  3,2,2,1),
            new TileObject(MakeLookup(17, true, true),   1,3,2,2),
            new TileObject(MakeLookup(17, false, false), 2,1,3,2),

            new TileObject(MakeLookup(28, true, false),  2,2,3,1),
            new TileObject(MakeLookup(28, false, true),  1,2,2,3),
            new TileObject(MakeLookup(28, true, true),   3,1,2,2),
            new TileObject(MakeLookup(28, false, false), 2,3,1,2),

            new TileObject(MakeLookup(18, true, false),  3,3,1,2),
            new TileObject(MakeLookup(18, false, true),  2,3,3,1),
            new TileObject(MakeLookup(18, true, true),   1,2,3,3),
            new TileObject(MakeLookup(18, false, false), 3,1,2,3),

            new TileObject(MakeLookup(29, true, false),  3,3,2,1),
            new TileObject(MakeLookup(29, false, true),  1,3,3,2),
            new TileObject(MakeLookup(29, true, true),   2,1,3,3),
            new TileObject(MakeLookup(29, false, false), 3,2,1,3),

            //Dirt - Stone & Grass
            new TileObject(MakeLookup(30, true, false),  3,1,2,1),
            new TileObject(MakeLookup(30, false, true),  1,3,1,2),
            new TileObject(MakeLookup(30, true, true),   2,1,3,1),
            new TileObject(MakeLookup(30, false, false), 1,2,1,3),

            //Dirt - Water & Grass
            new TileObject(MakeLookup(31, true, false),  2,1,0,1),
            new TileObject(MakeLookup(31, false, true),  1,2,1,0),
            new TileObject(MakeLookup(31, true, true),   0,1,2,1),
            new TileObject(MakeLookup(31, false, false), 1,0,1,2),

            //Dirt - Water & Stone
            new TileObject(MakeLookup(32, true, false),  3,1,0,1),
            new TileObject(MakeLookup(32, false, true),  1,3,1,0),
            new TileObject(MakeLookup(32, true, true),   0,1,3,1),
            new TileObject(MakeLookup(32, false, false), 1,0,1,3),

            //Grass - Dirt & Stone
            new TileObject(MakeLookup(33, true, false),  3,2,1,2),
            new TileObject(MakeLookup(33, false, true),  2,3,2,1),
            new TileObject(MakeLookup(33, true, true),   1,2,3,2),
            new TileObject(MakeLookup(33, false, false), 2,1,2,3),

            //Stone - Dirt & Grass
            new TileObject(MakeLookup(34, true, false),  2,3,1,3),
            new TileObject(MakeLookup(34, false, true),  3,2,3,1),
            new TileObject(MakeLookup(34, true, true),   1,3,2,3),
            new TileObject(MakeLookup(34, false, false), 3,1,3,2),

            //Road - Dirt & Grass
            new TileObject(MakeLookup(19, false, false), 19,19,19,19),

            new TileObject(MakeLookup(20, true, false),  1,20,19,20),
            new TileObject(MakeLookup(20, false, true),  20,1,20,19),
            new TileObject(MakeLookup(20, true, true),   19,20,1,20),
            new TileObject(MakeLookup(20, false, false), 20,19,20,1),

            new TileObject(MakeLookup(26, true, false),  2,26,19,26),
            new TileObject(MakeLookup(26, false, true),  26,2,26,19),
            new TileObject(MakeLookup(26, true, true),   19,26,2,26),
            new TileObject(MakeLookup(26, false, false), 26,19,26,2)
        };
MakeLookup function:

Code: Select all

static byte MakeLookup(int index, bool rotate, bool flip)
        {
            if (index > 255)
                throw new IndexOutOfRangeException("Index out of range. Valid range 0-255");
            if (rotate) index += 64;
            if (flip) index += 128;

            return (byte)index;
        }
A TileObject is just a container class holding

1. the tile (byte)
2. bottom left corner (int)
3. bottom right corner (int)
4. top right corner (int)
5. top left corner (int).

Code: Select all

public class TileObject {
        public byte Tile;
        public int Bl, Br, Tr, Tl;

        public TileObject(byte tile, int bl, int br, int tr, int tl) {
            Tile = tile;
            Bl = bl;
            Br = br;
            Tr = tr;
            Tl = tl;
        }
    }
Hope this helps. if you have any questions, feel free to drop me a message anytime
In Julianos we Trust.

User avatar
Daniel87
Posts: 391
Joined: Thu Nov 28, 2019 6:25 pm

Re: [MOD] Real Grass 2

Post by Daniel87 »

Hi TheLacus,

I completely changed my system of texturing landscapes. I stick to the original TextureAtlas and just appended it by some more textures, so our mods are now perfectly compatible.

But while testing, I came across a minor incompatibility between your mod and Basic Roads:

Image

Is this anything that can be fixed?
In Julianos we Trust.

Post Reply