Differences

This shows you the differences between two versions of the page.

Link to this comparison view

egc:teme:2025:03 [2025/12/13 12:37]
andrei.lapusteanu
egc:teme:2025:03 [2025/12/14 13:55] (current)
andrei.lapusteanu
Line 1: Line 1:
 <​hidden>​ <​hidden>​
 +
 +======= Tema 3 - Firefly Forest =======
 +
 +  * **Responsabili:​** Andrei Lăpușteanu,​ Vlad-Matei Drăghici, Mihnea-Petruţ-Ilie Mitrache
 +  * **Lansare:​** 14 decembrie 2025
 +  * **Termen de predare:** 18 ianuarie 2026, ora 23:59
 +  * **Regulament:​** [[egc:​teme:​regulament|]]
 +  * **Notă:** Această temă este considerată **temă suplimentară**
 +  * **Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!**
 +
 +<note tip>
 +În cadrul acestei teme puteți opta pentru a **lucra în echipe de maxim 2 studenți**!
 +  * Cerințele sunt aceleași atât pentru o implementare în mod individual cât și în echipă
 +  * În cazul lucrului în echipă, în timpul prezentării temei va trebui să prezentați în mod diferențiat contribuția fiecăruia (să știe și să prezinte fiecare student ce a implementat)
 +</​note>​
 +
 +În cadrul acestei teme veți implementa o scenă virtuală ce prezintă o pădure nocturnă, populată de licurici, care include și un turn de observație. Tema urmărește studierea conceptelor de iluminare și texturare. ​
 +
 +Elementele vizuale principale ce compun scena vor fi un teren texturat, copaci animați cu un efect de vânt, licurici care emit lumină punctiformă și un turn de observație echipat cu lumini tip spotlight care proiectează un pattern de textură (light cookie). Pentru accentuarea atmosferei veți adăuga și un efect de ceață.
 +
 +Puteți studia în următorul videoclip o posibilă implementare a cerințelor.
 +
 +<​html>​
 +<p style="​text-align:​center;​margin:​auto;">​
 +<iframe width="​560"​ height="​315"​ src="​https://​www.youtube.com/​embed/​tdg4r_rSIZY"​ title="​YouTube video player"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; clipboard-write;​ encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen></​iframe>​
 +</p>
 +</​html>​
 +
 +===== Scena virtuală =====
 +
 +Scena va fi compusă dintr-o serie de modele 3D, anume:
 +  * **Terenul**:​ Format dintr-un plan texturat
 +  * **Copacii**:​ Formați din primitive (construcția acestora este specificată în capitolele următoare)
 +  * **Licuricii**:​ Formați din sfere mici cu proprietăți emisive
 +  * **Turnul de observație**:​ Format din primitive (construcția acestuia este specificată în capitolele următoare)
 +
 +==== Poziționarea camerei ====
 +
 +Camera va fi de tip perspectivă și trebuie poziționată astfel încât să fie surprinse în același timp toate elementele de interes din scenă (terenul, copacii, turnul, licuricii). Nu este obligatoriu să controlați poziția/​rotația camerei în timpul rulării aplicației,​ aceasta poate să rămână statică.
 +
 +===== Construcția turnului de observație =====
 +
 +Turnul de observație este construit folosind o serie de primitive. Varianta recomandată,​ care este utilizată și în demo, are următoarele componente:
 +
 +  - Stâlpi de susținere (4 paralelipede care trec prin platformă și ajung la acoperiș)
 +  - Platformă (paralelipiped)
 +  - Acoperiș (con turtit pe înălțime)
 +  - Proiectoare pentru lumini (2 conuri)
 +
 +{{ :​egc:​teme:​2025:​watchtowergeom.gif?​400 |}}
 +
 +<note important>​Puteți propune alte variante de geometrie. Spre exemplu să realizați elemente diferite pentru susținerea bazei
 +și a acoperișului. Simplificări ale variantei propuse nu vor aduce punctajul total.</​note>​
 +
 +<​note> ​
 +Primitiva de tip con nu se regăsește în framework. Dacă doriți s-o utilizați, aceasta se poate descărca de aici {{:​egc:​teme:​2022:​cone.zip|}}
 +</​note>​
 +
 +===== Construcția copacilor =====
 +
 +Copacii se aseamănă unor pini. Varianta recomandată,​ care este utilizată și în demo, are următoarele componente:
 +  - Trunchi (cilindru)
 +  - Frunziș (minim 6 paralelipipede)
 +Frunzișul trebuie dispus în mai multe niveluri pe înălțime,​ a căror dimensiune să scadă treptat.
 +
 +{{ :​egc:​teme:​2025:​treegeom.png?​400 |}}
 +
 +<​note> ​
 +Primitiva de tip cilindru nu se regăsește în framework. Dacă doriți s-o utilizați, aceasta se poate descărca de aici {{:​egc:​teme:​2025:​cylinder.zip|}}
 +</​note>​
 +
 +Trunchiului i se va aplica un efect simplu de subțiere pe înălțime. Frunzele vor avea o animație ciclică, simulând bătaia vântului. Aceste efecte se realizează în shader și sunt descrise mai jos.
 +
 +==== Deformare în Vertex Shader (Copaci) ====
 +
 +=== Trunchi ===
 +
 +Trunchiului i se va aplica un efect de subțiere. În funcție de înălțimea vertex-ului,​ îl veți apropia de axa principală a cilindrului.
 +
 +$$
 +t = \frac{y}{TREE\_HEIGHT}\\
 +scale = 1 - t\\
 +x_{final} = x_{original} \cdot scale\\
 +z_{final} = z_{original} \cdot scale
 +$$
 +
 +=== Frunziș ===
 +
 +Frunzișul se deplasează în bătaia vântului. Aceasta presupune deplasarea orizontală a vârfurilor în funcție de înălțimea lor în coordonate obiect.
 +
 +Ideea principală este că vertecșii de la baza copacului se mișcă mai puțin, iar cei de la vârf sunt afectați mai puternic. Deplasarea va fi modulată sinusoidal în funcție de timp pentru a crea o animație continuă de balansare.
 +
 +Parametri de luat în considerare:​
 +  * Înălțimea normalizată a vârfului (0 la bază, 1 la vârf)
 +  * Frecvența și faza oscilației (diferite pentru fiecare copac pentru variație vizuală)
 +  * Amplitudinea maximă a deplasării
 +
 +$$
 +t = \frac{y}{TREE\_HEIGHT}\\
 +wave = \sin(Time \cdot BendFrequency + t \cdot 0.5 + BendPhase)\\
 +offset = wave \cdot BendStrength \cdot t\\
 +x_{new} = x_{original} + offset
 +$$
 +
 +**Amplitudine:​**
 +
 +Fiecare parte a copacului are asociată propria amplitudine de oscilatie:
 +
 +$$
 +Trunchi: offset = wave \cdot A_{trunchi} \cdot t = wave \cdot 0.0 \cdot t = 0 \\ 
 +Frunze\_Jos:​ offset = wave \cdot A_{mic} \cdot t\\
 +Frunze\_Mijloc:​ offset = wave \cdot A_{mediu} \cdot t\\
 +Frunze\_Varf:​ offset = wave \cdot A_{mare} \cdot t
 +$$
 +
 +Rezultatul final pe care trebuie să îl obțineți este:
 +{{ :​egc:​teme:​2025:​treeshader.gif?​400 |}} 
 +
 +
 +==== Texturare ====
 +
 +Fiecare element constitutiv al unui copac se va textura:
 +  * Trunchiul – textură de lemn/​scoarță
 +  * Frunzișul – textură de frunze/​vegetație
 +
 +===== Terenul =====
 +
 +Terenul va fi format dintr-un plan. Acesta trebuie scalat suficient astfel încât marginile acestuia să nu fie evidente din perspectiva camerei.
 +
 +Pe acest plan va trebui aplicată o textură care se repetă. Deoarece terenul va trebui scalat în mod semnificativ,​ simpla aplicare a texturii ar conduce la întinderea acesteia pe întreg planul. Pentru a evita acest efect, coordonatele de texturare pot fi scalate în shader sau mesh-ul poate avea coordonate UV în afara domeniului uzual (0,0) → (1,1).
 +
 +<note tip>
 +Nu uitați că este necesară setarea ''​wrapping_mode''​-ului texturii cu ''​GL_REPEAT''​.
 +De asemenea, vă recomandăm utilizarea unei texturi de tip "​seamless"​ pentru acest task.
 +</​note>​
 +
 +===== Efectul de ceață (Fog) =====
 +
 +Pentru a adăuga un plus atmosferei și pentru a simula adâncimea, se va implementa un efect de ceață în Fragment Shader. ​
 +
 +Se va folosi un model de ceață cu atenuare liniară, în care densitatea ceții crește proporțional cu distanța dintre fragment și cameră. Fragmentele apropiate de cameră vor fi vizibile clar, în timp ce cele îndepărtate vor fi estompate progresiv spre culoarea ceții.
 +
 +=== Calcul densitate ceață ===
 +
 +Fie:
 +  * \(\vec{P}\) – poziția fragmentului în spațiul lumii
 +  * \(\vec{C}\) – poziția camerei
 +  * \(d_{\text{max}}\) – distanța maximă de vizibilitate
 +
 +Distanța fragmentului față de cameră se calculează ca:
 +
 +\[
 +d = \|\vec{P} - \vec{C}\|
 +\]
 +
 +Factorul de densitate a ceții variază liniar între 0 (fără ceață) și 1 (ceață completă), limitat la intervalul \([0, 1]\):
 +
 +\[
 +f_{\text{fog}} = \text{clamp}\left(\frac{d}{d_{\text{max}}},​ 0, 1\right)
 +\]
 +
 +=== Combinarea culorilor ===
 +
 +Culoarea finală a fragmentului se obține prin interpolarea liniară între culoarea obiectului și culoarea ceții, folosind funcția ''​mix'':​
 +
 +\[
 +\vec{C}_{\text{final}} = \text{mix}(\vec{C}_{\text{obiect}},​ \vec{C}_{\text{fog}},​ f_{\text{fog}})
 +\]
 +
 +unde \(\vec{C}_{\text{obiect}}\) este culoarea fragmentului calculată **după iluminare și texturare**,​ iar \(\vec{C}_{\text{fog}}\) este culoarea ceții (de exemplu, gri).
 +
 +Puteți observa în GIF-ul de mai jos scena cu și fără efectul de ceată.
 +
 +{{ :​egc:​teme:​2025:​egc_2025_t3_fog_on_off.gif?​400 |}}
 +
 +<note tip>
 +Pentru un efect realistic, setați culoarea de ștergere a ecranului să fie acceași cu cea a ceții.
 +</​note>​
 +
 +===== Licuricii =====
 +
 +==== Construcție și randare ====
 +
 +Licuricii sunt reprezentați de sfere mici cu shader emisiv. Aceștia emit propria lor culoare fără a fi iluminați de alte surse de lumină, creând efectul de strălucire caracteristic. Culoarea emisivă este considerată valoare finală, fără calcule de iluminare Phong, și este apoi atenuată prin ceață pentru consistență cu restul scenei.
 +
 +==== Comportament și mișcare ====
 +
 +Licuricii se vor deplasa pe traiectorii orbitale fie în jurul camerei, fie în jurul turnului (alegeți voi varianta care vă place). Fiecare licurici va avea:
 +  * **Rază orbitală** – distanța față de centrul orbitei (camera sau turnul)
 +  * **Viteză unghiulară** – viteza de rotație pe orbită
 +  * **Fază inițială** – poziția de start pe cerc
 +  * **Oscilație verticală** – mișcare sinusoidală pe axa Y pentru un efect mai natural
 +
 +Traiectoria rezultată va fi o combinație între mișcarea circulară orizontală și oscilația verticală:
 +
 +\[
 +x = C_x + R \cdot \cos(\omega t + \phi) \\
 +z = C_z + R \cdot \sin(\omega t + \phi) \\
 +y = C_y + h_0 + A \cdot \sin(\omega_v t + \phi_v)
 +\]
 +
 +unde \((C_x, C_y, C_z)\) reprezintă poziția în jurul căreia licuricii orbitează, \(R\) este raza orbitală, și \(A\) este amplitudinea oscilației verticale.
 +
 +În GIF-ul următor este ilustrat un exemplu pentru randarea și comportamentul licuricilor
 +
 +{{ :​egc:​teme:​2025:​egc_2025_t3_fireflies.gif?​400 |}}
 +
 +===== Iluminare =====
 +
 +Iluminarea scenei se va implementa folosind 2 tipuri de surse de lumină: **punctiformă** și **spotlight**. Fiecare sursă de lumină va avea o culoare specifică care va influența calculele de iluminare.
 +
 +<​note>​Iluminarea trebuie să fie implementată folosind **modelul de shading Phong**, precum și **modelul de calcul al reflexiei luminii Phong**.</​note>​
 +
 +==== Lumini punctiforme (Licurici) ====
 +
 +Fiecare licurici va avea asociată o lumină punctiformă care va ilumina terenul și copacii din apropiere. Această lumină:
 +  * Se va deplasa odată cu licuriciul
 +  * Va avea culoare din nuanțe de galben-verde (caracteristic licuricilor)
 +  * Va avea intensitate variată pentru fiecare licurici
 +
 +{{ :​egc:​teme:​2025:​egc_2025_t3_point_lights.png?​400 |}}
 +
 +<note important>​
 +Implementarea voastră trebuie să suporte **randarea mai multor surse de lumină în același frame!**
 +</​note>​
 +
 +==== Lumini Spotlight ====
 +
 +Spotlight-urile emit lumină într-un con limitat, definit prin poziție, direcție și unghi de cutoff (\(\alpha\)). Un fragment este iluminat doar dacă se află în interiorul conului, iar intensitatea luminii scade gradual către margini. Implementarea luminii de tip spotlight se bazează pe cea pe care ați realizat-o în [[egc:​laboratoare:​08|Laboratorul 08]].
 +
 +==== Light Cookies (Gobo Lights) ====
 +
 +Light cookies sunt texturi proiectate prin conul de lumină al unui spotlight pentru a crea pattern-uri de umbră și lumină. ​
 +
 +În iluminatul fizic (teatru, cinematografie) există două concepte înrudite:
 +  * **[[https://​en.wikipedia.org/​wiki/​Gobo_(lighting)|Gobo]]** (termen provenit din "​**go**es **b**efore **o**ptics"​) – șablon metalic plasat în interiorul sau foarte aproape de sursa de lumină (produce margini clare, pattern-uri precise)
 +  * **Cookie** (termen provenit din [[https://​en.wikipedia.org/​wiki/​Cucoloris|cucoloris]]) – panou cu decupaje plasat mai departe de sursă (produce margini difuze, efecte mai naturale)
 +
 +În grafica pe calculator, cei doi termeni sunt folosiți interschimbabil – ambii se referă la aplicarea unei texturi (textură alpha sau RGB) asupra unei lumini pentru a modula intensitatea și/sau culoarea acesteia.
 +
 +Mai jos puteți observa câteva example de light cookies din diverse aplicații grafice.
 +
 +{{ :​egc:​teme:​2025:​egc_2025_t3_light_cookie_examples.png?​600 |}}
  
 ==== Proiecția unei texturi de tip light cookie folosind o lumină spotlight ==== ==== Proiecția unei texturi de tip light cookie folosind o lumină spotlight ====
Line 7: Line 250:
 În figura următoare puteți observa o diagramă ce prezintă notațiile necesare pentru a calcula proiecția texturii de tip light cookie. Reveniți la diagramă când este necesar pentru a face corespondența cu derivarea matematică prezentată în subsecțiunile ce urmează. În figura următoare puteți observa o diagramă ce prezintă notațiile necesare pentru a calcula proiecția texturii de tip light cookie. Reveniți la diagramă când este necesar pentru a face corespondența cu derivarea matematică prezentată în subsecțiunile ce urmează.
  
-{{ :​egc:​teme:​2025:​egc_2025_t3_light_cookie_spot.png?400 |}}+{{ :​egc:​teme:​2025:​egc_2025_t3_light_cookie_spot_2.png?400 |}} 
 + 
 +<note important>​ 
 +Calculele prezentate în continuare trebuie realizate toate în Fragment Shader! Ordinea de implementare pentru luminile spotlight este: 
 +  * Implementare iluminare spotlight "​clasică"​ (calcul bazat pe ''​cut_off'',​ ''​spot_light'',​ ''​spot_light_limit'',​ ''​light_att_factor''​ pentru a obține contribuția difuză și speculară a luminii - //​contribuția de bază//) 
 +  * Implementare efect light cookie 
 +  * Modularea //​contribuției de bază// cu rezultatul efectului de light cookie 
 +</​note>​
  
 Considerăm:​ Considerăm:​
Line 21: Line 271:
 === Sistemul de coordonate al spotlight-ului === === Sistemul de coordonate al spotlight-ului ===
  
-Pentru a putea exprima punctele în raport cu direcția spotului, definim un sistem local de coordonate al spotlight-ului,​ format din trei vectori ortogonali (//forward, right, up//), care definesc un sistem de coordonate ortonormat \((\hat{x}, \hat{y}, \hat{z})\). Axa \(\hat{z}\) (//​forward//​) este aliniată cu direcția luminii spotlight.+Pentru a putea exprima punctele în raport cu direcția spotului, definim un sistem local de coordonate al spotlight-ului,​ format din trei vectori ortogonali (//forward, right, up//), care definesc un sistem de coordonate ortonormat \((\hat{x}, \hat{y}, \hat{z})\).
  
 Direcția spotlight-ului este dată de vectorul \(\vec{d}_{light}\) (corespunzător variabilei ''​light_direction''​ din shader-ul laboratorului 8). Acest vector este considerat deja normalizat și definește axa \(\hat{z}\) (//​forward//​) a sistemului local de coordonate al spotlight-ului. Direcția spotlight-ului este dată de vectorul \(\vec{d}_{light}\) (corespunzător variabilei ''​light_direction''​ din shader-ul laboratorului 8). Acest vector este considerat deja normalizat și definește axa \(\hat{z}\) (//​forward//​) a sistemului local de coordonate al spotlight-ului.
Line 45: Line 295:
 \] \]
  
-Axa \(\hat{y}\) (//up//) este apoi determinată ca produs vectorial între două axe unitare ortogonale. În ipoteza în care \(\hat{x}\) și \(\hat{z}\) sunt vectori unitate:+Axa \(\hat{y}\) (//up//) este apoi determinată ca produs vectorial între două axe unitare ortogonale:
  
 \[ \[
Line 55: Line 305:
 === Punct în spațiul spotlight-ului === === Punct în spațiul spotlight-ului ===
  
-Pentru a exprima poziția punctului \(\vec{X}\) în sistemul local al spotlight-ului,​ proiectăm vectorul \(\vec{v}\) pe axele noului sistem de coordonate:+Pentru a exprima poziția punctului \(\vec{X}\) de coordonate \((x, y, z)\) în sistemul local al spotlight-ului,​ proiectăm vectorul \(\vec{v}\) pe axele noului sistem de coordonate:
  
 \[ \[
Line 63: Line 313:
 \] \]
  
-Valorile \((x, y, z)\) reprezintă coordonatele punctului \(\vec{X}\) în sistemul de coordonate al spotlight-ului. ​Coordonata \(z\) măsoară distanța punctului de-a lungul axei principale a spotului.+Coordonata \(z\) măsoară distanța punctului de-a lungul axei principale a spotului.
  
 === Proiecția pe planul de referință \(z = 1\) === === Proiecția pe planul de referință \(z = 1\) ===
Line 107: Line 357:
 === Maparea către coordonate de textură === === Maparea către coordonate de textură ===
  
-Coordonatele normalizate \(\vec{n}\) sunt în domeniul \([-1, 1]\). Texturile sunt adresate în domeniul \([0, 1]\), deci facem o mapare liniară:+Coordonatele normalizate \(\vec{n}\) sunt în domeniul \([-1, 1]\). Texturile sunt adresate în domeniul \([0, 1]\), așadar ​facem o mapare liniară:
  
 \[ \[
Line 120: Line 370:
  
 \[ \[
-\vec{c} = (c_rc_gc_b)+\vec{c} = (c_Rc_Gc_B)
 \] \]
  
Line 128: Line 378:
 c = texture2D(cookieTexture,​ vec2(u, v)).rgb c = texture2D(cookieTexture,​ vec2(u, v)).rgb
 </​code>​ </​code>​
 +
 +
 +==== Controlul spotlight-ului ====
 +
 +Spotlight-ul va putea fi controlat prin taste pentru a-i modifica poziția. Astfel, utilizatorul va putea:
 +  * Muta spotlight-ul pe axele X, Y, Z folosind taste dedicate
 +  * Schimba textura light cookie folosind o tastă
 +
 +===== Barem [150p] =====
 +
 +  * **Construcția scenei virtuale [65p]** ​
 +    * **Copacii [25p]**
 +      * Asamblarea componentelor (trunchi + straturi frunziș) [7.5p]
 +      * Deformarea frunzișului în Vertex Shader (efect vânt) [10p]
 +      * Texturarea copacilor [5p]
 +      * Plasarea a minim 5 copaci în scenă [2.5p]
 +    * **Terenul [10p]**
 +      * Desenarea terenului (plan) [2.5p]
 +      * Textuarea cu repetare [7.5p]
 +    * **Turnul de observație [10p]**
 +      * Asamblarea componentelor [5p] 
 +      * Texturarea componenetelor [5p]
 +    * **Licuricii [20p]**
 +      * Desenarea licuricilor cu un shader emisiv [10p]
 +      * Logica de mișcare a licuricilor (orbitare cu oscilație) [10p]
 +  * **Efectul de ceață [15p]**
 +    * Implementarea efectului de ceață pentru toate obiectele scenei în Fragment Shader [15p]
 +  * **Iluminarea [70p]**
 +    * **Lumini punctiforme (pentru licurici) [20p]**
 +      * Câte o lumină de culoare aleatorie pentru fiecare licurici [15p]
 +      * Deplasarea luminii odată cu licuriciul [5p]
 +    * **Lumini spotlight [50p]**
 +      * Implementarea a minim 2 lumini tip spotlight [10p]
 +      * Proiecția unei texturi folosind light cookies [35p]
 +      * Modificarea texturii de light cookie si a direcției luminilor pe taste [5p]
 +
 +===== Exemple de Funcționalități Bonus =====
 +
 +  * Rotația continuă a spotlight-ului în jurul turnului (similar unui far)
 +  * Mai multe spotlight-uri cu light cookie-uri diferite pentru fiecare
 +  * Efect de pulsație a intensității emisive și a luminii punctiforme pentru fiecare licurici
 +  * Efect Fresnel pentru licurici (strălucire accentuată la margini)
 +  * Generarea aleatoare a poziției și dimensiunii copacilor la fiecare rulare
 +  * Animație pentru light cookie (rotire, scalare sau tranziție între texturi)
 +  * Implementarea a unui model de ceață mai avansat (cu atenuare exponențială)
 +  * Variere aleatoare a culorii licuricilor (nuanțe diferite de galben-verde)
 +
 +===== Întrebări și răspunsuri =====
 +
 +Pentru întrebări vom folosi forumurile de pe Moodle. Orice nu este menționat în temă este la latitudinea fiecărui student!
 +
 +===== Notare =====
 +
 +Baremul este orientativ. Fiecare asistent are o anumită libertate în evaluarea temelor (de exemplu, să dea punctaj parțial pentru implementarea incompletă a unei funcționalități sau să scadă pentru hard coding). Același lucru este valabil atât pentru funcționalitățile obligatorii,​ cât și pentru bonusuri.
 +
 +<note warning>
 +Tema trebuie încărcată pe Moodle. Pentru a fi punctată, tema trebuie prezentată la laborator. Vor exista laboratoare speciale de prezentare a temelor (care vor fi anunțate).</​note>​
 +
 +===== Indicații suplimentare =====
 +
 +Tema va fi implementată în OpenGL și C++. Este indicat să folosiți framework-ul și Visual Studio.
 +
 +<​note>​Pentru implementarea temei, în folderul **src/​lab_m1** puteți crea un nou folder, de exemplu **Tema3**, cu fișierele **Tema3.cpp** și **Tema3.h** (pentru implementare POO, este indicat să aveți și alte fișiere). Pentru a vedea fișierele nou create în Visual Studio în Solution Explorer, apăsați click dreapta pe filtrul **lab_m1** și selectați **Add→New Filter**. După ce creați un nou filtru, de exemplu **Tema3**, dați click dreapta și selectați **Add→Existing Item**. Astfel adăugați toate fișierele din folderul nou creat. În fișierul **lab_list.h** trebuie adăugată și calea către header-ul temei. De exemplu: **#include "​lab_m1/​Tema3/​Tema3.h"​**</​note>​
 +
 +===== Arhivarea Proiectului =====
 +
 +<​note>​
 +  * În mod normal arhiva trebuie să conțină toate resursele necesare compilării și rulării
 +  * Înainte de a face arhiva asigurați-vă că ați curățat proiectul Visual Studio:
 +      * Click dreapta pe proiect în **Solution Explorer** -> **Clean Solution**
 +      * Ștergeți folderul __**/​build/​.vs**__ (dacă nu îl vedeți, **este posibil să fie ascuns**)
 +  * În cazul în care arhiva tot depășește limita de 50MB (nu ar trebui), puteți să ștergeți și folderul __**/​deps**__ sau __**/​assets**__ întrucât se pot adăuga la testare. Nu este recomandat să faceți acest lucru întrucât îngreunează mult testarea în cazul în care versiunea curentă a bibliotecilor/​resurselor diferă de versiunea utilizată la momentul scrierii temei.
 +</​note>​
  
 </​hidden>​ </​hidden>​
egc/teme/2025/03.1765622266.txt.gz · Last modified: 2025/12/13 12:37 by andrei.lapusteanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0