Welcome, Guest.
Username: Password: Remember me

TOPIC: Desaturation for DoF

Desaturation for DoF 1 year 11 months ago #1

  • OtisInf
  • OtisInf's Avatar
  • Offline
  • Posts: 146
  • Thank you received: 67
(If this isn't the right forum, please move the thread, I hope I have posted it in the right forum. If not, I'm sorry!)

I ported the desaturation code I added to kingeric1992 ENB's DoF to the DoF shader in Reshade 1.0. (source topic enbseries.enbdev.com/forum/viewtopic.php?f=7&t=3224, and examples of what you can do with this: enbseries.enbdev.com/forum/viewtopic.php?f=7&t=3224&start=120 (this is skyrim, but you get the idea))

Add to McFx.cfg:
//>OtisInf Desaturation Settings<\\ 	// Requires call to PerformDES in used DOF. 
#define DOF_DES_Enabled 	1					// Enables the Desaturation effect in the DoF.
#define DOF_DES_BlendColor 	float3(0, 0, 1.0)	// -Specifies the blend color to blend with the greyscale. in (Red, Green, Blue).
#define DOF_DES_BlendFactor	0.0					// [0:1] // -Specifies the factor DOF_DES_BlendColor is blended. 1.0 is full, 0.0 is greyscale
#define DOF_DES_EffectFactor 1.0				// [0:1] // -Specifies the factor the Desaturation is applied. 0 is off (normal DoF), 1 is full greyscale (or color blending if that's enabled)

Add to DOF.h, e.g. above //RING DOF
// Otis/Infuse Project Desaturation effect for DoF. 
// colDF is the color to desaturate. Expects Z in Alpha. 
float4 PerformDES(float4 colDF)
{
#if DOF_DES_Enabled
	float greyscaleAverage = (colDF.x + colDF.y + colDF.z) / 3.0;
	float4 desColor = float4(greyscaleAverage, greyscaleAverage, greyscaleAverage, colDF.a);
	float3 blendColor = DOF_DES_BlendColor;
	desColor = lerp(desColor, float4(blendColor, colDF.a), DOF_DES_BlendFactor);
	colDF = lerp(colDF, desColor, saturate(colDF.a * DOF_DES_EffectFactor));
#endif
	return colDF;
}

To use, I've changed GetDOF's last line in:
	return PerformDES(colDF);
This requires currently that you use Ring DOF (setting 1). I am not a shader programmer (I write entity modeling systems/ORMs) so I am a bit out of my depth with respect to making this a generic pass in the DoF pipeline so all DOF types use it. Would anyone be so kind to point me in the right direction? Marty? Thanks :)

Result:


This is fairly simple. What you can do is e.g. blend a dark grey so you can effectively highlight the sharp area and make it more stand out. Anyway, enjoy!
The administrator has disabled public write access.
The following user(s) said Thank You: mindu

Desaturation for DoF 1 year 11 months ago #2

  • Marty McFly
  • Marty McFly's Avatar
  • Offline
  • We've tried nothing and we're all out of ideas!
  • Posts: 836
  • Thank you received: 881
Desaturation? DoF should blur out of focus areas and don't affect them otherwise. But as long as it is an optional custom effect, I'm fine with it. To make it work on all DoF's just do the same you just did on all the other returned variables of the DoF shaders. No need to take care in the #if statement which DoF is used currently because only the selected DoF variant is used anyways. I'm not at home right now but if GP DoF returns "res" just do PerformDES(res) at the end of the main blur shader.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #3

  • OtisInf
  • OtisInf's Avatar
  • Offline
  • Posts: 146
  • Thank you received: 67
Thanks for the info!

DoF is a camera lens effect, and indeed desaturation isn't one of the aspects of it. My initial idea behind it was to emphasize elements that are in focus en de-emphasize all elements which aren't, so I added it in the DoF shader as it there determines what is and what isn't in focus, so it's easier to make fragments less important: if they're not in the focus plane they're not important so they should be desaturated. I fully agree with you that it should probably be another effect entirely, but as I said earlier, I'm not a shader programmer so to add a new effect entirely is something I skipped for now (if I've read up on how to get an effect into the pipeline etc.) as I currently don't know how. ;)

I'll see if I can add a different effect entirely based on the DoF code (so no blurring, just desaturation).
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #4

  • Marty McFly
  • Marty McFly's Avatar
  • Offline
  • We've tried nothing and we're all out of ideas!
  • Posts: 836
  • Thank you received: 881
Reuse focussing of the DOF algorithm (which is utter shit by the way, I had the flu when I coded that, apparently I gone crazy) then you can apply your effect on all areas that would be usually blurred by DOF.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #5

  • OtisInf
  • OtisInf's Avatar
  • Offline
  • Posts: 146
  • Thank you received: 67
Heh, yeah that DoF code is ... special at places ;) I've re-used some of the code there, learned how to setup source/destination buffers and passes and have it working now as a separate effect, bound to a separate key. I have to fine-tune the ranges, I am currently using the full depth so saturation is very smooth but it saturates only in the very far depth now, while you'd want it to happen rather quickly, but that's minor.

Hopefully I'll get it working today otherwise in the next few days and will post back :)
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #6

  • Ganossa
  • Ganossa's Avatar
  • Offline
  • 최정장군
  • Posts: 790
  • Thank you received: 840
Please note that the upcoming version changes at least parts of the existing DoF code and even more if Marty's complete overhaul makes it into that version. :)

Dependent on how closely coupled your own code is, you might need to rework what you've written.
Last Edit: 1 year 11 months ago by Ganossa.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #7

  • OtisInf
  • OtisInf's Avatar
  • Offline
  • Posts: 146
  • Thank you received: 67
It's standalone now, using the depth code from the DoF, but I later discovered there's already a linearized depth buffer created in reshade.fx so I'll try to use that one instead as the one used in the current DoF appears to be partly broken. (switching off manual focus makes the DoF look weird in the witcher 3, with log depth buffer switched on)

I couldn't find docs (which were there in the past, but perhaps they're outdated now) how to organize your own code, e.g. whether you should define your own screenwide buffers and overlay passes as some effects seems to redefine those and others done (effectively re-using defines in other util.h files). Do you happen to have a link to those docs still around, if they still exist that is. I've now redefined all pass functions again, including screenwide buffers, but it seems overkill as other effects in the pipeline do the same... (but I might overlook something)
Last Edit: 1 year 11 months ago by OtisInf.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #8

  • OtisInf
  • OtisInf's Avatar
  • Offline
  • Posts: 146
  • Thank you received: 67
I have it working now, this is the effect in action: imgur.com/a/wqyCa

Will clean it up and upload it to github. I'll then try to add a port of kingeric1992's DoF from ENB to Reshade, because... why not ;)
The administrator has disabled public write access.
The following user(s) said Thank You: Ganossa

Desaturation for DoF 1 year 11 months ago #9

  • Ganossa
  • Ganossa's Avatar
  • Offline
  • 최정장군
  • Posts: 790
  • Thank you received: 840
I started writing a tutorial but especially with the mediator, a lot of the structure changed.
ReShade globals are in the ReShade.fx
Suite globals are in the util.h

If you have a new technique/shader file, you need an entry in the pipeline file and a new shader section in the suite settings file.
Shader name should be the file name (without *.h). Note here that the trigger USE_YOURSHADERNAME needs to be capitalized and that the shader name is entered in the first comment field //[shadername] so the mediator identify the link between pipeline entry and settings entry.

Other than that, its about following the plenty examples you have given with the existing shader :) -and feel free to ask questions once you have or let me look over your setup.

If the mediator can read your files and settings, plus pressing apply and therefore overwriting (+cleaning up) the files does not break anything, you are good to go. :)
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #10

  • OtisInf
  • OtisInf's Avatar
  • Offline
  • Posts: 146
  • Thank you received: 67
Thanks for the info. I think I have everything covered now. Effect is here: github.com/FransBouma/OtisFX

I haven't tried it with mediator, as I was editing things in the files inside the game folder prior to making it a repository, so using mediator would probably overwritten it by accident (or at least I probably would have) so I haven't tested it with that.

About mediator, while I have your ear: (;)) I have a few things which might improve it. I saw it's not OSS so I can't change it myself so here it goes:
- please alphabetize the tabs, they're now in random order it seems (which makes it harder to find tabs!). A better UI might be a tree on the left and the pane on the right the same as what you display now on the tab)
- the sliders to change values are really small and if you want to set a specific value you can't: make them move less fast when e.g. shift is clicked so you have more control, also e.g. make them reset when double clicked
- the offline preview is nice, but the picture can't be shown full screen. This is a bit of a problem if you e.g. want to finetune AA: the screenshot loaded to tweak AA is not displayed full screen so some smoothing is already taking place as the picture is slightly desampled.

(edit) apparently there's some vague issue, where when I activate my effect, it disables the DoF effect and vice versa. Typical case of re-using some flag somewhere, but I thought I named everything properly!
Last Edit: 1 year 11 months ago by OtisInf.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #11

  • OtisInf
  • OtisInf's Avatar
  • Offline
  • Posts: 146
  • Thank you received: 67
I see the problem I'm having is that I read from the original color buffer and the DoF does too. This thus makes one overwrite the results of the other depending which one is above/below in the pipeline. How do I initialize my texture buffer with the results of the current pipeline, i.e. from which texture sampler do I init? I currently use RFX_originalColor and that is of course not going to work.

Anyone who could shine a light on this? Thanks!
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #12

Read from backbuffer instead.
And you dont have to output coc coeff to buffer unless you wish to reuse the resource later.Plain function will work fine in this case.
also the fact that you can write to backbuffer itself while read, the des effect along can be recuced to a single pass effect.
Last Edit: 1 year 11 months ago by kingeric1992.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #13

  • OtisInf
  • OtisInf's Avatar
  • Offline
  • Posts: 146
  • Thank you received: 67
kingeric1992 wrote:
Read from backbuffer instead.
Doh! That fixes it indeed!
And you dont have to output coc coeff to buffer unless you wish to reuse the resource later.Plain function will work fine in this case.
also the fact that you can write to backbuffer itself while read, the des effect along can be recuced to a single pass effect.
aha! I already wondered why I had to create two buffers and couldn't write to the one I was reading to. Will fix that last bit tomorrow and will update the code in the repo. Thanks for the feedback!

(edit) all fixed, optimized. Code updated on github. What a strange feeling after 21 years of professional software dev to feel like a complete newbie again ;) Which is good, as it means there's a lot to learn ;)
Last Edit: 1 year 11 months ago by OtisInf.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #14

  • Marty McFly
  • Marty McFly's Avatar
  • Offline
  • We've tried nothing and we're all out of ideas!
  • Posts: 836
  • Thank you received: 881
Well you will be making great progress as you already have plenty of programming knowledge. Shader coding is different though, usual coding is mostly logic while this is mostly math. And usually you only clean code to make it, well, clean but in HLSL, performance matters.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #15

  • Ganossa
  • Ganossa's Avatar
  • Offline
  • 최정장군
  • Posts: 790
  • Thank you received: 840
please alphabetize the tabs, they're now in random order it seems (which makes it harder to find tabs!). A better UI might be a tree on the left and the pane on the right the same as what you display now on the tab)

I guess you mean the tabs in a suite. They could be ordered alphabetically or by some (random) logic but its a freedom of the developer to make that choice. The order of shader in the settings file defines their order in the mediator. Hence, if a suite manager/dev decides to have a alphabetical order, he changes the order in the settings file accordingly :)

About the tree, you noticed already that the tree is already spanned just currently with the tab design. Changing this design rather significantly is further down on the list but is indeed considered already.

the sliders to change values are really small and if you want to set a specific value you can't: make them move less fast when e.g. shift is clicked so you have more control, also e.g. make them reset when double clicked

Size is a compromise to consider usability and the amount of at once visible elements.
Not sure what you mean by speed. When using the mouse, it follows the pointer instantly, doubt that a delay or reduced mouse movement would make sense here ;)
Using arrow keys however is currently the method to transit to accurate slider movement once the curser is set in range of the desired value.
The double click reset for individual sliders is a good idea, will add it (remind me in case I forget :P)

the offline preview is nice, but the picture can't be shown full screen. This is a bit of a problem if you e.g. want to finetune AA: the screenshot loaded to tweak AA is not displayed full screen so some smoothing is already taking place as the picture is slightly desampled.

Its planned and I think it should not be a problem to be added. (fingers crossed)


On topic of the original vs backbuffer, since the Framework allows to reorder shader, a developer cannot be sure anymore about the input to its shader. To allow independence of previous effects, the initial backbuffer is stored and can be retrieved from RFX_original.
The DoF and AO source currently use the original buffer copy because it was historically meant to be the first shaders in the pipeline. It also needs to be changed in this case to RFX_backbuffer


A few comments to your uploaded code:
As Marty already said, it seems easy for you to get familiar with the setup fast. :)
Suites should be seen as broad domains. I would appreciate if you could add the shader to an existing domain for now (though I admit that some of them become crowded).
From what I see, the only thing that you need to adjust for the mediator to work is your defines in the settings file:
Only one space between key terms.
Adding ranges or [undef] for each variable.
Add the comment section //- that you can leave empty if you want.
In terms of naming conventions, a few variables should not be capitalised but I am actually not sure whether all our shader follow that already. ;)

Anyway, I am happy once again that it seems rather unproblematic to get into the structure :lol:
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #16

  • OtisInf
  • OtisInf's Avatar
  • Offline
  • Posts: 146
  • Thank you received: 67
Marty McFly wrote:
Well you will be making great progress as you already have plenty of programming knowledge. Shader coding is different though, usual coding is mostly logic while this is mostly math. And usually you only clean code to make it, well, clean but in HLSL, performance matters.
Yeah agreed, math is very important here and this small endeavor already reminded me of that, where you know what to accomplish, yet not how. Which is great though :) I'm no stranger to gfx coding though, I've spent 12years or so ('90-'02) in the demoscene, but that was before the shader era so my knowledge ends with the default OpenGL 2.0 API ;)

Re: clean vs. performance, you mean with clean code: code that uses constructs to make it more readable instead of corner-cutting code which will work too? Doesn't corner-cutting hacks make it less reliable to work on any game (as Reshade has to work on every game) ? Just curious.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #17

  • OtisInf
  • OtisInf's Avatar
  • Offline
  • Posts: 146
  • Thank you received: 67
(this is slightly off topic)
LuciferHawk wrote:
please alphabetize the tabs, they're now in random order it seems (which makes it harder to find tabs!). A better UI might be a tree on the left and the pane on the right the same as what you display now on the tab)

I guess you mean the tabs in a suite. They could be ordered alphabetically or by some (random) logic but its a freedom of the developer to make that choice. The order of shader in the settings file defines their order in the mediator. Hence, if a suite manager/dev decides to have a alphabetical order, he changes the order in the settings file accordingly :)
Ok, though I think it's currently harder to use: think about what the user will do with it. Take the SweetFX section for example: it has 3 rows of tabs. To find the one you're looking for you have to read all tab headers. The user doesn't care whether the SMAA is higher up in the cfg file or not, if the user would care for that, s/he would use the cfg file directly ;) as I think the mediator is meant to use reshade without fiddling with cfg files?
About the tree, you noticed already that the tree is already spanned just currently with the tab design. Changing this design rather significantly is further down on the list but is indeed considered already.
It shouldn't be ;). I decompiled Mediator with ILSpy and had a look (sorry!). Some advice: What might help is to define effect classes which contain the settings per effect (not hardcoded properties for a specific value, that's not flexible, but in e.g. setting class instances, where you store 'name', 'value', 'range start & stop' and 'description'), then store these per cfg file in a datastructure (e.g. one which represents the file). Then use controls to visualize that datastructure: be it a tabstrip or a tree would make no difference. You're currently parsing the .cfg files and converting what you're seeing directly into UI controls. It's in general better to split that up, as you then have more freedom.

You don't have to spend much time to convert this though: create a cfg parser class, move the parsing logic to that, create Effect class instances with the values you read, and then interpret the effect classes and cfg data you read and create UI elements. Will be much less code and more robust too :) I currently see the UI keel over when I place OtisFX.cfg in the list of cfg files it has to read as it runs into a problem and ends parsing everything. That's of course due to me not doing things properly, but a user can mess with the cfg files too.
the sliders to change values are really small and if you want to set a specific value you can't: make them move less fast when e.g. shift is clicked so you have more control, also e.g. make them reset when double clicked
Size is a compromise to consider usability and the amount of at once visible elements.
If you go to sweetfx->Lumasharpen. I have plenty of space, yet the sliders are small. That's what I meant. :) It's not easy to get this right though!
Not sure what you mean by speed. When using the mouse, it follows the pointer instantly, doubt that a delay or reduced mouse movement would make sense here ;)
Using arrow keys however is currently the method to transit to accurate slider movement once the curser is set in range of the desired value.
Heh no I meant moving the slider with the mouse with often make the value jump quickly. E.g. if you start at value 0.63, and you want it to be 0.6, but moving the slider with the mouse makes it jump to 0.59 or 0.62. Didn't think about cursorkeys, that indeed makes it easier. I ran into this when copying some values over from a preset compatible with older reshade versions and I wasn't familiar with the reshade files yet.
the offline preview is nice, but the picture can't be shown full screen. This is a bit of a problem if you e.g. want to finetune AA: the screenshot loaded to tweak AA is not displayed full screen so some smoothing is already taking place as the picture is slightly desampled.

Its planned and I think it should not be a problem to be added. (fingers crossed)
Nice!
On topic of the original vs backbuffer, since the Framework allows to reorder shader, a developer cannot be sure anymore about the input to its shader. To allow independence of previous effects, the initial backbuffer is stored and can be retrieved from RFX_original.
The DoF and AO source currently use the original buffer copy because it was historically meant to be the first shaders in the pipeline. It also needs to be changed in this case to RFX_backbuffer
Thanks for the info!
A few comments to your uploaded code:
Suites should be seen as broad domains. I would appreciate if you could add the shader to an existing domain for now (though I admit that some of them become crowded).
As the current sets of shaders are not on e.g. bitbucket or github I can't merge them into any. I've kept them in my own file so people who want to use them can download them separately. If you want to include them, merge them wherever you want.
From what I see, the only thing that you need to adjust for the mediator to work is your defines in the settings file:
Only one space between key terms.
you mean: #define name[...here...]value ?
You could parse these lines in 1 go with a regex using groups. This way you can scan away whitespace and don't have to worry about a space or strict //- instead of // -. Syntax is, I presume:
#define WhiteSpace Name WhiteSpace Value WhiteSpace // WhiteSpace [StartValue:EndValue] WhiteSpace // WhiteSpace description EOL
Everything after 'Value' is optional, which you can specify in the regex. When you then match the line with the regex, the .NET regex parser will fill in the groups you've defined, e.g. Name or Value or Description. If an optional group isn't in the line, it's empty. Here's an example I use to parse the individual name parts in a sql server stored procedure name:
private static readonly Regex _procMatchingMatcher = new Regex(@"((?<catalogName>\[[\w\. \$@#]+\]|\w+(?=\.)).)?(?<schemaName>\[[\w\. \$@#]+\]|\w+).(?<procName>\[[\w\. \$@#]+\])", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
This one can deal with db.bla.name, but also with bla.name, or with [db].[bla].[name], it places the names it does match in the group names for easy retrieval. Constructing regex's is like dropping stones on your feet all day but once you get it right, it's very easy and essential for parsing texts. Would help your code a great deal I think as it would make it more robust.
Adding ranges or [undef] for each variable.
Add the comment section //- that you can leave empty if you want.
In terms of naming conventions, a few variables should not be capitalised but I am actually not sure whether all our shader follow that already. ;)
noted :) Ah, I think you're referring to the texture buffers I prefixed with OFX?
Anyway, I am happy once again that it seems rather unproblematic to get into the structure :lol:
Yeah it was straight forward, once I got the link between sampler and texture buffer and pass and technique. The cfg files and where things are found is easy. One thing I didn't get is that I didn't define an undef file but the parser found that OK. ;)

Thanks for the help all! and if you need .net help, let me know. :)
Last Edit: 1 year 11 months ago by OtisInf.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #18

  • Ganossa
  • Ganossa's Avatar
  • Offline
  • 최정장군
  • Posts: 790
  • Thank you received: 840
Ok, though I think it's currently harder to use

Its still up to the dev (not the user or mediator) how the ordering looks like. The mediator not forcing it does not mean its not possible, its just done on a different level by a different entity.

You're currently parsing the .cfg files and converting what you're seeing directly into UI controls. It's in general better to split that up, as you then have more freedom.

To explain why it is implemented that way (which is actually also explained together with the separate data structure solution here reshade.me/forum/general-discussion/1241...cisions?start=6#9314 //so no need to crack my code ;) )
I used a similar design before which got decent feedback. Therefore, I was confident with the design which allowed me to skip the separated data structure and its redundant storage. Other than that it is behaving pretty much the same as if there was one, only swapping to another design (which I was not intending at the beginning) is the downside of that choice.
For reading, writing and similar functionalities, I use it as any other tree structure just that with only one direct read and write target I avoid the additional layer of possible errors. Anyhow, I would also choose a separate data structure next time just for that extra bit of flexibility :)
I ran into this when copying some values over from a preset compatible with older reshade versions and I wasn't familiar with the reshade files yet.

I created a tool a few pages down the presentation section that will help you port setting properly from any kind of reshade configuration file. ;)

Constructing regex's is like dropping stones on your feet all day but once you get it right, it's very easy and essential for parsing texts

Thanks for the advice and I am actually very well familiar with regex (including its advantages and disadvantages) which I used in the above mentioned and other tools excessively :) (not saying I am good at it)
However, its not essential for the mediator because the configuration files are machine written by the mediator itself with a strict layout. Only the initial setup has to be correct to follow that layout which I expect to be done by an actual dev.
This also answers your question about the .undef files. They are created by the mediator itself. Without those, an important part for our "namespaces" would be missing and we would get problems with an increasing number of shader.

Hope I did not miss any other question :)

(by the way, you are very likely not the only person cracking code but in the end its considered a criminal act [some people would ask instead :P ] which you have to be okay with yourself, thought I assume your good intentions in this case so nevermind, plus nothing I can do about it at this point ;) )
Last Edit: 1 year 11 months ago by Ganossa.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #19

  • OtisInf
  • OtisInf's Avatar
  • Offline
  • Posts: 146
  • Thank you received: 67
Re: 'cracking' code, it's decompiling, or better: reverse engineering, and it is actually not illegal, see Compaq vs. IBM regarding the IBM bios. Anyway, in .NET land people use reflector and similar tools all the time, to see why some function doesn't do what it should. If you want to prevent it, you can use an obfuscator ( I think vs.net still ships with one, not sure, haven't used one in years) which makes IL reverse engineering tools like reflector crash and at least give the reader of the decompiled code a very hard time due to the code reshuffling etc.

I peeked into your code simply to see whether it could be fixed (for myself) or at least give you feedback where what might be changed. I didn't peek into your code to learn how to write tools like mediator (if I don't know how to do that by now I should quit my dayjob! ;)), nor am I planning to write a similar tool, as I simply don't have the time and you already did a lot of work. So I thought: if I could nudge you in the right direction it would be a better alternative ;). E.g. if your code would have been on github, I'd have simply created a pull request with changes for you.
Therefore, I was confident with the design which allowed me to skip the separated data structure and its redundant storage. Other than that it is behaving pretty much the same as if there was one, only swapping to another design (which I was not intending at the beginning) is the downside of that choice.
Well, let's just say that code which has nothing to do with UI is now tied strongly to your UI structure (as in: it's written inside the UI even), which in general has a lot of downsides, especially when something changes on either end (and that is 100% going to happen). It would be a shame if you have to do a lot of work if that could have been avoided ;)

Thanks for the info!
Last Edit: 1 year 11 months ago by OtisInf.
The administrator has disabled public write access.

Desaturation for DoF 1 year 11 months ago #20

  • Ganossa
  • Ganossa's Avatar
  • Offline
  • 최정장군
  • Posts: 790
  • Thank you received: 840
No problem :)

Now please bear with me ;)
On topic of what is illegal and what is not.
“The fact that people are doing it does not mean it is legal, and the fact that it is legal does not mean it is morally right or good.”

Opening up not disclosed source -and you might call it what you want- is a "criminal" (in the sense of a natural law) act in itself, though I already said I knew your good intentions. “At a certain level of learning and understanding, right or wrong ain't the issue, but different interest.”

I do not say it will be punished in any way by any organisation or institution. “When you have the right, doesn't mean that you are right.”

That is why I added you have to deal with that yourself and some might also be concerned about karma. “So far, about morals, I know only that what is moral is what you feel good after and what is immoral is what you feel bad after.”

Breaking into my house because you want to clean up after me, does it justify that act? “More evil gets done in the name of righteousness than any other way.”

Many other people breaking into my house, does it justify that act? “Right is right even if no one is doing it; wrong is wrong even if everyone is doing it.”

Getting into my house because the door is open, does it justify the act? “When you think you're right, you're most likely wrong.”

You can ask me if you can come over.
You can come over once I invite you.
“What is right is often forgotten by what is convenient.”

Its simply knowing wrong from right. (and you apologized right after you revealed it which means you felt/knew it being wrong) “... what you think is right isn't the same as knowing what is right.”
Last Edit: 1 year 11 months ago by Ganossa.
The administrator has disabled public write access.
  • Page:
  • 1
  • 2