• Advertisement
Sign in to follow this  

angelscript value type registration

This topic is 1879 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm having a problem registering my vector class by value, in the current svn version of angelscript.

 

here is the relevant c++ 

 

class Vec3f {
public:
    float x,y,z;
    Vec3f(float x=0,float y=0,float z=0) {
        this->x = x;
        this->y = y;
        this->z = z;
    }

    Vec3f(const Vec3f &other) {
        this->x = other.x;
        this->y = other.y;
        this->z = other.z;
    }

    Vec3f operator+(const Vec3f &other) {
        return Vec3f(x+other.x,y+other.y,z+other.z);
    }

    Vec3f &operator =(const Vec3f &other) {
        this->x = other.x;
        this->y = other.y;
        this->z = other.z;
        return *this;
    }
};

static void Vec3fDefaultConstructor(Vec3f *self) {
    new(self) Vec3f();
}

static void Vec3fCopyConstructor(const Vec3f &other,Vec3f *self) {
    new(self) Vec3f(other);
}

static void Vec3fInitConstructor(float x, float y,float z,Vec3f *self) {
    new(self) Vec3f(x,y,z);
}

static void Vec3fDestructor(Vec3f *self) {
    self->~Vec3f();
}

int registerMath(asIScriptEngine *engine) {
    int r = engine->RegisterObjectType("Vec3f",sizeof(Vec3f),asOBJ_VALUE | asOBJ_APP_CLASS_CAK);
    assert(r>=0);

    //Vec3f poperties
    r = engine->RegisterObjectProperty("Vec3f","int x",asOFFSET(Vec3f,x));
    assert(r>=0);
    r = engine->RegisterObjectProperty("Vec3f","int y",asOFFSET(Vec3f,y));
    assert(r>=0);
    r = engine->RegisterObjectProperty("Vec3f","int z",asOFFSET(Vec3f,z));
    assert(r>=0);

    // Register the constructors
    r = engine->RegisterObjectBehaviour("Vec3f",asBEHAVE_CONSTRUCT,"void f()",asFUNCTION(Vec3fDefaultConstructor), asCALL_CDECL_OBJLAST); assert( r >= 0 );
    r = engine->RegisterObjectBehaviour("Vec3f",asBEHAVE_CONSTRUCT,"void f(const Vec3f &in)",asFUNCTION(Vec3fCopyConstructor), asCALL_CDECL_OBJLAST); assert( r >= 0 );
    r = engine->RegisterObjectBehaviour("Vec3f",asBEHAVE_CONSTRUCT,"void f(float,float,float)",asFUNCTION(Vec3fInitConstructor), asCALL_CDECL_OBJLAST); assert( r >= 0 );
    r = engine->RegisterObjectBehaviour("Vec3f", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(Vec3fDestructor), asCALL_CDECL_OBJLAST);
    assert(r>=0);

    //Vec3f methods
    r = engine->RegisterObjectMethod("Vec3f","Vec3f &opAssign(const Vec3f &in)",asMETHODPR(Vec3f,operator =,(const Vec3f &),Vec3f &),asCALL_THISCALL);
    assert(r>=0);
    r = engine->RegisterObjectMethod("Vec3f","Vec3f opAdd(const Vec3f &in)",asMETHOD(Vec3f,operator +),asCALL_THISCALL);
    assert(r>=0);

    return r;
}

And the test script

void main() {
	Vec3f v1(5,5,5);
	Vec3f v2(5,5,5);
	
	print("Vec3f("+v1.x+","+v1.y+","+v1.z+")\n");
}

 

And the output

Vec3f(1084227584,1084227584,1084227584)

 

I think it might have to do with either the placement new or the  asOFFSET but I'm not sure.

 

P.S. I'm using Mingw 4.7.0

Edited by viepr08v10

Share this post


Link to post
Share on other sites
Advertisement

Never mind i was tired last night and i tried registering float properties as int that was stupid. 

r = engine->RegisterObjectProperty("Vec3f","int x",asOFFSET(Vec3f,x));
assert(r>=0);
r = engine->RegisterObjectProperty("Vec3f","int y",asOFFSET(Vec3f,y));
assert(r>=0);
r = engine->RegisterObjectProperty("Vec3f","int z",asOFFSET(Vec3f,z));
assert(r>=0);

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement