Hi, I'm just getting to know D and so am hoping that someone more experienced with the language could review this 3d vector struct and my comments below. I'm planning on building a little ray tracer in the next week or so :)

struct Vector3d {
        double x = 0, y = 0, z = 0;

        void normalize() {
                double scale = 1.0 / (x * x + y * y + z * z);
                x *= scale; y *= scale; z *= scale;
        }
        double dot(in Vector3d other) inout {
                return x * other.x + y * other.y + z * other.z;
        }
        Vector3d cross(in Vector3d other) inout {
                const Vector3d result = {
                        y * other.z - z * other.y,
                        z * other.x - x * other.z,
                        x * other.y - y * other.x
                };
                return result;
        }
}

1) I initialize the vector to a null vector, not nans
2) The dot and cross are "inout" methods, i.e. available for mutable, const, and immutable objects. There is no reason to declare "inout" methods as being "const". 3) The dot and cross methods take an input "in" argument. This allows the compiler to choose between passing the parameter by const value or const reference. I read somewhere that "in" and "scope" have not yet been implemented yet and that I should use "const ref" instead? 4) Is it advisable for the cross method to return by value? In C++, I would declare this method as inline and in a header file. Can I trust D to inline away this inefficiency? Perhaps I should pass in the result as a "ref" or "out" parameter (although I don't require the vector to be initialized here)? Is there a more efficient way to do this? 5) I notice that a lot of other people online prefer using fixed arrays not structs for Vectors in D, why?
6) Any other comments or suggestions?

Reply via email to