﻿<?xml version='1.0' encoding='utf-8' ?>
<?xml-stylesheet type="text/xsl" href="header_p.xsl" ?>
<body PageTitle="Wtyczka svgtex" PageHeader="Książki i poradniki" Created="2010-03-23" Updated="2010-03-23">
<div>
<p><b>Svgtex</b> to wtyczka (plugin) do Blendera, umożliwiająca użycie plików <b>*.svg</b> jako tekstur. 
Svgtex w pełni wykorzystuje wektorowy zapis obrazu, jakim jest format SVG. 
Umożliwia uzyskanie w Blenderze tekstur, które nawet w największym zbliżeniu nie tracą ostrości. 
Kod źródłowy komponentu jest udostępniony na zasadach GPL. Obecna wersja — 1.0 — współpracuje poprawnie 
z Blenderem od wersji 2.46 do wersji 2.49.
</p>
Do pobrania:<br/>
<a href="downloads/svgtex_win32.zip" title="spakowany, binarny plik wtyczki (svgtex.dll)">Skompilowany plik dla Win32</a>
— wtyczka i program do podglądu (sprawdzania) obrazów SVG (0.4 MB, wyłącznie dla Windows, 32-bit);
<br/>
<a href="downloads-svgtex_p.xml" title="przejdź na stronę, skąd można pobrać kod źródłowy">Kod źródłowy</a>
 — opcjonalny: jeżeli chcesz sam komponent skompilować/coś w nim zmienić;
<p/>
Jeżeli chcesz powtórzyć operacje pokazane poniżej, pobierz
<br/>
<a href="downloads/p40b.zip" title="model, wykorzystywany w tym i następnym przykładzie">przykładowy model</a> (12 MB) — model P-40B, wraz z teksturami, używany w tym tekście;
<p/>
</div>
<div class="subheader">1. Instalacja i uruchomienie</div>
<div>
<span>Wtyczka to plik <b><em>svgtex.dll</em></b>. Znajdzesz go w spakowanym 
<a href="downloads/svgtex_win32.zip" title="binarne pliki dla Win32, wskazane także na początku tego artykułu">pliku <em>*.zip</em></a>. 
Zawartość rozpakuj i umieść w jakimś istotnym folderze (np. w katalogu <em>plugins/texture</em> Blendera). </span>
<p/>
<span>
Aby skorzystać z wtyczki, zmień najpierw typ tekstury 
na <b>Plugin</b> (<b>Fig. 1.1</b>):
</span>
<br/>
<table cellSpacing="0" cellPadding="0pt" align="center">
	<tr align="center" valign="top">
		<td>
			<IMG src="images/scripts/svgtex1/image11_p.png" align="right"/>
		</td>
	</tr>
	<tr align="center" valign="top" >
		<td><spanl>Fig. 1.1 Zmiana typu tekstury — z rastrowej (<b>Image</b>) na „wtyczkę” (<b>Plugin</b>)</spanl></td>
	</tr>
</table>
<p/>
</div>
<div>
<span>Spowoduje to zmianę układu paneli: znikną panele obrazu rastrowego, zastąpione przez panel o nazwie <b>Plugin</b>. 
Początkowo znajduje się na niej tylko przycisk <b>Load Plugin</b>. Naciśnij go (<b>Fig. 1.2</b>):
</span>
<br/>
<table cellSpacing="0" cellPadding="0pt" align="center">
	<tr align="center" valign="top">
		<td>
			<IMG src="images/scripts/svgtex1/image12.png" align="right"/>
		</td>
	</tr>
	<tr align="center" valign="top" >
		<td><spanl>Fig. 1.2 Początkowy układ paneli <b>Plugin</b></spanl></td>
	</tr>
</table>
<p/>
</div>
<div>
<span>W oknie wyboru plików wskaż plik wtyczki: <em>svgtex.dll</em>. Koniecznie <em><u>wyłącz</u></em> ścieżki względne 
(<b>Relative Paths</b> - por. <b>Fig. 1.3</b>). Gdy ta opcja jest włączona, Blender nie będzie w stanie go załadować!
</span>
<br/>
<table cellSpacing="0" cellPadding="0pt" align="center">
	<tr align="center" valign="top">
		<td>
			<IMG src="images/scripts/svgtex1/image13_p.png" align="right"/>
		</td>
	</tr>
	<tr align="center" valign="top" >
		<td><spanl>Fig. 1.3 Wskazanie pliku wtyczki</spanl></td>
	</tr>
</table>
<p/>
</div>
<div>
Jeżeli wtyczka załadowała się poprawnie, powinna wyświetlić w panelu <b>Plugin</b> dodatkowe kontrolki (<b>Fig. 1.4</b>):
</div>
<div>
<table cellSpacing="0" cellPadding="0pt" align="center">
	<tr align="center" valign="top">
		<td>
			<IMG src="images/scripts/svgtex1/image14_p.png" align="right"/>
		</td>
	</tr>
	<tr align="center" valign="top" >
		<td><spanl>Fig. 1.4 Załadowana wtyczka <b>svgtex</b></spanl></td>
	</tr>
</table>
<p/>
</div>
<div>
<span>
Konieczność wpisywania pełnych nazw ścieżek jest uciążliwa, gdy musisz przenieść plik Blendera na inny komputer. 
Tam plik wtyczki może być w innym folderze, i trzeba parametry tekstur typu <b>Plugin</b> ustawiać od nowa.
</span>
<br/>
<span>
Najwygodniej byłoby wpisywać w panelu <b>Plugin</b> tylko nazwę
pliku <em>*.dll</em> — i niech komputer go sam znajdzie! To, na szczęście, jest możliwe.
Wystarczy zebrać wszystkie wtyczki, z których korzystasz, w jedno miejsce (jeden katalog), a
następnie dopisać jego nazwę do zmiennej środowiskowej <b>Path</b>.
</span>
<br/>
<small>
<span>Zmienne środowiskowe przestawiasz w Windows następująco:</span>
<ol>
<li>Podświetl ikonę <b>Mój Komputer</b> i przejdź do jej <b>Właściwości</b>;</li>
<li>W oknie dialogowym <b>Właściwości systemu</b> przejdź do zakładki <b>Zaawansowane</b> 
i naciśnij umieszczony u dołu przycisk <b>Zmienne środowiskowe</b></li>
<li>W oknie dialogowym
<b>Zmienne środowiskowe</b> podświetl na liście <b>Zmienne systemowe</b> zmienną <b>Path</b> i
naciśnij przycisk <b>Edytuj</b></li>
<li>W oknie dialogowym <b>Edytowanie zmiennej systemowej</b> dopisz ścieżkę do folderu z wtyczkami Blendera
(np. u mnie to C:\Program Files\Blender\plugins\texture). Zwróć uwagę, że
separatorem poszczególnych ścieżek jest tu średnik! Nie zapomnij sprawdzić, czy
jest przed i za dopisaną przez Ciebie nazwą!</li>
</ol>
</small>
<p/>
<span>Gdy plik wtyczki znajduje się w jednym z folderów wyliczanych
przez <b>Path</b>, można mu w panelu <b>Plugin</b> usunać całą ścieżkę. 
Na innym komputerze możesz wskazać w tej zmiennej środowiskowej inny katalog. Pliki
Blendera, w których wtyczki są wpisane tak, jak na <b>Fig. 1.5</b>, będą się poprawnie 
renderować na każdej z tych maszyn.</span>
</div>
<div>
<table cellSpacing="0" cellPadding="0pt" align="center">
	<tr align="center" valign="top">
		<td>
			<IMG src="images/scripts/svgtex1/image15_p.png" align="right"/>
		</td>
	</tr>
	<tr align="center" valign="top" >
		<td><spanl>Fig. 1.5 Wtyczka <b>svgtex</b> wskazana w sposób „niezależny od komputera”</spanl></td>
	</tr>
</table>
</div>
<div class="subheader">2. Użycie svgtex</div>
<div>
W pole <b>File name</b> wpisz ścieżkę do pliku SVG (w tym
przykładzie to plik <em>decals.svg</em>). Należy wpisywać ścieżki względne — względem
pliku <em>*.blend</em>, w którym aktualnie pracujesz. Zmień jeszcze tło na ciemnoszare, <b>Alpha</b> na 0, 
i możesz już włączyć <b>Enable</b>. W panelu <b>Preview</b> pojawi się podgląd tekstury (<b>Fig. 2.1</b>):
</div>
<div>
<table cellSpacing="0" cellPadding="0pt" align="center">
	<tr align="center" valign="top">
		<td>
			<IMG src="images/scripts/svgtex1/image21_p.png" align="right"/>
		</td>
	</tr>
	<tr align="center" valign="top" >
		<td><spanl>Fig. 2.1 Przykład tekstury wektorowej - znaki rozpoznawcze i napisy eksploatacyjne samolotu</spanl></td>
	</tr>
</table>
</div>
<div>
<p>Gdybyś pomylił się w nazwie pliku, lub coś poszło nie tak,
jak powinno, w podglądzie tekstury pojawi się jednolity, czerwony kolor. W
takim przypadku zajrzyj do tekstowej konsoli Blendera — powinien się tam
pojawić opis błędu, zgłoszonego przez svgtex (na przykład: „nie można znaleźć
pliku”).</p>

<p>Jak na razie, na podglądzie tekstury obraz wektorowy wygląda
identycznie jak rastrowy (por. <b>Fig. 1.1</b>). W przykładzie, który wykorzystujemy,
jest to tekstura ze znakami rozpoznawczymi i innymi emblematami, nakładana na
model samolotu. Jak w takim razie będzie się prezentować na renderze?<br/>
<u>UWAGA: aby uzyskać z <b>svgtex</b> pełen efekt, musisz włączyć opcję <b>OSA</b> (ustawienia na panelu <b>Render</b>)</u>. 
W przeciwnym razie zawartość pliku SVG zostanie nałożona na model w domyślnej, zazwyczaj bardzo niskiej rozdzielczości.
</p>

<span><b>Fig. 2.2</b> pokazuje porównanie modeli ze znakami rozpoznawczymi naniesionymi za pomocą
tekstury wektorowej (<b>a</b>) i rastrowej (<b>b</b>). Tekstura rastrowa <em>decals.png</em> ma
rozmiary 2048x2048 pixeli:</span>
</div>
<div>
<table cellSpacing="0" cellPadding="0pt" align="center">
	<tr align="center" valign="top">
		<td>
			<IMG src="images/scripts/svgtex1/image22_p.png" align="right"/>
		</td>
	</tr>
	<tr align="center" valign="top" >
		<td><spanl>Fig. 2.2 Porównanie tekstury wektorowej i rastrowej — model w „zwykłej” odległości od kamery</spanl></td>
	</tr>
</table>
</div>
<div>
<p>Mówiąc szczerze, porównanie <b>Fig. 2.2a</b>) i <b>Fig. 2.2b</b>) wygląda
na łamigłówkę typu „znajdź wszystkie różnice”. Z trudem udało mi się
zidentyfikować te dwie, które pokazuję. Sądzę, że obydwie mają tę samą
przyczynę: svgtex stosuje prostsze filtry przybliżania pikseli, niż te, których
używa Blender do plików rastrowych. W każdym razie nie widać tu żadnych przewag
tekstury wektorowej nad rastrową.</p>
<span>Ale zbliżmy się teraz do jakiegoś fragmentu modelu — na
przykład łopaty śmigła (<b>Fig. 2.3</b>). Przypadek (<b>a</b>) pokazuje zbliżenie z teksturą
rastrową, a przypadek (<b>b</b>) — to samo ujęcie z teksturą wektorową. Przypadek (<b>c</b>)
to jeszcze bliższe ujęcie tekstury wektorowej. Można już wyraźnie odczytać
napis na łopacie, a nawet emblemat: <em>Curtiss Electric Propellers</em>!:</span>
</div>
<div>
<table cellSpacing="0" cellPadding="0pt" align="center">
	<tr align="center" valign="top">
		<td>
			<IMG src="images/scripts/svgtex1/image23_p.png" align="right"/>
		</td>
	</tr>
	<tr align="center" valign="top" >
		<td><spanl>Fig. 2.3 Porównanie małych napisów w wersji rastrowej (<em>decals.png</em>) i wektorowej (<em>decals.svg</em>)</spanl></td>
	</tr>
</table>
<p/>
</div>
<div>
<b>Wniosek:</b> tekstury wektorowe są przydatne tam, gdzie wykonujesz większe zbliżenia modelu.
</div>
<div class="subheader">3. Jak to działa?</div>
<div>
<span>Zasada działania svgtex nie jest jakąś szczególną tajemnicą.
Podczas renderowania Blender żąda od wtyczki podania barwy konkretnego teksela
(piksela tekstury). Svgtex, aby „udzielić odpowiedzi”, tworzy w pamięci
rastrowe fragmenty obrazu. Użyje ich także przy okazji następnych „pytań”
Blendera. Każdy z tych fragmentów ma rozmiar 256x256 pikseli — tak, by zajmował
w RAM nie więcej niż 1 MB. W ten sposób oryginalny obraz jest dzielony jak
szachownica, na kwadratowe, jednolite obszary. Svgtex przygotowuje i
przechowuje tylko takie „pola” tej szachownicy, których zażądał od niego
Blender. Dodatkowo, jeżeli całe takie „pole” jest zupełnie jednolite, zamiast 1
MB danych przechowywany jest pojedynczy, reprezentujący je piksel.</span>
<p/>
<p>Svgtex tworzy fragmenty wielu różnych wersji obrazu,
różniących się rozdzielczością. Każda kolejna wersja ma czterokrotnie większą
liczbę pikseli od poprzedniej. Pierwsza wersja obrazu jest zawarta w
pojedynczym fragmencie, czyli „wpasowana” w obszar 256x256 pikseli. Następna ma
wymiary 512x512 pikseli, i składa się z 4 fragmentów. Kolejna wersja to obraz
1024x1024 pikseli (złożony z 16 fragmentów o rozmiarach 256x256). W grafice
komputerowej o takim szeregu obrazów mówi się, że są uporządkowane według
„poziomu szczegółowości” (<em>Level of Details</em> — <b>LoD</b>) . Poziom ten określa się jako
liczbę całkowitą. Na potrzeby Svgtex przypisałem <b>LoD</b> = 0 dla obrazu 256x256, <b>LoD</b>
= 1 dla 512x512, <b>LoD</b> = 2 dla 1024x1024, itd. W odpowiedzi na żądane Blendera
svgtex określa wymagany <b>LoD</b> obrazu, i zwraca piksel z jego odpowiedniej wersji.
Jeżeli żądany fragment jeszcze nie istnieje — jest w tym momencie generowany.</p>

<span>Wtyczkę <b>svgtex</b> pisałem przede wszystko z
myślą o własnych potrzebach. Jednak zdawałem sobie sprawę, że kiedyś udostępnię ją
innym użytkownikom. Poświęciłem więc trochę czasu na napisanie obsługi
większości elementów, występujących w formacie SVG. W efekcie komponent potrafi
narysować prawie wszystko, co przewiduje ten standard. Poniżej wyliczam to, co <u><em>nie</em></u> 
zostało zaimplementowane:</span> <br/>
<ul>
<li>znaczniki (<em>marker</em>)— bo to sporo pracy, a nie miałem pomysłu, do czego mógłbym je wykorzystywać;</li>

<li>filtry (<em>filter</em>) — obecnie obsługiwany jest tylko jeden typ: <em>Gaussian blur</em>. 
W kodzie przygotowałem miejsce na pozostałe, ale nie były mi potrzebne;</li>

<li>napisy (<em>text</em>) — brak obsługi wewnętrznych czcionek SVG. Svgtex 
wykorzystuje obecnie wyłącznie czcionki <em>True Type</em>, więc w środowisku Windows
wszelkie napisy są wyświetlane poprawnie. W kodzie programu jest przygotowane
miejsce dla innych typów czcionek — np. <em>FreeFont</em>.
Nie implementowałem ich jednak, gdyż tworzę swoje modele w środowisku Windows;</li>

<li>obrazy rastrowe (<em>image</em>) — wszelkie referencje do obrazów rastrowych
są ignorowane. Svgtex ma służyć do rysowania wektorowego; Oczywiście, wykorzystując bibliotekę <b>AGG</b>,
dodanie obsługi elementu do kodu nie nastręcza większych trudności</li>
</ul>
<p/>
</div>
<div>
Oczywiście, odwieczna mądrość programistów mówi „w każdym programie zawsze jest jeszcze co
najmniej jeden nie wykryty błąd”. Komponent na razie był porównywany z
rezultatami, które zwracał Inkscape, oraz przeszedł test praktyczny na
rysunkach, które przygotowywałem dla moich modeli. Wydaje mi się, że udało mi
się wyeliminować przynajmniej większość jego błędów. W razie czego, udostępniam
kompletny <a href="downloads-svgtex_p.xml" title="przejście na stronę, skąd można pobrać kod źródłowy">kod źródłowy</a>.
</div>
<div class="subheader">4. Opis parametrów wtyczki</div>
<div>
<span>Rodzaj i położenie kontrolek wtyczki svgtex w panelu <b>Plugin</b>
jest efektem wielu bolesnych kompromisów z ograniczeniami, jakie narzuca
struktura danych Blendera (zdefiniowana w <em>plugin.h</em>). Na przykład — pole na
nazwę pliku <em>*.svg</em> powinno być pierwszą kontrolką tej wtyczki. Niestety, okazuje
się, że można je „wepchnąć” wyłącznie pewnym, nie opisanym w dokumentacji
Blendera sposobem, i w dodatku tylko jako pole ostatnie (<b>Fig. 4.1</b>):</span>
</div>
<div>
<table cellSpacing="0" cellPadding="0pt" align="center">
	<tr align="center" valign="top">
		<td>
			<IMG src="images/scripts/svgtex1/image41_p.png" align="right"/>
		</td>
	</tr>
	<tr align="center" valign="top" >
		<td><spanl>Fig. 4.1 Funkcje kontrolek wtyczki <b>svgtex</b></spanl></td>
	</tr>
</table>
<p/>
</div>
<div>
<span>Poniżej podaję znaczenie wszystkich kontrolek, w tej kolejności, jak występują w paneli:</span><br/>
<ul>
<li><big><b>Extend</b>/<b>Repeat</b>/<b>Clip</b></big>: Przełącznik określający, co ma być przekazane do Blendera, 
gdy współrzędne tekstury wykraczają poza granice obrazu. 
<small>(Analogiczny, nieco bardziej rozbudowany przełącznik jest także w teksturach opartych o obrazy rastrowe: 
zobacz zestaw <em>Shading:Texture buttons</em>, panel <em>Map Image</em>).</small> 
Znaczenie poszczególnych alternatyw:
<ul>
<li><b>Extend</b>: na zewnątrz obrazu są powielone piksele z jego krawędzi;</li>
<li><b>Repeat</b>: obraz jest powielany w nieskończoność;</li>
<li><b>Clip</b>: poza obszarem obrazu nie jest nic rysowane (obraz jest absolutnie przejrzysty);</li>
</ul>
</li>
<li><big><b>Interpol</b></big> (<em>interpolation</em>): Poziom wygładzania pikseli obrazu. Gdy <b>Interpol</b> = 0, 
wykorzystywana jest wartość najbliższego piksela. W takim przypadku granice obrazów mogą być nieco „ziarniste”. 
Dla wartości = 1, wykorzystywana jest średnia z 4 najbliższych pikseli, a dla wartości <b>Interpol</b> = 2 — z 16 
sąsiednich. Poziom <b>Interpol</b> = 3 oznacza uśrednienie z 64 sąsiednich pikseli. Każde zwiększenie poziomu 
interpolacji w sposób widoczny „rozmywa” ostre granice kolorów na teksturze. Wydłuża także czas obliczeń 
(każdy kolejny poziom wymaga ich cztery razy więcej, niż poprzedni). Przypuszczam, że zazwyczaj będziesz używał 
dla <b>Interpol</b> wartości = 1 lub 0;
</li>
<li>
<big><b>Fid</b></big> (<em>fidelity</em>): Poziom doboru rozdzielczości (<b>LoD</b>) obrazu. 
Możliwe jest ustawienie od -5.0 do 0.0, przy czym wartość = 0.0 oznacza największą 
dokładność. (Przy wartości = 0.0 wykorzystywane są wyłącznie piksele z obrazu o 
<b>LoD</b> &gt;= żądanego przez Blender. 
Z takim ustawieniem komponent działa najszybciej). Każdy niższy poziom <b>Fidelity</b> 
oznacza wyznaczenie piksela poprzez wyciagnięcie średniej z dwóch obrazów o 
najbliższych poziomach szczegółowości (<b>LoD</b>). <small>Na przykład, załóżmy że svgtex 
określił dla konkretnego żądania Blendera optymalny <b>LoD</b> = 4 (obraz o rozdzielczości 4096x4096 pikseli). 
Jeżeli <b>Fid</b> = -0.5, to zwracana Blenderowi wartość teksela jest w 50% wartością z obrazu o <b>LoD</b> = 4, 
a w 50% — z obrazu o <b>LoD</b> = 3 (2048x2048). To przypadek klasycznej techniki „mipmapowania”. 
Gdyby <b>Fid</b> = -0.2, wówczas zwracany Blenderowi teksel byłby średnią pochodzącą w 80% z pikseli 
tekstury 4096x4096, i 20% tekstury 2048x2048. Gdyby <b>Fid</b> = -1.6, uśrednianie rozegrałoby się 
pomiędzy pikselami z obrazu o rozdzielczości 2048x2048 
<em>(<b>LoD</b> = Max(<b>LoD</b> + <b>Fid</b>) = Max(4 - 1.6) = 3)</em> 
i 1024x1024 <em>(<b>LoD</b> = Min(<b>LoD</b> + <b>Fid</b>) = Min(4 - 1.6) = 2)</em>.</small>
W każdym razie używaj tego ustawienia z umiarem — dla map nierówności gdzieś pomiędzy 0.0 a -1.0. 
Dla zwykłych tekstur barwy pozostaw <b>Fid</b> = 0.0;
</li>
<li>
<big>barwa tła</big>: Standardowy przybornik Blendera do wyboru barwy tła. Ta barwa jest 
widoczna tylko wtedy, gdy oryginalny obraz <em>*.svg</em> miał tło przejrzyste. 
Uwaga: dla rysunków na przejrzystym tle, takich jak oznaczenia samolotu, barwa tła delikatnie 
wpływa na kontury znaków rozpoznawczych i innych emblematów, nawet gdy ustawisz <b>Alpha</b> na 0.0. 
Stąd do mapowania <em>decals.svg</em> ustawiłem ją nie na czerń, a 40% szarość (<b>Fig. 2.1</b>).
</li>
<li>
<big><b>Alpha</b></big>: Dodatkowy parametr barwy tła. Określa poziom nieprzejrzystości. 
Gdy <b>Alpha</b> = 0.0 tło jest zupełnie przejrzyste;
</li>
<li>
<big><b>Df.LoD</b></big> (<em>Default Level of Details</em>): po włączeniu <b>Enabled</b>, svgtex 
wygeneruje wszystkie fragmenty obrazu o <b>LoD</b> &lt;= <b>DfLoD</b>. Ustawiaj zazwyczaj na 
poziomie 1-2, gdyż inaczej możesz za długo czekać na pojawienie się podglądu tekstury w panelu 
<b>Preview</b>;
</li>
<li>
<big><b>Force Df.LoD</b></big>: Wymusza na svgtex wyłączne korzystanie z wersji obrazu o <b>LoD</b> = <b>DfLoD</b>. 
Sugestie dotyczące rozdzielczości, dostarczane przez Blender, są ignorowane;
</li>
<li>
<big><b>Mem Max</b></big>: Maksymalna ilość RAM (w MB), jaką mogą zająć fragmenty obrazów, 
zarządzanych przez svgtex. Dobieraj tą wartość uważnie, obserwując wartość umieszczonego obok 
pola <b>Used</b>. Jeżeli ustawisz <b>Mem Max</b> na poziomie mniejszym od typowych wartości <b>Used</b>, 
zmusisz wtyczkę do „porzucania” fragmentów, które jeszcze się jej przydadzą podczas tej samej 
sesji renderingu. W takiej sytuacji może tylko, gdy nadejdzie żądanie Blendera, powtórnie 
wygenerować obraz. To bardzo wydłuża czas renderingu;
</li>
<li>
<big><b>Used</b></big>: Pole wyłącznie informacyjne: aktualna ilość pamięci RAM, zajętej 
przez fragmenty obrazów (w MB); Czasami może nieco przekroczyć wartość <b>Mem Max</b> — 
o rozmiar pamięci, potrzebnej do przechowania zawartości pliku <em>*.svg</em>. <b>Used</b> 
służy do wyrobienia sobie poglądu, jak powinno być ustawione <b>Mem Max</b> aby nie zajmować 
za dużo RAM, a jednocześnie nie spowalniać niepotrzebnie procesu renderingu;
</li>
<li>
<big><b>Enable</b></big>: Uaktywnia teksturę (sprawia, że w Blenderze pojawia się jej obraz). 
Możesz także użyć tego przełącznika do „zresetowania” pamięci, zajętej przez fragmenty 
renderowanych obrazów;
</li>
<li>
<big><b>File name</b></big>: Ścieżka do pliku <em>*.svg</em> lub (co zostanie omówione później w tej sekcji) — <em>*.xml</em>; 
To pole nie jest specjalnie długie — 63 znaki. Najlepiej wpisuj tam ścieżki względne 
(względem aktualnego pliku Blendera). W ten sposób, gdy kiedyś przeniesiesz folder z całą 
strukturą projektu w nowe miejsce, nie zaszkodzi to działaniu wtyczki
</li>
</ul>
<p/>
</div>
<div>
<span>Po tym wyczerpującym opisie pozostaje dorzucić kilka rad
praktycznych:</span><br/>
<li>Zaraz po załadowaniu wtyczki możesz podnieść limit <b>Mem Max</b> i wykonać pierwszy 
rendering, by potem odczytać z pola <b>Used</b>, ile svgtex zużył pamięci. 
Potem ustaw <b>Mem Max</b> na 110% wartości Used;</li>
<li>Dla tekstur oznaczeń i innych dokładnych rysunków, stosuj <b>Interpol</b> = 0 lub 1 i <b>Fid</b> = 0.0;</li>
<li>Dla tekstur nierówności stosuj <b>Interpol</b> = 1 i <b>Fid = -0.5</b>, by zaokrąglenia i 
załamania granic paneli były bardziej płynne;</li>
</div>
<div class="subheader">5. svgview.exe: pomoc do podglądu plików SVG</div>
<div>
<span>„Ubocznym produktem” prac nad svgtex jest prosta przeglądarka plików <em>*.svg</em>.  
Znajdziesz ją w tym samym folderze, co plik <em>svgtex.dll</em>. To w istocie testowy program 
z biblioteki <b>AGG</b>, w którym sprawdzałem działanie parsera obrazu. Możesz używać <em>svgview.exe</em> 
do sprawdzenia, jak svgtex wyświetli konkretny obraz. Wystarczy wywołać ten program w linii 
poleceń, podając jako argument nazwę pliku <em>*.svg</em> (<b>Fig 5.1</b>):</span><br/>
<div>
<table cellSpacing="0" cellPadding="0pt" align="center">
	<tr align="center" valign="top">
		<td>
			<IMG src="images/scripts/svgtex1/image51_p.png" align="right"/>
		</td>
	</tr>
	<tr align="center" valign="top" >
		<td><spanl>Fig. 5.1 Obsługa programu <em>svgview.exe</em></spanl></td>
	</tr>
</table>
<p/>
</div>
<span>Powiększenie obrazu możesz w <em>svgview.exe</em> zmieniać za pomocą suwaka <b>Scale</b>, 
umieszczonego u góry ekranu. Do przesuwania obrazu służy myszka — wystarczy ją przesunąć z 
wciśniętym lewym przyciskiem. Przy każdej zmianie skali lub przesunięciu obraz jest rysowany na 
nowo. Liczby u góry ekranu (<b>Fig. 5.1</b>) podają, ile wierzchołków napotkano, i ile trwało 
przerysowanie obrazu. 
</span><br/>
<span>
Zwróć uwagę na ogromną liczbę wierzchołków pokazaną na ilustracji — niemal 2 miliony (<b>Fig. 5.1</b>). 
To mój „stress test”: plik <a href="downloads/skin.svg" title="Ten plik znajdziesz także wśród danych przykładowego modelu, załączonych do tej strony.">skin.svg</a>, 
zawierający wszystkie szczegóły nierówności poszycia modelu samolotu. 
Narysowanie zawartości tego pliku 
wymaga od interpretera SVG sporego wysiłku, głównie z powodu sposobu odwzorowania nitów. 
Każdy rząd nitów to jest w nim jeden tekst, a każdy nit to pojedynczy znak tekstu (kropka). 
(Nity są na tyle małe i „blade”, że na <b>Fig. 5.1</b> ich nie widać. Otwórz jednak sam ten 
obraz pod svgview.exe i zwiększ skalę, a je zobaczysz — małe, ciemniejsze kółka). 
Prawie wszystkie (95%) wierzchołki spośród naliczonych przez program 1 983 458 należą do nitów 
(każde „kółko” ma ich po 32). 
</span><br/>
<p>
Tak duża ilość tekstu — 50 tysięcy znaków — zaczyna być dla przeglądarek SVG wyzwaniem. 
Gdy go tworzyłem (w Inkscape), miałem problemy z szybkością tego edytora. Zacząłem więc mierzyć 
czas przerysowania całego pliku <em>skin.svg</em> przez interpretery SVG, które miałem pod ręką: Inkscape,
Firefox, i mój svgview. <b>Fig. 5.2</b> przedstawia rezultaty, uzyskane ma moim laptopie (Dell Latitude 610 - 
Intel Centrino 1.6 MHz, 1 GB RAM, Windows XP):</p>
</div>
<div>
<table cellSpacing="0" cellPadding="7pt" align="center">
	<tr align="center" valign="top">
		<td class="framed">
			<b>Interpreter SVG</b>
		</td>
		<td class="framed">
			<b>Czas narysowania (s)</b>
		</td>
		<td class="framed right">
			<b>Zajęty RAM (MB)</b>
		</td>
	</tr>
	<tr align="center" valign="top">
		<td class="framed">
			<em>Inkscape 0.49</em>
		</td>
		<td class="framed">
			45.0
		</td>
		<td class="framed right">
			398
		</td>
	</tr>
	<tr align="center" valign="top">
		<td class="framed">
			<em>Sketsa Editor 6.3</em>
		</td>
		<td class="framed">
			od 2.0 do 20.0
		</td>
		<td class="framed right">
				350
		</td>
	</tr>
	<tr align="center" valign="top">
		<td class="framed">
			<em>Firefox 3.5</em>
		</td>
		<td class="framed">
			12.0
		</td>
		<td class="framed right">
			27
		</td>
	</tr>
	<tr align="center" valign="top">
		<td class="framed bottom">
			<em>svgview.exe</em>
		</td>
		<td class="framed bottom">
			1.5
		</td>
		<td class="framed bottom right">
			2
		</td>
	</tr>
	<tr align="center" valign="center">
		<td colspan="3"><spanl>Fig. 5.2 Czas i pamięć, użyte do przerysowywania pliku <a href="downloads/skin.svg" title="Otwórz ten plik na swojej przeglądarce">skin.svg</a></spanl></td>
	</tr>
</table>
</div>
<div>
<span>Jak widać, <b>svgview.exe</b> potrzebuje na zaledwie 1.4 sekundy i 2 MB RAM na to, co w Inkscape zajmuje 45s i 400 MB RAM! 
Przy czym zapewniam, że w kodzie mojego parsera SVG można dokonać jeszcze wielu prostych optymalizacji, 
a sam program jest był skompilowany w pochodzącym z 1998r MS VC 6.0. Co prawda Inkscape 
jest edytorem, więc dane SVG musi przechowywać i przetwarzać w trochę inny sposób. 
Ale popatrz na inn edytor: Sketsa. Tam ktoś wraźnie intensywnie optymalizował przerysowywanie.
Przy powiększeniach poniżej 100% przerysowywanie jest rzedu 2s, a przy powiększeniach powyżej 100%
 - od 5 do 20s. Sądzę że rozrzutność wykorzystania zasobów komputera przez Inkscape może być przejawem 
 jakiegoś grubego błędu w architekturze programu.</span>
<br/>
<small>
Inna rzecz, że Sketsa ma uboższą od Inkscape funkcjonalność. Co więcej, pokazuje biały ekran
przy próbie powiększenia <em>skin.svg</em> do 400% i zawiesza się przy próbie selekcji jakiegokolwiek elementu
z tego rysunku. Nie polecam tego programu, tym bardziej że jest płatny.</small><br/>
<small>Nie spodziewałem się takiej wydajności po moim kodzie, choć <b>AGG</b>, 
którą wykorzystują <b>svgtex</b> i <b>svgview</b>, jest ładną biblioteką szablonów C++. Być może to właśnie  
te szablony umożliwiają kompilatorowi daleko posuniętą optymalizację poprzez zastąpienie wywołań wielu metod 
przez "płaski" kod wynikowy? Ale efekt wyszedł całkiem interesujący!</small> 
</div>
<div class="subheader">6. Funkcje zaawansowane</div>
<div>
Dodatkową kontrolę nad <b>svgtex</b> możesz uzyskać, podstawiając w polu <b>File Name</b> 
zamiast pliku <em>*.svg</em> specjalne, krótkie pliki <em>*.xml</em>. 
Nazwałem je <b>skrótami XML</b>, gdyż m.in. pozwalają wskazać plik lub pliki SVG, z których 
ma powstać tekstura. To zaawansowana funkcjonalność, z której nie musisz korzystać, jeżeli nie 
znasz (i nie zamierzasz poznać) podstaw składni XML. Jeżeli jednak masz ochotę spróbować — 
przejdź do <a href="scripts-svgtex2_p.xml" title="przejdź na stronę, opisującą zaawansowaną funkcjonalność wtyczki svgtex">opisu skrótów XML</a>.
</div>
</body>
