dados-primitivos

Description

Dados primitivos (pdata para diminuir) é o nome fluxus' para dados que formam primitivas. Em primitivas poligonais isto significa informação dos vértices, em primitivas de partículas isto corresponde a informação da partícula, em primitivas NURBS são os vértices de controle. Acesso a pdata dá a você a habilidade de usar primitivas que de outra forma não seria tão interessante, e deformar e fazer outras primitivas resultando em modelos muito mais detalhados e animações. Você pode também adicionar sua própria pdata, que é tratado exatamente como os tipos já existentes. Dados primitivos são nomeados por strings de tipo, os nomes de qual depende a ordem da primitiva. Todos os comandos Pdata operam na primitiva atualmente pega [grabbed].

Example

 ; uma função para deformar os pontos de um objeto
 (define (deform n)
     (pdata-set! "p" n (vadd  (pdata-ref "p" n)                ; o ponto original, mais
         (vmul (vector (flxrnd) (flxrnd) (flxrnd)) 0.1)))     ; um pequeno vetor randomico
     (if (zero? n)
         0
         (deform (- n 1))))
     
 (hint-unlit) ; ajustar algumas opções de render
 (hint-wire)  ; para fazer as coisas mais fáceis de ver
 (line-width 4)
 (define myobj (build-sphere 10 10)) ; fazer uma esfera
 (grab myobj)
 (deform (pdata-size)) ; deformá-la
 (ungrab)

(pdata-ref string-tipo número-index)

Returns vetor-valor/cor/matriz/número

Retorna o elemento pdata correspondente.

Example

 (pdata-ref "p" 1)

(pdata-set! string-tipo número-index vetor-valor/cor/matriz/número)

Returns void

Escreve ao elemento pdata correspondente.

Example

 (pdata-set! "p" 1 (vector 0 100 0))

(pdata-add string-tipo nome-string)

Returns void

Adiciona um novo usuario de disposição ao pdata. Tipo é um dos sequintes "v":vector, "c":colour, "f":float ou "m":matrix.

Example

 (pdata-add "v" "mydata")
 (pdata-set "mydata" 0 (vector 1 2 3))

(pdata-op string-nomefunc string-nomepdata operador)

Returns void

Esta é uma função experimental que permite a você fazer operações na pdata muito rapidamente, para constar adicionar elemento por elemento de uma array de pdata para outra. Você pode implementar isto em scheme como um loop sobre cada elemento, mas isto é devagar já que o interpretador está fazendo todo o trabalho. É muito mais rápido se você puder usar um pdata-op já que a mesma operação vai ser apenas uma chamada à scheme.

Example

 (clear)
 (define t (build-torus 1 4 10 10))
 
 (with-primitive t
     (pdata-op "+" "p" (vector 1 0 0))  ; add a vector to all the pdata vectors
     (pdata-op "+" "p" "n")  ; add two pdata vectors element for element
     (pdata-op "*" "n" (vector -1 -1 -1)) ;  multiply a vector to all the pdata vectors
     (pdata-op "*" "n" "p")  ; multiply two pdata vectors element for element
     (let ((pos (pdata-op "closest" "p" (vector 100 0 0)))) ;  returns position of the closest vertex to this point
         (with-state ; draw a sphere there
             (translate pos)
             (scale (vector 0.1 0.1 0.1))
             (build-sphere 5 5)))
     ; can't think of a good example for these...
     ;(pdata-op "sin" "mydata" "myotherdata")  ; sine of one float pdata to another
     ;(pdata-op "cos" "mydata" "myotherdata")  ; cosine of one float pdata to another
     )
 
 ; most common example of pdata op is for particles
 (define p (with-state
     (hint-points)
     (point-width 10)
     (build-particles 100)))
 
 (with-primitive p
     (pdata-add "vel" "v") ; add a velocity vector
     (pdata-map!
         (lambda (vel)
             (srndvec)) ; set random velocities
         "vel")
     (pdata-map!
         (lambda (c)
             (rndvec)) ; set random colours
         "c"))
 
 (every-frame (with-primitive p
     (pdata-op "+" "p" "vel")))

(pdata-copy string-pdata-de string-pdata-para)

Returns void

Copia o conteúdo de uma array pdata para outra. As arrays tem que ser do mesmo tipo.

Example

 (pdata-copy "p" "mydata") ; copia as posições de vértices para uma array do usuário

(pdata-size)

Returns número-contador

Retorna o tamanho das arrays pdata (elas precisam ser todas a mesma). Isto é principal para iterar através das arrays.

Example

 (define (mashup n)
     (pdata-set "p" n (vector (flxrnd) (flxrnd) (flxrnd))) ; randomise the vertex position
     (if (zero? n)
         0
         (mashup (- n 1)))) ; loops till n is 0

 (define shape (build-sphere 10 10))
 (grab shape)
 (mashup (pdata-size)) ; randomise verts on currently grabbed primitive
 (ungrab)

(finalise)

Returns void

Não faz nada mais, precisa ser removido :)

Example


(recalc-normals número-macioounão)

Returns void

Para primitivas poligonais apenas. Olha a posição dos vértices e cálcula as normais da luz pra você automaticamente. Chame com "1" para normais macias, "0" para normais facetadas.

Example

 (define shape (build-sphere 10 10)) ; build a sphere (which is smooth by default)
 (grab shape)
 (recalc-normals 0) ; make the sphere faceted
 (ungrab)