In questo articolo parleremo della
gestione dei danni sul personaggio. In un gioco delle dimensioni di
OF:DR è necessario valutare attentamente il numero di draw call.
Sin dall’inizio si è scelto di avere la possibilità di danneggiare gravemente ogni personaggio in gioco, causandogli la perdita di un arto (un braccio, una gamba, ecc.).
Capiamo facilmente che questo aumenterebbe vertiginosamente il numero di draw call, poiché dovremmo spezzettare il personaggio in tante parti, in modo da poterle poi nascondere o rimuovere, sostituendole con una mesh che mostri il danno (muscoli, ossa e tutto quanto di bello si cela all’interno di noi).
Questa soluzione non è percorribile, quindi si e’ scelto di accettare un compromesso: la parte tagliata/rimossa non sarà più visibile, il che significa che se un personaggio perderà un braccio, tale braccio scomparirà.
È una scelta che, con un modesto impatto visivo, ricompensa con la possibilità di poter avere una grossa quantità di personaggi a schermo, anche tutti danneggiati, senza avere un significativo aumento delle draw call.
Per poter ottenere questo risultato, si è scelto di dividere il personaggio in tante parti, una per ogni pezzo di corpo che desideriamo poter togliere. Queste parti di corpo saranno in realtà dei frammenti di index buffer, funzionanti in questo modo:
Frammento 0 : da indice 0 a indice 50
Frammento 1 : da indice 51 a indice 200
…e così via. Per ottenere tali frammenti, si è scelto di avvalersi di una soluzione ibrida che utilizzi 3dsmax con un tool interno.
Con 3dsmax, tramite un
multimaterial, si identificano tutte le parti interessate:
La medesima cosa verrà fatta con la mesh dei danni, che andrà a sostituire il pezzo che viene tolto. Sarà premura del grafico fare in modo che i bordi siano perfettamente coincidenti.

Il file esportato da Max avrà quindi effettivamente un nodo per ogni segmento, che è proprio quello che non vogliamo. Quindi, e’ necessario sviluppare un tool che sia capace di fare questo:
• caricare la mesh.
• prendere tutti i nodi e costruire una unica mesh con tutti i suoi vertici. generando un corretto vertex ed index buffer.
• salvare su un file in numero degli indici che identificano l’inizio e la fine di ogni segmento all’interno della mesh finale composta da un solo nodo.
Ora abbiamo quello che vogliamo: una mesh composta da un solo nodo, di cui abbiamo tutti i riferimenti all’index buffer.
In pratica, se saltiamo un segmento di index buffer, avremo un pezzo mancante dal corpo. Se al suo posto ci mettiamo il pezzo corrispondente di danno, ecco che abbiamo un corpo danneggiabile:

La sequenza per il rendering sarebbe quindi:
• disegnare il personaggio dal primo indice dell’index buffer fino a quello che inizia la parte che si vuole danneggiare.
• disegnare il personaggio dall’indice successivo alla parte che si vuole danneggiare fino alla fine.
• disegnare solamente il pezzetto interessato della mesh del danno.
Ovviamente se volessimo avere più di una parte danneggiata, dovremmo aumentare il numero di draw call, riducendo l’efficacia del sistema.
Con questo articolo termino la parte riguardante la preparazione dei dati: se doveste avere delle domande, fatelemele pure nei commenti e risponderò nel prossimo articolo, che tratterà delle scelte in fase di caricamento dei dati.
Nel frattempo
Operation Flashpoint: Dragon Rising è uscito nei negozi: spero che vi stia piacendo e di incontrarvi online per fare un po’ di guerra (ma sempre nel nome dell’amore).