我如何才能与我的课程一起暴露从Glm Haxe Lib中导入的类型



我正在编写一个我将转换为Python和C#的课程。我的代码使用不错的" GLM"库。GLM提供了有用的数据类型,例如:Vec3

我可以让python和c#用户的Vec3可见吗?换句话说,我可以使用Vec3 Datatypes公开公共方法?

这是一个示例haxe代码,其公共功能使用Vec3类型的类:

// Test execution:
// haxe -main TestGLM1 -lib glm --interp
// Translate into Python:
// haxe -main TestGLM1 -python TestGLM1.py  -lib glm 
// python3 TestGLM1.py
import glm.Vec3;
import glm.Quat;
import glm.Mat4;

class TestGLM1 {
    public function new() {
    }
    static function main() {
        // My test of the method taking 3D datatypes as input and output
        var t: TestGLM1 = new TestGLM1() ;
        var v1: Vec3 = new Vec3(1,2,3) ;
        var v2: Vec3 = new Vec3(7,8,9) ;
        t.testVecIO(v1, v2);
        trace(v1, v2);
    }
    public function testVecIO(vec_in: Vec3 , vec_out: Vec3) {
        vec_out.x = vec_in.x + vec_out.x;
        vec_out.y = vec_in.y + vec_out.y;
        vec_out.z = vec_in.z + vec_out.z;
    }
}

我想编写这样的python测试:

from TestGLM1 import TestGLM1
from TestGLM1 import glm_Vec3
print("Python Test...")
t = TestGLM1()
v1 = glm_Vec3(1,2,3)  # Vec3()
v2 = glm_Vec3(4,5,6)  # Vec3()
t.testVecIO(v1, v2)
print(v1, v2)
print("Python done.")

但是,此测试失败:

Importerror:无法导入名称'glm_vec3'

因为我在TestGLM1.py中看到的唯一类是:

class glm_Vec3Base:
    _hx_class_name = "glm.Vec3Base"
    __slots__ = ("x", "y", "z")
    _hx_fields = ["x", "y", "z"]
    def __init__(self):
        self.z = None
        self.y = None
        self.x = None

既有一个不友好的名称又不显示合适的构造函数。

有建议吗?谢谢。

我在testglm1.py中看到的唯一类是glm_vec3base

那是因为Vec3abstract类型,而摘要仅在编译时存在。基础类型确实是一个称为Vec3Base的类,如果您检查Vec3.hx,您会注意到为什么它"没有合适的构造函数":

class Vec3Base {
    function new() {}
    var x:Float;
    var y:Float;
    var z:Float;
}

您还可以注意,Vec3的所有方法均声明为inline。如果它们不是(您可以通过使用--no-inline编译来强制此功能(,则您的Python输出将有一个名为glm__Vec3_Vec3_Impl_的类。它具有所有Vec3的方法的静态方法,因为这是摘要在引擎盖下工作的方式:

此时,一个很好的问题是"如果不在内联声明成员函数会发生什么",因为代码显然必须去某个地方。HAXE创建了一个私人类,已知为实现类,该类使所有抽象成员都可以作为静态函数接受基础类型的其他第一个参数this

总而言之,由于Vec3被用作摘要,我认为没有一种方便的方法将其暴露于Python或C#用户。总体而言,HAXE生成的代码并不适合这样使用。这并不是说根本没有促进它的机制。例如,有用于JavaScript和LUA目标的@:expose元数据。

相关内容

  • 没有找到相关文章

最新更新