Ahojte, po siedmich rokoch som sa nostalgicky pozrel spat na toto forum a ono este stale existuje Nedokazal som si obnovit stary ucet, email uz je zruseny tak aspon takto sa hlasim
Vítejte u druhého dílu ze série o VHLT - mocných kompilačních nástrojích.
Dnes si ukážeme, jak donutit entitu (brushovou), aby vrhala stín, dále jak tento stín vypnout/zapnout a nakonec se vyblbneme na barevných a blikajících stínech.
Opaque entity
Tato funkce byla teoreticky implementovaná už v ZHLT, ale byla totálně nepoužitelná. Entity stín sice vrhaly, ale naprosto náhodným směrem. To byla vždy zábava hledat kam se tentokrát poděl. Naštěstí tyhle doby jsou již za námi a my můžeme využívat Vluzacnovy skvělé kompilátory.
Nejdřív si vytvoříme mapu, na které můžeme dělat pokusy. Já udělal první místnost se světlem veprostřed, spawn a tři krabice, které budou vrhat stín. Každou převedeme zvlášť na func_wall. Pokud bychom mapu skompilovali, nevrhaly by žádný stín, světlo by procházelo skrz ně. Proto vlezeme do nastavení entity a všem nastavíme Light Flags na Opaque (Blocks light) (mimochodem opaque znamená neprůhledný nebo neprůsvitný). Nyní když mapu skompilujeme, tak uvidíme, že krabice vrhají stín. Nikdo by do nich neřekl, že jsou to entity. Z Light Flags nás bude vždy zajímat jenom defaultní normal, tzn. žádný stín, a Opaque (Blocks light), neboli vrhat stín. Ostatní hodnoty nic speciálního nedělají, jsou ještě ze starého ZHLT, kde stejnak nefungovaly.
Výhody opaque
Možná si říkáte, proč to nenechat jako brush a zbytečně přidělávat entity, když výsledek je stejný. V tomhle případě máte pravdu. Krychlovou krabici, pokud je zarovnaná do mřížky, je lepší nechat jako brush. Avšak opaque func_wall příjde nařadu, když je třeba optimalizovat VIS. Například válec stojící na zemi (třeba barel) nám rozřeže podlahu šíleným spůsobem (asi jako carve) a VIS se z toho může .... . Řešení bývá většinou posunutí o 1hu nahoru anebo! převedení na entitu. Entity totiž nekrájí facy, ani VIS leafy. A když máme sud na func_wall, tak proč mu nezapnout vrhání stínu, že? Na optimalizaci visu je lepší pseudoentita func_detail, která je dostupná ve VHLT od verze 25. Mimochodem, ten stín se počítá stejně jako se počítají stíny brushům, takže kompilace by se neměla zpomalit v tomhle ohledu.
Když už jsme u func_wallu, tak nemůžu nezmínit "modré" textury. Pokud zapnete vrhání stínu u func_wall s "modrou" texturou, tak bude zkrz entitu procházet světlo pouze tam, kde je "modrá". Což je hodně hodně dobrá věc, ale realita není vždy tak růžová. Vzhledem k tomu, že velikost bodu lightmapy je 16x16 nebo 8x8 (záleží na scale textury (v texture application toolu)), detailní stín drátěného plotu zrovna nečekejte. U větších děr to však dobrý efekt má.
Dalším faktem je, že opaque nemusíme nastavovat pouze func_wallům, ale jakékoli jiné brushové entitě. To se hodí nejvíce u func_breakablů, zvlášť ve spojení s vypínatelným stínem (viz dále). Samozřejmě můžeme stín nastavit i entitám jako je func_train, ale tam to nemá moc smysl, protože když vlak odjede, stín zůstane na místě, což by nevypadalo nejlépe.
A poslední, ale o nic menší výhodou je, že stín můžeme různě upravovat a hrát si s ním.
Vypínací/zapínací stín
Asi největší využití přepínacích stínu nelezneme u breakablů. To taky použiji jako první příklad. Vezměme jednu bednu a namísto func_wall jí předěláme na func_brakable. Bednu nějak pojmenujem (třeba "cube1") a v rychlosti nacvakáme materiál, strength, samozřejmě light style na opaque a jdeme rovnou na stín. Pokud jste si správně nastavili nové fgd, měli byste mít v seznamu pointových entit light_shadow. Vložíme ji kamkoli do mapy a podíváme se na nastavení. První položka je Target solid entity, tam napíšeme jméno entity, jejíž stín chceme ovládat, v našem případě "cube1". Name je klasické jméno, které budeme targetovat a tím přepínat stín, napíšeme třeba "cube1_shadow". Appearance a custom appearance probereme dále. Coring of this style jsem nikde nenašel, co to má dělat, ale souvisí to s těmi Appearance a custom appearance. Experimentálně jsem zjistil, že hodnoty se pohybují od 1 do 2 (možná i více) a čím větší je číslo, tím více se stín jakoby ukrojí. Nicméně defaultní 0.1 funguje, takže není co řešit. Kdyby někdo objevil, co to přesně dělá, ať mi prosím napíše.
Poslední položka je Classname in game, ale abyste pochopili, k čemu vlastně je, musíte pochopit jak vlastně ten přepínací stín funguje. Entita light_shadow v mapě nebude vůbec light_shadow. Half-life engin žádnou takovou entitu nezná. Tahle entita se při kompilaci přepíše na obyčejné světlo (light nebo spotlight) a nastaví se jí, aby svítila tam, kde je stín, který potřebujeme přepnout. Vlastně se jí přiřadí určitá lightmapa. Takže Classname in game není nic jiného, než výběr, na co se entita light_shadow přemění. Já jsem nenašel žádný rozdíl mezi oběma možnostmi, takže můžeme nechat light. Když to nyní skompilujeme, budeme mít v mapě kostku, která vrhá stín a přidané světlo, které vysvicuje přesně oblast toho stínu. Takže vlastně žádný stín neuvidíme :-). Vrátíme se zpátky do Hammeru a napravíme to tak, že ve flags u entity light_shadow zaškrtneme initially dark. Takže naše fake světlo bude zhasnuté a my uvídíme stín krychle. Paráda, takže teďka akorát do targetu bedny napíšeme jméno entity light_shadow, tedy "cube1_shadow" a máme hotovo. Když do bedny střelíme, rozsvítí se světlo a stín zmizí. Jak to vypadá se můžete podívat na výsledném videu.
Druhý příklad - dveře
Jedna z dalších možností, kde můžete pomocí vypínacího stínu dosáhnout dobrého efektu, jsou dveře. Já jsem na ně použil "modrou" texturu branky, abyste viděli i stín zkrz průhledný brush. Samotné dveře si nastavte jak chcete, ale musíte jim dát jméno (třeba "dvere"). Tím nám vznikne problém, protože dveře se jménem jdou otevřít pouze přez nějaký trigger. Nedá se nic dělat, musíme před ně dát trigger_multiple, nastavíme mu target na "dvere" a Delay before reset na nějakou menší hodnotu (nejlépe kolik máme delay before close u dveří). Dále vložíme opět light_shadow a nastavíme podle potřeby. Tedy Target solid entity bude "dvere", jméno třeba "dvere_shadow" a ve flags zaškrtneme initially dark. A pak stačí nastavit dveřím do target jméno light_shadow, tedy "dvere_shadow". A tím je to hotovo, když hráč přijde ke dveřím, spustí trigger_multiple, ten otevře dveře a ty, jak se otevřou, vypnou si stín. A když se zpátky zavřou, targetnou znova light_shadow a stín se jim objeví. Samozřejmě, že by to šlo i jinak, přez multimanager a správně to načasovat, ale tohle mi přijde nejjednoduší.
Kolísající stín
Zatím jsem nepřišel na praktické využití tohoto efektu, ale rozhodně to vypadá zajímavě. Jak jsem zmínil, light_shadow se chová jako obyčejné světlo, takže mu půjde nastavovat kolísání. Tedy vytvoříme nový light_shadow, přiřadíme ho ke druhé krychli (pojmenované třeba "cube2"), ale nezaškrtáváme initially dark! Samotného efektu potom docílíme výběru z možostí Appearance, nesmíme ale entitu pojmenovávat, nebo vytvoříme vlastní vzor pomocí Custom appearance, v tomhle případě musíme nastavit i name. Nebudu tu popisovat, jak to nastavit, pouze vás odkážu na můj článek o hořícím sudu, kde jsem to již vysvětloval. Musím ale zmínit, že pokud nastavíte plný rozsah, tzn od a do z nebo vyberete z Appearance, tak se dosáhne většího osvětlení, než tam, kde stín není.
Avšak toto světlo se dá pouze vypnout, takže nemůžete přepínat mezi kolísajícím a žádným stínem. Alespoň nijak jednoduše, což je škoda.
Barevný stín
Ano, je to možné, můžete nastavit barvu stínu jakkoli si přejete. Můžete ho udělat černý, jasně bílý, tmavě modrý nebo svítivě fialový. Má pouze jedinou nevýhodu a to, že se nedá ovládat pomocí light_shadow. Vlastně to není ani technicky možné. Když nastavíte bílý stín, těžko ho světlem ztmavíte. A jak ho tedy obarvit? Úplně jednoduše. Vlezeme do nastavení entity (func_wall třeba), nastavíme jí zase opaque a koukneme se na položku Custom shadow. Barvu stínu určíme pomocí modelu RGB s tím, že každá barva má rozmezí od 0 do 1. Tedy černá bude "0 0 0", bílá "1 1 1", tmavooranžová "0.2 0.2 0" nebo jasná fialová "1 0 1". Pokud RGB model neznáte (styďte se!), můžete použít například Color picker, vybrat si barvu a čísla R, G a B a vydělit 255. Ale zase se dost dobře může stát, že to přepálíte a stín bude svítit.
Tento efekt se dá využít když chcete udělat nejhnusnější mapu na světě, nebo když chcete, aby například červená látka vrhala slabší stín zbarvený do červena (hodí se až budete dělat třeba mapu fy_prádelna).
Závěr
Doufám, že se vám dnešní díl líbil a že jste se něco nového naučili. Kdyby cokoli, nebojte se zeptat v komentářích pod článkem, případně na fóru/shoutboxu.
Na závěr přidávám video s příkladovou mapou, kde si můžete prohlédnout výsledek.
Ale ne clanok za jedna Xpun len tak dalej mame radi VHLT