Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
be quiet! debutta nel settore mouse da gaming con Dark Perk Ergo e Dark Perk Sym: due modelli gemelli per specifiche, con polling rate di 8.000 Hz anche in wireless, sensore PixArt PAW3950 da 32.000 DPI e autonomia dichiarata fino a 110 ore. Nel test, a 8.000 Hz si arriva a circa 30 ore reali, con ricarica completa in un'ora e mezza
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
Analizziamo nel dettaglio DJI RS 5, l'ultimo arrivato della famiglia Ronin progettato per videomaker solisti e piccoli studi. Tra tracciamento intelligente migliorato e ricarica ultra rapida, scopriamo come questo gimbal eleva la qualità delle produzioni.
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D è la nuova CPU gaming di riferimento grazie alla 3D V-Cache di seconda generazione e frequenze fino a 5,6 GHz. Nei test offre prestazioni superiori a 9800X3D e 7800X3D, confermando la leadership AMD nel gaming su PC.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-10-2009, 16:07   #1
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
[Vari/C++/lowlevel] Bitwise Operations e Bitmasks, non ci capisco una ceppa!

Salve,
ho bisogno di creare uno sparo che colpisca tutto tranne i soldati del mio team.
In concreto, uso PhysX e questo si può fare assegnando ad ogni Forma una Mask/Group, e quindi filtrando questi ShapeGroup tramite una bitwise Mask apposita.

La Shape Mask è definita come unsigned short e va da 0 a 31;
la bitwise mask è un unsigned int.

In teoria, ogni team ha una specifica Shape Mask; quindi lancio un Ray che attraversa la scena, configurato per escludere tutte le mask diverse da quelle del mio team.

In pratica essendo completamente a digiuno di operazioni bitwise, non ho idea di come creare un raggio che colpisca tutti i gruppi (0, 30) ma non quello del mio team (31) e viceversa per il nemico (0,31)(30)

Per ora usavo la maschera ottenuta dal codice (trovato in giro):
Codice:
unsigned short teamMask = 0x1f; //31
unsigned int mask = ~(1<< teamMask );
Tuttavia qualsiasi sia teamMask questo mi ritorna 65535... per cui (anche se ignoro il motivo) viene ignorato tutto escluso il gruppo (0).

Mi serve l'aiuto di qualche lowlevel pro
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2009, 18:48   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Ciao Tommo,
se la mask di un Ray deve "escludere" tutte le mask diverse dal tuo team, significa che, viceversa, deve "includere" solo la mask del tuo team.

Se il ragionamento è corretto presumo che l'operazione che avviene tra la ray_mask e tutte le group_mask intersecate dal ray sia un semplice & (AND) tra la group_mask da testare e il valore della ray_mask negata (NOT ~).
Se il risultato di questa operazione è diverso da zero (almeno un bit è rimasto a 1) allora la group_mask testata è "esclusa" (cioè colpita dal ray).
Codice:
// per ogni team_mask intersecata dal Ray
result_mask = team_mask & (~ray_mask);
if (result_mask != 0) {
    // colpito-escluso
}
Con questa operazione esiste una sola group_mask che risulterebbe "esclusa" (cioè non colpita): la grop_mask di valore uguale alla ray_mask

Per rendere la cosa un attimo più visiva:
Codice:
myteam_mask = [1][1][1][1][1][1] // vale 31
myray_mask = [1][1][1][1][1][1]

~myray_mask -->[0][0][0][0][0][0]

myteam_mask & (~myray_mask) --> [1][1][1][1][1][1] & [0][0][0][0][0][0] --> 0
Tutti i falg a zero, cioè "non colpito".
Qualsiasi altra mask produrrebbe almeno un flag di vlaore 1, "cioè colpito".
Spero di non aver capito male
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 22-10-2009 alle 13:17.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2009, 15:23   #3
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Allora,
intanto grazie per la risposta

la cosa è molto contorta e le evidenze sperimentali ancora di più
-le mask numero pari non trovano il gruppo 0.
-la maschera che passi dice cosa NON toccare, cioè se mask & shapeMask != 0 allora non viene visto.

Ad esempio assegnando al p1 e al p2 i numeri 1 e 3, si ha che ray( ..., 1 & 3,... ) ignora tutto tranne il suolo.

Siam riusciti ad ottenere quello che serve (cioè che lo sparo colpisce 0 e gruppo_nemico) usando l'arcana formula
~(1<<teamGroup)

Comunque non ne vedo ancora il verso

PS: sapendo questo, come faccio a creare una mask che vede unicamente 0?
Teoricamente sarebbe NOT 0 ma praticamente non va
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 22-10-2009 alle 15:26.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 13:02   #4
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Premessa: quando hai a che fare con bitmask, non pensare tanto ai valori dei numeri quanto ai bit che sono a 1.

Non conosco Physix, ma il fatto che la shape mask abbia valori solo tra 0 e 31 mi fa supporre che funzioni nel modo seguente:

Al numero di shape mask N viene associata la bitmask ( 1 << N ) (ovvero l'N-esimo bit a 1)

Se tu vuoi una mask che non abbia dentro il gruppo 30, devi mettere a uno tutti i bit tranne il 30-esimo, come spiegato nel post precedente.

Poi sei stato un po' avaro di dettagli, ma faro' le seguenti ipotesi:

* Le bitmask di solito di costruiscono con un | non con un &.
* Tipicamente le bitmask indicano quel che si vuole tenere, non togliere
* Devi shiftare tu opportunamente i bit per fare la maschera (ovvero gruppo 0 -> (1<<0) == 1 )

Se non e' cosi' devi adattare la spiegazione che segue.

Se voglio una maschera che tenga i gruppi 1 e 3, allora devo fare ( 1<<1 ) | (1 << 3)
ovvero 0010 | 1000 == 1010

In quest'ottica i tuoi dubbi si spiegano facilmente

Quote:
Originariamente inviato da Tommo Guarda i messaggi
-le mask numero pari non trovano il gruppo 0.
Una mask "numero pari", non e' altro che un maschera con l'ultimo bit a zero, ovvero una che non fara' mai passare il bit piu' basso. Quindi sia che tu usi 0 che (1<<0) il gruppo non passera' mai, perche' in OR con la bitmask dara' sempre zero.

Quote:
-la maschera che passi dice cosa NON toccare, cioè se mask & shapeMask != 0 allora non viene visto.

Ad esempio assegnando al p1 e al p2 i numeri 1 e 3, si ha che ray( ..., 1 & 3,... ) ignora tutto tranne il suolo.
1 & 3 equivale a 0001 & 0011 che da 1. Se tu vuoi che vengano visti i gruppi 1 e 3 devi probabilmente settare gli N-esimi bit a 1, che e' un po' diverso, e farlo con un or, ovvero

0001 | 0100 = 0101

ray( ..., (1<<0) | (1<<2),... )


Quote:
Siam riusciti ad ottenere quello che serve (cioè che lo sparo colpisce 0 e gruppo_nemico) usando l'arcana formula
~(1<<teamGroup)
Niente di arcano. supponendo che teamGroup sia 3, con la formula sopra qui ottieni
~ (1 << 3) == ~(00001000) == (11110111)
Ovvero tutto (anche lo zero, nell'ipotesi che sia 1<<0 ) tranne il tuo team.

Quote:
PS: sapendo questo, come faccio a creare una mask che vede unicamente 0?
Teoricamente sarebbe NOT 0 ma praticamente non va
~0 piglia tutto.
In teoria dovrebbe essere semplicemente 1.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 13:38   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Ciao marco.r,
scusa ma all'inizio (cioè prima di postare una risp a Tommo) pensavo anch'io esattamente la stessa cosa che hai spiegato.
C'è solo un dettaglio che non mi torna:
Quote:
Originariamente inviato da Tommo
La Shape Mask è definita come unsigned short e va da 0 a 31;
la bitwise mask è un unsigned int.
e, considerato C++ come linguaggio:
Codice:
An unsigned short can hold all the values between 0 and  USHRT_MAX inclusive. USHRT_MAX must be at least 65535.

The short types must contain at least 16 bits to hold the required range of values.
Quindi se la maschera dei gruppi è definita come unsigned short (e il range di valori logici accettati sono compresi inclusivamente tra 0 e 31) vedo un problema nell'avere un 31esimo bit settato nel caso del gruppo 31, dato che quelli garantiti come minimo sono 16... forse non mi è chiaro qualcosa?


Quote:
Originariamente inviato da marco.r
Poi sei stato un po' avaro di dettagli, ma faro' le seguenti ipotesi:
Sì, è un maledetto
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 23-10-2009 alle 13:40.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 13:54   #6
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Quindi se la maschera dei gruppi è definita come unsigned short (e il range di valori logici accettati sono compresi inclusivamente tra 0 e 31) vedo un problema nell'avere un 31esimo bit settato nel caso del gruppo 31, dato che quelli garantiti come minimo sono 16... forse non mi è chiaro qualcosa?
Non ha detto se e' definito come un unsigned int in generale o sulla sua piattaforma. Nel secondo caso tornerebbe tutto, anche perche' su piattaforme 32/64 bit gli interi sono a 32 bit, cosi' come, se non ricordo male, in CUDA.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 13:57   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Non ha detto se e' definito come un unsigned int in generale o sulla sua piattaforma.
Non ci avevo pensato ma avevo immaginato che fosse il tipo documentato come input dalla libreria.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 14:10   #8
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Ha completamente ragione marco.r

Cmq siamo riusciti a risolvere portando finalmente tutto terra terra
E' vero, la bitmask indica quello che si vuole tenere, ed ad esempio

ray( 1<<gruppo ) vede solo quel gruppo.
1<<0 vede solo il terreno, 1<<1 solo il player 1 etc... combinandoli ed invertendoli vien fuori tutto quello che serve

lo sparo è quindi risolto come ray( ~(1<<myTeam ) ).

Grazie dell'aiuto

PS: la bitmask era NxU32, cioè unsigned int 32 su tutte le piattaforme... scusate se era ambiguo!
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
HP e lavoro ibrido: le nuove cuffie Poly...
MSI sta lavorando a un dissipatore ottim...
27 offerte Amazon, le prime 5 in elenco ...
Il telescopio spaziale James Webb ha cre...
Il reboot di Painkiller tenta il rilanci...
7 smartphone in super offerta su Amazon,...
Ring abbassa i prezzi su Amazon: videoci...
Blink taglia i prezzi su Amazon: Mini 2K...
Claude al centro di Apple: ecco come Cup...
Pornhub e altri siti porno si ribellano ...
La TV non è smart? Amazon la trasforma c...
Oltre 200 siti di news hanno limitato l'...
Gennaio si chiude positivamente per il m...
Caos in Ubisoft: licenziato un dipendent...
BMW ed Encory avviano il riciclo diretto...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:30.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v