C++混合编程之idlcpp教程Lua篇(9)

上一篇在这 C++混合编程之idlcpp教程Lua篇(8)

第一篇在这 C++混合编程之idlcpp教程(一)

与前面的工程相比,工程LuaTutorial7中除了四个文件LuaTutorial7.cpp, Tutorial7.cpp, Tutorial7.i, tutorial7.lua 外,Tutorial6.cpp也被加入了此工程中。其中LuaTutorial7.cpp的内容基本和LuaTutorial6.cpp雷同,不再赘述。

首先看一下Tutorial7.i的内容:

#import "Tutorial6.i"

namespace tutorial
{
    struct Ray3<T>
    {
        Ray3();
        Ray3(const Vector3<T>& origin, const Vector3<T>& direction);
        void getPoint(Vector3<T>& point, T t) const;
        Vector3<T> getPoint(T t) const;
        Vector3<T> m_origin;
        Vector3<T> m_direction;
    };

    export Ray3<float>;
    export Ray3<double>;
    typedef Ray3<float> Ray3f;
    typedef Ray3<double> Ray3d;

    $*

    template<typename T>
    inline Ray3<T>::Ray3()
    {}

    template<typename T>
    inline Ray3<T>::Ray3(const Vector3<T>& origin, const Vector3<T>& direction) :
        m_origin(origin), m_direction(direction)
    {}

    template<typename T>
    inline void Ray3<T>::getPoint(Vector3<T>& point, T t) const
    {
        point.x = m_origin.x + m_direction.x * t;
        point.y = m_origin.y + m_direction.y * t;
        point.z = m_origin.z + m_direction.z * t;
    }
    template<typename T>
    inline Vector3<T> Ray3<T>::getPoint(T t) const
    {
        return Vector3<T>(m_origin.x + m_direction.x * t,
            m_origin.y + m_direction.y * t,
            m_origin.z + m_direction.z * t);
    }

    *$
}

第一行

#import "Tutorial6.i"

在后面Ray3的定义中使用到了模板类Vector3,所以在此处要先引入此文件。

struct Ray3<T>

此处定义了模板类Ray3。其中有类型为Vector3<T>的两个成员变量m_origin和m_direction。在这个类中以 m_origin + m_direction * t  (t >= 0) 参数方程的形式表示一个射线。有两个名为getPoint的重载函数用来获取射线上的一点坐标。

export Ray3<float>;

export Ray3<double>;

模板实例化,这两行代码指示idlcpp生成相应类型的元数据信息。

typedef Ray3<float> Ray3f;

typedef Ray3<double> Ray3d;

定义类型别名,方便使用。

编译后生成的Tutorial7.h的内容如下:

//DO NOT EDIT THIS FILE, it is generated by idlcpp
//http://www.idlcpp.org

#pragma once

#include "./Tutorial6.h"

namespace tutorial
{
    template<typename T>
    struct Ray3
    {
    public:

        Ray3();
        Ray3(const Vector3<T>& origin,const Vector3<T>& direction);
        void getPoint(Vector3<T>& point,T t)const ;
        Vector3<T> getPoint(T t)const ;
        Vector3<T> m_origin;
        Vector3<T> m_direction;
    };

    typedef Ray3<float> Ray3f;
    typedef Ray3<double> Ray3d;

    template<typename T>
    inline Ray3<T>::Ray3()
    {}

    template<typename T>
    inline Ray3<T>::Ray3(const Vector3<T>& origin, const Vector3<T>& direction) :
        m_origin(origin), m_direction(direction)
    {}

    template<typename T>
    inline void Ray3<T>::getPoint(Vector3<T>& point, T t) const
    {
        point.x = m_origin.x + m_direction.x * t;
        point.y = m_origin.y + m_direction.y * t;
        point.z = m_origin.z + m_direction.z * t;
    }
    template<typename T>
    inline Vector3<T> Ray3<T>::getPoint(T t) const
    {
        return Vector3<T>(m_origin.x + m_direction.x * t,
            m_origin.y + m_direction.y * t,
            m_origin.z + m_direction.z * t);
    }

}

然后是Tutorial7.cpp

#include "Tutorial7.h"
#include "Tutorial7.mh"
#include "Tutorial7.ic"
#include "Tutorial7.mc"

因为模板类的代码都写在头文件中了,所以Tutorial7.cpp只需要包含对应的四个文件即可。

另外模板类Ray3用到了模板类Vector3,所以其实例化类型Ray3<float>和Ray3<double>也分别用到Vector3的实例化类型Vector3<float>和Vector3<double>,相应的Ray3<float>元数据中也会用到Vector3<float>的元数据信息。所以在这个工程中需要将Tutorial6.cpp加入进来。

最后看一下Tutorial7.lua的内容

p = paf.float.NewArray(3);
p[0] = 1;
p[1] = 2;
p[2] = 3;
ray = paf.tutorial.Ray3f(paf.tutorial.Vector3f.s_zero, paf.tutorial.Vector3f(p));
pt = paf.tutorial.Vector3f(0,0,0);
ray:getPoint(pt, 2);
print(pt.x._);
print(pt.y._);
print(pt.z._);
pt = ray:getPoint(3);
print(pt.x._);
print(pt.y._);
print(pt.z._);

第一行:

p = paf.float.NewArray(3);

创建一个float类型的数组,共三个元素,其中float是内置的类型。C++的原生类型在idlcpp中都是支持的,如下:

bool
char
signed char
unsigned char
wchar_t
short
unsigned short
long
unsigned long
long long
unsigned long long
int
unsigned int
float
double
long double

考虑到有些类型中间有空格,为脚本使用方便,还为这些类型定义了别名,具体参见pafcore中的Typedef.i

编译执行,结果如下图:

				
时间: 2024-12-30 03:47:12

C++混合编程之idlcpp教程Lua篇(9)的相关文章

C++混合编程之idlcpp教程Lua篇(4)

上一篇在这  C++混合编程之idlcpp教程Lua篇(3) 与前面的工程相似,工程LuaTutorial2中,同样加入了三个文件 LuaTutorial2.cpp, Tutorial2.i, tutorial2.lua.其中LuaTutorial2.cpp的内容基本和LuaTutorial1.cpp雷同,不再赘述. 首先看一下Tutorial2.i的内容: namespace tutorial { struct Point { float x; float y; meta: Point();

C++混合编程之idlcpp教程Lua篇(8)

上一篇在这 C++混合编程之idlcpp教程Lua篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程LuaTutorial6中,同样加入了四个文件:LuaTutorial6.cpp, Tutorial6.cpp, Tutorial6.i, tutorial6.lua.其中LuaTutorial6.cpp的内容基本和LuaTutorial5.cpp雷同,不再赘述. 首先看一下Tutorial6.i的内容: namespace tutorial { template

C++混合编程之idlcpp教程Lua篇(7)

上一篇在这 C++混合编程之idlcpp教程Lua篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与LuaTutorial4工程相似,工程LuaTutorial5中,同样加入了四个文件:LuaTutorial5.cpp, Tutorial5.cpp, Tutorial5.i, tutorial5.lua.其中LuaTutorial5.cpp的内容基本和LuaTutorial4.cpp雷同,不再赘述. 首先看一下Tutorial5.i的内容: #import "../../paf/s

C++混合编程之idlcpp教程Lua篇(5)

上一篇在这 C++混合编程之idlcpp教程Lua篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程LuaTutorial3中,同样加入了三个文件:LuaTutorial3.cpp, Tutorial3.i, tutorial3.lua .其中LuaTutorial3.cpp的内容基本和LuaTutorial2.cpp雷同,不再赘述. 首先看一下Tutorial3.i的内容: namespace tutorial { struct Point { float x

C++混合编程之idlcpp教程Lua篇(2)

在上一篇 C++混合编程之idlcpp教程(一) 中介绍了 idlcpp 工具的使用.现在对 idlcpp 所带的示例教程进行讲解,这里针对的 Lua 语言的例子.首先看第一个示例程序 LuaTutorial0.像很多语言的第一个例子一样,是一个打印 Hello world 的程序.用Visual Studio 2015打开解决方案文件 tutorials\LuaTutorials\LuaTutorials.sln,其下已经有多个工程文件. 在工程LuaTutorial0中,已经加入了三个文件,

C++混合编程之idlcpp教程Python篇(7)

上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同样加入了四个文件:PythonTutorial5.cpp, Tutorial5.cpp, Tutorial5.i, tutorial5.py.其中PythonTutorial5.cpp的内容基本和PythonTutorial4.cpp雷同,不再赘述.首先看一下Tutorial5.i的内容: #imp

C++混合编程之idlcpp教程Python篇(8)

上一篇在这 C++混合编程之idlcpp教程Python篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial6中,同样加入了四个文件:PythonTutorial6.cpp, Tutorial6.cpp, Tutorial6.i, tutorial6.py.其中PythonTutorial6.cpp的内容基本和PythonTutorial5.cpp雷同,不再赘述.首先看一下Tutorial6.i的内容: #import "../../p

C++混合编程之idlcpp教程Python篇(4)

上一篇在这 C++混合编程之idlcpp教程Python篇(3) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial2中,同样加入了三个文件 PythonTutorial2.cpp, Tutorial2.i, tutorial2.py.其中PythonTutorial2.cpp的内容基本和PythonTutorial1.cpp雷同,不再赘述.首先看一下Tutorial2.i的内容: namespace tutorial { struct Poi

C++混合编程之idlcpp教程Python篇(3)

上一篇 C++混合编程之idlcpp教程Python篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与PythonTutorial0相似,工程PythonTutorial1中,同样加入了三个文件 PythonTutorial1.cpp, Tutorial1.i, tutorial1.py 其中PythonTutorial1.cpp的内容基本和PythonTutorial0.cpp雷同,不再赘述. 首先看一下Tutorial1.i的内容: name