Git Product home page Git Product logo

Comments (3)

UserAB1236872 avatar UserAB1236872 commented on August 15, 2024

An alternate implementation is to introduce a type Vecf []float32. Swizzle operators would return a Vecf of the correct len (but always with a cap of 4). To use these values as actual vectors, you'd have to call an As method,

func (v Vecf) AsVec2() Vec2f {
    v = v[:2] // Slice to right length
    return Vec2f{v[0], v[1]}
}

Swizzles on Vecf types would always return the correct array:

func (v Vecf) XYY() Vec3f {
   v = v[:4]
   return Vec3f{v[0], v[1], v[1]}
}

This is analogous to glm swizzle operators returning reference types that need to be cast to be used.

Personally, I like the array method better, but I can't deny that the slice method has some nice properties. It also makes Set methods able to increase the size of vectors, which is impossible with the above method without introducing some idiosyncratic copying semantics. Above if I wanted

func (vec *Vec2f) SetXYZ(src Vec3f)

I really don't have anywhere to go. Either the information from the "Z" will be lost, or it will return a totally new Vec3 and won't set the method receiver at all, OR it will return the new Vec3 AND set the receiver. None of these are intuitive.

Alternatively, we could introduce the Vecf type, but only use it when size promotion is required.

from mathgl.

UserAB1236872 avatar UserAB1236872 commented on August 15, 2024

I've decided to not implement swizzle functions for now. They just pollute the namespace too much. If someone really needs to reorder or downslice a Vec3 in a certain way, it's not difficult to write the function themselves. I see no reason to apply code gen for a bunch of inane functions like vec.WYZY()

I will, however, provide aliases for direct element access vec.X() vec.Y() as aliases for vec[0], vec[1], etc. This is already done for the Quat type. My benchmarks show that access in this way is about the same speed as direct array access (Go probably inlines it). I'm only going to provide XYZW style, not RST(U?) or RGBA.

from mathgl.

dmitshur avatar dmitshur commented on August 15, 2024

Sounds good.

from mathgl.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.