PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [DynRPG Plugin]Blending Mode



Kazesui
19.08.2012, 00:07
Und schon wieder gibt es einem neuen Plugin!
Diesmal gibts Additives und Subtraktives Blending für euer Bilder.
Dies wird gemacht indem ihr .add, .sub, .mul oder .ml2 vor das .png in euer bilder dateinamen hintun.

Hier ein paar beispiele:

Kein Blending und 50% Transparenz (zum vergleichen)
http://rpgmaker.net/media/content/users/3355/locker/Blend_Normal.png

Additive Blend Mode
http://rpgmaker.net/media/content/users/3355/locker/Blend_Additive.png

Subtraktives Blend Mode (+ ein kleines Additives Gespenst )
http://rpgmaker.net/media/content/users/3355/locker/Blend_Subtractive.png

Multiplicative Blend mode
http://rpgmaker.net/media/content/users/3355/locker/Blend_Multiplicative.png

2x Multiplicative Blend mode
http://rpgmaker.net/media/content/users/3355/locker/Blend_Multiplicative2.png

Wichtig zu beachten ist das wenn ihr ein Blend Mode zum Bild tun, wird es nicht mehr möglich sein für diese bilder das zooming, rotation, wavern oder die farben zu manipulieren wie bei normalen Bilder. Gilt allerdings auch nur für die Bilder die ein .add , .sub, .mul oder .ml2 vor das .png haben.
Und hier noch dem Download mit einem kleines beispiel's Projekt:
Download (http://rpgmaker.net/engines/rt2k3/utilities/11/)

Danke noch an Kyuu fürs hilfe dabei.
Hab ich bestimmt auch zu wenig gesagt, aber auch viel Dank an Cherry für das SDK.

MagicMaker
19.08.2012, 00:39
Ich bin entzückt!

Wenns doch nur RPG2000-kompatibulös wäre. =/

Nundenn, ein Schritt ist es schonmal. ^-^


Wichtig zu beachten ist das wenn ihr ein Bild zum Additives oder Subtraktives Bild tun, wird es nicht mehr möglich sein für diese bilder das Transparenz, das zooming, rotation, wavern oder die farben zu manipulieren wie bei normalen Bilder. Gilt allerdings auch nur für die Bilder die ein .add oder .sub vor das .png haben.
Ändert sich das noch irgendwann oder wird das so bleiben?

Kazesui
19.08.2012, 00:41
Transparenz wird eventuell noch dazu kommen, der rest wird wahrscheinlich so bleiben

Kyuu
19.08.2012, 00:49
[...] der rest wird wahrscheinlich so bleiben

Aus welchem Grund?

MagicMaker
19.08.2012, 01:54
~Bug??~
Das Blending zeigt keine Wirkung mehr, sobald erneut ein Bild auf der gleichen ID wie zuvor geladen wurde.

Dazwischen zu löschen ist eine Möglichkeit, es wieder zu aktivieren. Das würde allerdings zu Flackern führen.
Wie es scheint, darf vorher gar nichts da sein. °-°'

Rosa Canina
19.08.2012, 09:56
Wow, das ist einfach nur affemmegasuperduperkalifragilistigexpialigetisch im Quadrat :D

Schade, dass ich mein AVoR nicht weiter patchen kann (ich kann die 1,08 da net verwenden :/), sonst würde ich heute das gesamte Spiel dafür überarbeiten.
Naja, man kann nicht alles haben... aber eines schwöre ich heute, jetzt und hier... sollte ich wirklich micht irgendwann einmal an "Tantorlan" setzen (und nein,
das ist nicht einmal ein geheimes Tech-Projekt... dafür existiert eigentlich nur die Ideen... seit Jahrzehnten schon bald XD), dann ist dieses PLUGIN mit
Sicherheit das, was ich als erstes aufspielen werde.

Super Arbeit, meine Wenigkeit zieht seinen imaginären Hut vor dir und ist gespannt, was Cherrys DynRPG noch so ermöglichen wird :D

Kazesui
19.08.2012, 10:38
@MM Hatte kurz vergessen daß es möglich war so das Bild zu überschreiben. Sollte jetzt kein Problem mehr sein
Dank Kyuu, ist jetzt auch Multiplikatives und 2x Multiplikatives Blending auch noch drin

@Wieso nicht
Das zoomen wusste ich nicht wie ich hinbekommen sollte, und ich fürchte auch dass das wavern und rotieren schnell schwierig werden kann effizient genug zu machen.
Bei die farben müsste ich einiges rumprobieren wenn ich es ähnlich machen wurde wie beim maker, wäre aber evt. noch möglich. Müsste da noch schauen wie leicht/schwierig es wird.

MagicMaker
19.08.2012, 12:54
Wenn du Lust hast, kannst du dich hier ja nach weiteren umsehen:
http://en.wikipedia.org/wiki/Blend_modes

Ich benutze für meine vorbeleuchteten Map-Panoramen in Photoshop beispielsweise:
- [Soft Light] mit Dunkelblau für nächtliches Aussehen
- [Color Dodge] für farbige Lichtbilder
- [Linear Light] für Schatten

Wobei ich letztere wahrscheinlich nie als Extrabild einbinden würde.

http://garden.magicmaker.cherrytree.eu/media/pichost/verderben/KleinesZimmer.png

MagicMaker
19.08.2012, 14:02
Kann es sein, dass Bilder, die zu groß sind, nach kurzer Zeit Fehler verursachen?

---------------------------
Kaze Blending
---------------------------
Access violation in module 'DynBlending.dll' in with address 6630167E and offset 01206000 of type Read occured.
---------------------------
OK
---------------------------
(3200x1200)
Ich wollte mir einen Test einer Ganzbildschirmanimation etwas vereinfachen und hab
alle Frames in das gleiche Pic getan, um sie dann per Variablen und MovePic an die
richtige Position zu schieben, beim zweiten passiert allerdings das im Codeblock. ^-^

Kazesui
19.08.2012, 14:32
"Sollte" nicht, kann aber sein. Habe nicht wirklich solch grossen Bilder ausprobiert.
Ich werde mal daran schauen

Kazesui
19.08.2012, 16:19
Jupp, gab ein Bug dabei @große Bilder.
Sollte jetzt behoben sein

Corti
20.08.2012, 10:45
Hrm, leider kein Quellcode dabei :-(

Kazesui
20.08.2012, 16:07
Hrm, leider kein Quellcode dabei :-(

Source (http://rpgmaker.net/users/Kazesui/locker/BlendSource04.zip)
Hoffentlich jetzt auch noch bugfrei

Kyuu
20.08.2012, 18:41
Mir ist beim Überfliegen aufgefallen, dass du die Arrays im Destruktor nicht korrekt deallozierst:



~ImageData()
{
delete r;
delete g;
delete b;
}


Korrekt wäre:



~ImageData()
{
delete[] r;
delete[] g;
delete[] b;
}

Cherry
20.08.2012, 22:30
RPG::variables[7] = scriptLine->parameter(0);

Wohl noch Debug-Code. Gehört dringend raus.

Außerdem würd ich auch noch ein onInitTitleScreen machen und da die Blends löschen. Pictures können ja auch durch das Starten/Laden eines Spiels gelöscht werden!

Und der von Kyuu angesprochene Bug gehört auch dringend gefixt da der ein Memory Leak verursacht, soweit ich weiß.

Ach, Kazesui, Anregung: Ein Plugin um direkt 16-Bit-Bilder anzuzeigen! ;) (Müsstest du dann halt selber laden, mit einer PNG-Lade-Bibliothek)

Kazesui
20.08.2012, 22:43
Danke, gehört raus ja, und stimmt auch noch @Starten/Laden. Habe diesmal schon einiges vergessen, mist.
Sollte natürlich auch
delete[] sein. Ist glaub ich compiler bedingt in genau diesem Fall (Habe kein leak entdeckt als ein paar tausend mal pictures erstellen und löschen lies), sollte aber trotzdem natürlich drin sein, weil man sich auf sowas nicht verlassen soll. Danke.

Werde ich wohl zu meiner Liste hinfügen müssen @16-Bit-Bilder.

Kyuu
21.08.2012, 00:32
Ist glaub ich compiler bedingt in genau diesem Fall (Habe kein leak entdeckt als ein paar tausend mal pictures erstellen und löschen lies), sollte aber trotzdem natürlich drin sein, weil man sich auf sowas nicht verlassen soll.


Bei primitiven Datentypen wird der Speicher zwar offenbar auch mit delete freigegeben, aber - wie du selbst bemerkt hast - ist das alles andere als verlässlich und um genau zu sein sogar undefiniertes Verhalten.

Spätestens sobald du Klassen mit RAII hast, d.h. allozierter Speicher wird in den Destruktoren wieder freigegeben, bekommst du einen Memory Leak, weil die Destruktoren nur mit delete[] aufgerufen werden.

Problematisch kann es auch bei Operatorüberladung werden: http://www.parashift.com/c%2B%2B-faq-lite/delete-array-built-ins.html

Corti
28.02.2013, 18:05
Moin.

Einfrieren bei Erase Picture. Doch kein Phänomen des Picture Pointer Patches.




bool onEventCommand(RPG::EventScriptLine *scriptLine, RPG::EventScriptData *scriptData, int eventId, int pageId, int lineId, int *nextLineId)
{
if(scriptLine->command == RPG::EVCMD_ERASE_PICTURE)
{
Blend::iterator itr = blends.find(scriptLine->parameter(0));
if(itr != blends.end())
{
delete itr->second;
blends.erase(itr);
}
Active::iterator tmp = active.find(scriptLine->parameter(0));
active.erase(tmp);
}
if(scriptLine->command == RPG::EVCMD_SHOW_PICTURE)
{
Blend::iterator itr = blends.find(scriptLine->parameter(0));
if(itr != blends.end())
{
delete itr->second;
blends.erase(itr);
}
Active::iterator tmp = active.find(scriptLine->parameter(0));
if(tmp != active.end())
active.erase(tmp);
}
return true;
}


Haha, Quiz: Wie hab ich das hier gemacht? ^^

17016

Lösung:

Normales Bild ( 0% Transparenz ) auf id 14
fyr.add.png auf id 15


Tipps:

Wichtig sind nicht die ids, sondern das add-Bild im Script nach dem anderen anzuzeigen

Corti
20.03.2013, 11:16
News update:
Das Phänomen komischer Bildanzeigen hab ich in meiner Adaption des Scriptes gelöst.



bool onDrawPicture(RPG::Picture* picture)
{
( ... )

char* filename = picture->filename;
std::string type;
int i = -1;
while(filename[++i] != '.'); // <--- Knackpunkt hier
int n = ++i + 3;
for(; i < n; ++i)
type += filename[i];
if(!type.compare("add"))
{
active[id] = 1;
blends[id] = new ImageData(picture);
drawAdditive(id);
return true;
}
( ... )

Dateinamen enden zumindest bei mir nicht mit ".png" sondern enthalten gar keinen Punkt wenn kein ".add" oder Ähnliches vorhanden ist. Der Screenshot oben kommt zustande wenn bei einem "non-blend"-Picture, ausserhalb des Bereiches des Dateinamens irgendwo ein Punkt gefolgt von gültigen drei Zeichen gefunden wird zB auf Index 15466 bei mir ;-)

Kazesui
22.03.2013, 13:40
Danke! Ich hab tatsächlich nicht gemerkt daß der .png bei RPG::Picture::filename nicht dabei ist.
Dieser Bug sollte nun behoben sein + es ist jetzt auch möglich mit der Transparenz rumzuspielen bei dem Blend Bilder.

neuer source code (http://rpgmaker.net/users/Kazesui/locker/newSauce.zip)

Corti
22.03.2013, 14:50
Hey Kazesui,

ich hab in meiner Variante unter anderem Softlight eingebaut, bin mir aber noch nicht ganz sicher ob ich dabei nicht einen Fehler gemacht habe.
(Siehe Programmierforum : http://www.multimediaxis.de/threads/137964-C-Blending-Mode-%28Softlight%29-in-R5G6B5?p=3061073#post3061073 )

Das Topic ist nach meinen Edits reichlich konfus, ich bitte das zu entschuldigen. Wäre cool wenn du mal drauf schauen könntest. Wenn es dir zusagt kannst du das Codestück auch gerne übernehmen, hab den Grundcode schliesslich auch durch dich.
Softlight hat bei mir das Kürzel "sfl"


r = (src >> 11) > imgData->r[iPtr] ? (src >> 11) : imgData->r[iPtr];
g = ((src & 0x07E0) >> 5) > imgData->g[iPtr] ? ((src & 0x07E0) >> 5) : imgData->g[iPtr];
b = (src & 0x001F) > imgData->b[iPtr] ? (src & 0x001F) : imgData->b[iPtr];



r = (src >> 11) < imgData->r[iPtr] ? (src >> 11) : imgData->r[iPtr];
g = ((src & 0x07E0) >> 5) < imgData->g[iPtr] ? ((src & 0x07E0) >> 5) : imgData->g[iPtr];
b = (src & 0x001F) < imgData->b[iPtr] ? (src & 0x001F) : imgData->b[iPtr];

IndependentArt
19.03.2014, 15:30
ich werd mich jetz wohl mal dran machen, das ganze auszuprobieren. ist denn noch mit der erweiterung für transparenz zu rechnen? ^^

Raildex
10.04.2014, 08:42
Blending Mode? Das schreit ja gerade zu danach, ein Kampfsystem wie in Golden Sun zu machen! :D

aleksy
05.10.2014, 19:27
Es hat irgendwie lange gedauert, dieses Plugin zu finden, aber ich bin froh es gefunden zu haben ^_^
Hilft mir sehr weiter, was die Optik und den Detailgrad meines Spiels angeht.
Danke :D

AgentBlack
20.10.2014, 18:25
Hallo Kazesui,

Ich habe mir gerade neulich ein wenig über die Probleme in Bezug auf Lightmaps zerbrochen, welche bei meinem kleinen Projekt aufgetreten sind. (Nachzulesen hier: http://www.multimediaxis.de/threads/141756-Probleme-mit-Lightmaps?p=3205952#post3205952)

Im Grunde genommen ist das Hauptproblem jenes, dass nach dem Laden jeweils zuerst die Lightmap mit 0% Transparenz angezeigt wird. Bei einem Erase Event dauerhaft, bei Wait-Befehlen (zum Verhindern des typischen Lags) auf die Dauer der waits begrenzt.

Ich nehme an, dass es daran liegt, dass die Pictures die ich anzeigen lassen möchte als Lightmap alle mehr oder weniger Transparent eingestellt sind. Ich hatte damals nur gelesen, dass Dateien mit den Endungen .ml und Co. auf jeden Fall nicht skaliert werden dürfen (was aber durch den angezeigten Error + Absturz schnell ersichtlich wird, wenn man doch einmal in die Versuchung gerät^^), aber wohl übersehen, dass es ebenfalls Probleme mit Transparenz zu geben scheint.

Die Version des Blending Plugins die ich besitze hatte ich Anfang 2014 heruntergeladen. Arbeitest du noch an dem Projekt? :)

Würde mich sehr über eine Antwort freuen^.^!


WICHTIG!

Ich glaube, mein Problem ist nicht mit der Transparenz oder sonst irgendetwas zusammenhängend!!

Ich habe jetzt folgendes versucht:

Bei deinem (Kazesui) Plugin ist ja auch ein kleines Beispielprojekt dabei, wo eigentlich alles so konfiguriert ist, wie es sein sollte. Also keine Transparenz, keine Veränderungen an Zoom-Faktor, Farbeinstellungen etc. Ich hab eines der ShowPictures aus einem der Events rauskopiert, in ein neues zentrales Event gesteckt (so als wolle ich einfach ein Bild per parallel process anzeigen) und habe dann das wiederholt, was mir bei meinem Projekt solch ein Kopfzerbrechen bereitet:

Das Spiel startet, das Picture wird regelgerecht angezeigt. Dann speichere ich ab, kehre zum Hauptmenü zurück und lade den eben gespeicherten Spielstand.

Ergebnis: Zu Anfang wird das Picture, welches vorher ja eigentlich bereits keinerlei Transparenz besaß nun für einen gewissen Zeitraum direkt eingeblendet, mit ... nunja ich kann das auch nur als "mit mehr als 100% Transparenz" beschreiben. Definitiv ein Anzeigefehler. Ich schätze da muss irgendwo etwas im Code nicht stimmen. Wäre klasse wenn sich das finden ließe. Ich schätze du bist gerade recht beschäftigt, aber Corti scheint den Eindruck zu machen sich mit deinem Plugin auszukennen.

Eventuell kannst du ja herausfinden, woran genau es "hakt" beim Laden Corti.
Das wäre super ^.^

LG
AgentBlack