[c++]objecten met een onbekend aantal functies aansturen

Pagina: 1
Acties:

  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
okay, ik ben al sedert enige tijd bezig met een vj-tool achtig iets, puur voor de lol. dit programma genereert realtime 3d-beelden die in de toekomst reageren op de muziek. ondertussen ben ik zo ver dat ik allerlei vormen op mijn scherm kan toveren, die in verschillende matrices kan zetten, er controllers op kan zetten en nog wat andere geinige dingen doen, zonder de boel te laten crashen. de engine is dus al behoorlijk gevorderd en het word tijd om de gui in elkaar te zetten. hier volgt een probleem waar ik al een tijd mee worstel in mijn hoofd.

het komt erop neer dat ik mn prog zo flexibel mogelijk wil houden. daarnaast moet het makkelijk blijven om nieuwe generatoren, effecten etc etc toe te blijven voegen. hier volgt het probleem: ik kan nu nog niet voorspellen welke en hoeveel parameters die nieuwe dingen zullen hebben. voorbeeldje: bij mijn cirkel generator kun je alleen de radius instellen, maar bij mijn atoom generator kun je aantallen elektronen, bewegingspatronen, cirkelradiussen en nog veel meer instellen. toch wil ik al die parameters op een envoudige manier allemaal via dezelfde gui willen aansturen.

ik heb de volgende oplossing bedacht: iedere generator krijgt een ReturnInterface-methode. deze methode retourneert een object met een vector. deze bevat vector voor iedere parameter de volgende gegevens:
- een pointer naar de methode waarmee de parameter in te stellen is (een pointer naar SetRadius of SetElectronCount bijv)
- wat voor type heeft de parameter? is het een float of of een integer of een string? (lijkt me dat dit met een enum gedaan moet worden)
- de minimale, de maximale, de standaard en de huidige waarde voor de parameter

is dit een goed idee of moet ik het over een heel andere boeg gooien? ik heb totnutoe alleen nog maar over het probleem gefilosofeerd en nog niks geimplementeert dus als het een slecht idee is, is het nu nog niet te laat ;)

dan is er nog een laatste implementatie kwestie... laat ik mn dialoogschermen zelf direct met de pointers naar de functies werken of doe ik er nog een laag tussen in het object wat ik hiervoor beschreef? het voordeel van het laatste is dat je minder kans hebt op segmentation errors lijkt mij. aan de andere kant als je het goed doet zou je die moeten kunnen uitsluiten en ik denk dat de eerste methode een stuk sneller is.

en aangezien ik toch al zo'n lange lap tekst heb getikt nog een laatste vraag: hoe moeilijk is dit proces te automatiseren? niet dat het echt moeilijk is om voor alles zo'n ReturnInterface-methode te schrijven maar misschien dat met een template oid het automatisch te doen is?

anyway, bedankt voor het lezen van deze lange lap tekst _/-\o_

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
st0p schreef op dinsdag 05 juli 2005 @ 14:07:
okay, ik ben al sedert enige tijd bezig met een vj-tool achtig iets, puur voor de lol. dit programma genereert realtime 3d-beelden die in de toekomst reageren op de muziek. ondertussen ben ik zo ver dat ik allerlei vormen op mijn scherm kan toveren, die in verschillende matrices kan zetten, er controllers op kan zetten en nog wat andere geinige dingen doen, zonder de boel te laten crashen. de engine is dus al behoorlijk gevorderd en het word tijd om de gui in elkaar te zetten. hier volgt een probleem waar ik al een tijd mee worstel in mijn hoofd.

het komt erop neer dat ik mn prog zo flexibel mogelijk wil houden. daarnaast moet het makkelijk blijven om nieuwe generatoren, effecten etc etc toe te blijven voegen. hier volgt het probleem: ik kan nu nog niet voorspellen welke en hoeveel parameters die nieuwe dingen zullen hebben. voorbeeldje: bij mijn cirkel generator kun je alleen de radius instellen, maar bij mijn atoom generator kun je aantallen elektronen, bewegingspatronen, cirkelradiussen en nog veel meer instellen. toch wil ik al die parameters op een envoudige manier allemaal via dezelfde gui willen aansturen.
Klassiek Pattern, als ik het zo hoor. Het lijkt me Visitor.
ik heb de volgende oplossing bedacht: iedere generator krijgt een ReturnInterface-methode. deze methode retourneert een object met een vector. deze bevat vector voor iedere parameter de volgende gegevens:
- een pointer naar de methode waarmee de parameter in te stellen is (een pointer naar SetRadius of SetElectronCount bijv)
- wat voor type heeft de parameter? is het een float of of een integer of een string? (lijkt me dat dit met een enum gedaan moet worden)
- de minimale, de maximale, de standaard en de huidige waarde voor de parameter

is dit een goed idee of moet ik het over een heel andere boeg gooien?
Ik denk dat je te veel op details bezig bent, en in elk geval ons niet vertelt waar je op hoofdlijnen mee bezig bent. Waar komen die parameters vandaan? File? GUI? Registry? Een abstracte parameter bron? XML?

Om het in XML termen uit te drukken: een generator zou een XSD kunnen hebben, en als input een XML file met dat XSD accepteren. Is dat een betere oplossing? Geen idee.
dan is er nog een laatste implementatie kwestie... laat ik mn dialoogschermn zelf direct met de pointers naar de functies werken of doe ik er nog een laag tussen in het object wat ik hiervoor beschreef? het voordeel van het laatste is dat je minder kans hebt op segmentation errors lijkt mij. aan de andere kant als je het goed doet zou je die moeten kunnen uitsluiten en ik denk dat de eerste methode een stuk sneller is.
Het lijkt me dat je communiceert via 1 vrij platte struct met simpele parameters. Elke generator definieert zo'n class, afgeleid van een common base class ParameterSet. Elke dialoog kan zo'n class invullen. Je gebruikt een dynamic_cast om te checken dat je het goede type krijgt. Heeft een dialoog de verkeerde ParamSet afgeleide ingevuld, dan faalt de dynamic_cast en is er niks aan de hand.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 05-05 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik zou sowieso niet met functionpointers werken, daarvoor heb je namelijk het type nodig van het object waar de functie op werkt, en die heb je niet aangezien ze (neem ik aan) een interface extenden :)

Ik zou een parameterdefinitie maken en die opvraagbaar maken op het object, of "de class" van het object (objecten van hetzelfde typen hebben dezelfde parameters, dus je wilt waarschijnlijk een soort van factory class willen maken die die objecten kan instantieren, daar kun je dan eveneens die parameterdefinitie in stoppen).

Misschien moet je eens naar buzz kijken, een muziekprogramma gebaseerd op het oude tracker idee wat aan elkaar hangt van 3rd party plugins. Feitelijk geef je bij het laden van de plugin op of je machine tracks ondersteunt, en hoeveel en wat voor parameters je (evt. per track) ondersteunt.

(Misschien moet je gewoon visualisatieplugins voor buzz gaan maken? Heb je de GUI al, en dat is goed te combineren met muziek ;))

[ Voor 32% gewijzigd door .oisyn op 05-07-2005 14:45 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • staefke
  • Registratie: December 2003
  • Laatst online: 18-02 08:01
kun je die parameters niet makkelijk in een map<string, parameter> gooien die je in je interface opneemt ?
Kun je meteen als je je GUI wilt opbouwen aan de betreffende generator alle items uit die map opvragen (door over alle it->first te itereren) en krijg je de naam van de parameter terug.

Het daadwerkelijke (parameter) type dat je dan daarin gooit (floats, string, ints, of whatever) zou je nog kunnen wrappen in een class, waarin je dan ook nog ruimte opneemt om bijvoorbeeld type informatie op te slaan, zodat je voor verschillende types data verschillende controls kunt aanmaken (comboboxes, sliders, colorpickers) of een beschrijving die ook in de GUI getoond wordt. Als je het 'quick n dirty' wil doen kun je ook nog de boost::any library gebruiken, en dan any_cast'en tot je het juiste type hebt, maar das niet mijn favoriet...

Voor de daadwerkelijke berekening sync je de parameters uit je map met je normale attributen/member variabelen/[hoe je het wilt noemen] en ga je op de normale manier weer aan de slag.

duh ?


  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
okay, ik ben blij dat ik hier mijn probleem gepost heb en dat het afgeschoten is... dat tik ik zonder sarcasme, maar ik had al ergens een gevoel dat het niet okay was....

@ MSalters: tja patterns... ik hoor er veel over, maar voor ik me daarin ga verdiepen wil ik toch echt eerst de basis van c++ helemaal begrijpen. one step at a time.

wat betreft je vraag omtrent de parameters, ik volg je niet helemaal... de parameters zijn gewoon properties van mijn generatoren. op dit moment zijn ze gewoon opgenomen in mijn klassedefinitie en worden ze geinitialiseerd in de ctor. hoewel ik de de xml/xsd suggestie zeer interessant vind, denk ik dat dat iets voor later is.

dynamic cast is een term die ik voorbij heb zien komen, maar op dit moment nog niet exact weet wat het is en ook nog niet gebruikt heb. ik zal thuis mijn boeken eens induiken. begrijp ik trouwens goed dat je hier impliceert dat je ipv een object wat naar alle parameters verwijst, je telkens een nieuw object/struct aanmaakt als er een wijziging is? dat is natuurlijk ook een optie (waar ik nog niet eerder op gekomen was).

@ oisyn: grappig dat je buzz noemt. dat is namelijk een van de inspiratiebronnen voor dit project (alleen dan met een tikkeltje vriendelijker interface en hopelijk niet zo extreem buggy ;) ) ik heb overigens nooit iets voor buzz geschreven ofzo, dus hoe dit probleem daar opgelost is weet ik niet.

@ staefke: dank voor de interessante tips. zeker die van de verschillende interface elementen is een erg bruikbare (dat ik daar zelf niet opgekomen ben 8)7 )

ik merk dat ik het lastig vind om echt inhoudelijk op alle reacties iets te zeggen. het is voor mij allemaal nieuw en ik wist helemaal niet hoe ik dit aan moest pakken. langzaamaan gaat er wel iets van een beeld ontstaan maar ik vermoed dat ik maar gewoon aan de slag moet gaan vanavond en experimenteren tot ik er dood bij neerval. 't zal dan uiteindelijk wel code opleveren die niet super is maar het is een leerproces, nietwaar?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 05-05 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Even enorm offtopic
st0p schreef op woensdag 06 juli 2005 @ 15:58:
@ oisyn: grappig dat je buzz noemt. dat is namelijk een van de inspiratiebronnen voor dit project (alleen dan met een tikkeltje vriendelijker interface en hopelijk niet zo extreem buggy ;) ) ik heb overigens nooit iets voor buzz geschreven ofzo, dus hoe dit probleem daar opgelost is weet ik niet.
Klopt, ik vind het idee van buzz geniaal, de uitwerking is echter bagger (hmmm waar ik heb ik dat eerder gehoord... :P). Ik ben zelf van plan met een buzz clone te beginnen nadat we klaar zijn met het klussen en inrichten van ons huis, als ik dus weer een beetje tijd heb om te hobby'en. Ik wil het dan ook iets uitgebreider aanpakken. In buzz is een machine gewoon iets dat een of twee kanalen geluid produceert, en evt. een of twee kanalen geluid als input heeft, met parameters die elke tick doorgevoerd worden. Dat limiteert nogal, je kunt niet iets maken dat een geluidsstream moduleert met een andere geluidsstream bijvoorbeeld, daarnaast is het editen van parameters een ramp. Als je aan elke parameter ook een parameterstream kunt binden, kun je bijvoorbeeld met standaard LFO's e.d. al hele leuke dingen doen ipv met de hand een beetje een sinusgolf in een tracker in gaan zitten tikken. Meer het Propellerhead's Reason idee dus, waar een "machine" gewoon tal van in- en outputs heeft, maar dan nog meer modulair.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
.oisyn schreef op woensdag 06 juli 2005 @ 16:12:
Klopt, ik vind het idee van buzz geniaal, de uitwerking is echter bagger (hmmm waar ik heb ik dat eerder gehoord... :P).
om even offtopic te blijven: ik ben het helemaal met je eens maar om de een of andere vage reden blijf ik erbij terug komen. ik heb programma's met eenzelfde opzet als aero en psycle gebruikt. ik heb een tracker met vst(i) ondersteuning gebruikt (kan ff niet op de naam komen). en toch start ik als ik muziek wil maken buzz op. Mav van de scientific crew gebruikt trouwens alleen maar buzz voor zn produkties en heeft ondertussen releases op meerdere labels gehad, dus het is zelfs mogelijk om professionel klinkende shit ermee te maken...

heb je trouwens al wel eens naar buzzle gekeken? ontwikkeling ervan duurt al eeuwen maar het ziet er veelbelovend uit.

en last but not least (maar nog steeds offtopic ;) ): mocht je betatesters nodig hebben voor je project, dan moet je maar ff mailen naar frankdeweger (at) gmail (dot) com
Pagina: 1