岁月流转,往昔空明

C++博客 首页 新随笔 联系 聚合 管理
  63 Posts :: 3 Stories :: 157 Comments :: 0 Trackbacks

2008年5月16日 #

     摘要:
讨论脚本编程与静态语言的异同点,
总结一下近期脚本编程的心得,
吸取教训,
并欢迎大家探讨、指点。  阅读全文
posted @ 2008-05-16 15:51 空明流转 阅读(404) | 评论 (4)编辑 收藏

2008年3月8日 #

这个设计主要是拿来保证跨组件的时候能尽可能的保护型别安全.

我今天晚上早些时候也往SoftArt里面提交了一个type to id的实现,使用宏和特化机制
但是这个版本的一个很大的问题就在于用起来不是很方便,每注册一个类需要2行代码,而且都是
#define PARAM float
#include REGTYPE()
这样的非常规的宏用法.
但是由于它是分类实现的,所以可以在里面补充一些额外的功能,比如自动的具名常量的生成.

所以晚上回来的时候又用boost的mpl写了一个原形,基本上是纯模板的.注册类只需要一行,但是宏实现版本中一些半自动化的特点也损失的差不多了.
回头还是要考虑用preprocessor结合MPL,看看能不能做到两个特点兼备.

mingw + gcc 4.2.1下通过

#include <iostream>
#include 
<boost/smart_ptr.hpp>

#include 
<boost/mpl/vector.hpp>
#include 
<boost/mpl/find.hpp>
#include 
<boost/mpl/at.hpp>
#include 
<boost/mpl/size.hpp>
#include 
<boost/mpl/if.hpp>
#include 
<boost/mpl/less.hpp>
#include 
<boost/mpl/int.hpp>
#include 
<boost/mpl/less_equal.hpp>

#include 
<boost/type_traits/is_same.hpp>

using namespace std;

struct empty{};

#define BEGIN_REGISTER_TYPE() typedef boost::mpl::vector<empty
#define REGISTER_TYPE(type) ,type
#define END_REGISTER_TYPE() > typelst;

namespace shader_constant
{
    BEGIN_REGISTER_TYPE()
        REGISTER_TYPE(
int)
        REGISTER_TYPE(
float)
        REGISTER_TYPE(
bool)
    END_REGISTER_TYPE();

    
static const int size_of_typelst = boost::mpl::size<typelst>::value;
    typedef boost::mpl::int_
<size_of_typelst> size_of_typelst_t;

    template
<class T>
    
struct type2id{
        typedef typename boost::mpl::find
<typelst, T>::type iter;
        
static const int id =
            boost::mpl::if_
<
                boost::is_same
<boost::mpl::end<typelst>::type, iter>,
                boost::mpl::int_
<0>,
                typename iter::pos
            
>::type::value;
    }
;

    template
<int id>
    
struct id2type{
        typedef boost::mpl::int_
<id> int_id;
        typedef boost::mpl::int_
<0> int_0;

        
//type = (0 < id && id <= size) ? typelst[id] : empty;
        typedef typename boost::mpl::if_<
            boost::mpl::and_
<
                boost::mpl::less
<int_0, int_id >,
                boost::mpl::less_equal
<int_id, boost::mpl::size<typelst>::type >
            
>,
            typename boost::mpl::at
<typelst, int_id>::type,
            empty
        
>::type type;
    }
;
}


using namespace shader_constant;

typedef 
void (*Assignments)(void* p1, void* p2);

template
<class T>
void AssignImpl(void* p1, void* p2)
{
    cout 
<< typeid(T).name() << endl;
    
*(T*)p1 = *(T*)p2;
}


template 
<> void AssignImpl<empty>(void* p1, void* p2)
{
    cout 
<< "error type!" << endl;
}


 Assignments assigns[size_of_typelst
+1];

template 
<int i>
struct assigns_initializer
{
    assigns_initializer
<i-1> m;
    assigns_initializer()
{
        assigns[i] 
= &AssignImpl<typename id2type<i>::type >;
        }

}
;

template 
<>
struct assigns_initializer<-1>
{
    assigns_initializer()
{
        }

}
;

static assigns_initializer<size_of_typelst> ai;

typedef 
double T;
int main()
{
    T i1(T(
0));
    T i2(T(
10));
    assigns[type2id
<T>::id](&i1, &i2);
    cout 
<< i1;
    system(
"pause");
    
return 0;
}

posted @ 2008-03-08 00:55 空明流转 阅读(705) | 评论 (4)编辑 收藏

2008年2月20日 #

2月22日更新:
修改了项目设置(大换血。。。)。昨天下过的最好重新check out。

2月21日更新:

已经将SoftArt整体放置到SF的SVN上了。

SVN地址: https://softart.svn.sourceforge/svnroot/softart/prealpha
svn co https://softart.svn.sourceforge/svnroot/softart/prealpha softart

由于目前的渲染器离成品还很遥远,所以就没有以Release的形式放出。Version 6 中,CartoonDemo大家可以自行从solution里面移除;EFLIB需要项目地址上下载Release,然后在VC环境中另行设置,给大家带来的不便深表歉意。

2005 SP1 下通过(有点bug)

感谢亨德列克和叛逆者两位前辈的无私指点(不管哪一方面都是,从技术到态度到Fix Defects到New Ideas),非常感谢~~~拜~~~


该软件渲染器名字就叫SoftArt,本来准备叫做ColorfulSnail(哈,因为Debug的时候它的运行速度是在是太慢了),但是无奈Snail已经被人注册过了,所以就还是叫这个名字了。
每个开发阶段我都会有一个项目代号,目前的这个还是prealpha阶段,所以就叫prealpha好了。

今天放上去的是支持库Essential Functions Library,大家可以去我的项目地址下载。

https://sourceforge.net/projects/softart/

也叫Efl Functions Library,提供了一些基本的数学工具(比方说基本的向量和矩阵的运算)。项目的主体代码我需要将接口整理完毕以后再行发布。目前仅https://softart.svn.sourceforge.net/svnroot/softart/prealpha 支持VS2005编译器,很快会考虑2008和GCC 4.2 or later。

希望大家有什么意见和建议尽管提出,我一定会尽可能将大家的想法加入到我的TODO LIST中。

posted @ 2008-02-20 18:44 空明流转 阅读(1068) | 评论 (3)编辑 收藏

2008年2月17日 #

     摘要: 总结了我在以往项目中使用设计模式的经验;
我阅读《设计模式》的心得;
讨论一些在阅读时产生,实践中解决的困惑,为设计模式新手提供一条可以参考的学习路线;
并希望与老手们一同探讨、交换:
设计模式在实际中使用中的经验与教训;关于拓展现有设计模式、联合使用多个设计模式的案例和思路。  阅读全文
posted @ 2008-02-17 15:11 空明流转 阅读(1120) | 评论 (0)编辑 收藏

2008年2月16日 #

我也不知道这个能不能算是2005的bug吧,反正我是想不太明白。
今天在对我的pool使用policy的设计的时候发现的。

//前面代码省略

struct single_thread
{
  template
<class T> struct thread_safe_type
  {
     typedef boost::add_volatile
<T> result;
  }
};

template
<class ThreadingModel>
struct pool : private ThreadingModel
{
  typedef typename ThreadingModel::thread_safe_type
<size_t>::result index_t;//其实有没有typename都一样。
 
//other public members

private:
 index_t first_free_;
};
看起来这段代码是完全能正常工作的,是吧。可是很不幸的是这代码在2005上没法正常通过。
解决的方法很简单:
typedef ThreadingModel TM;
typedef TM::thread_safe_type<size_t>::result index_t;
就可以大功告成了。不知道是不是typename的问题。但是从编译器的出错提示来看并不能和简单的typename的问题混为一谈。另外,如果这个thread_safe_type不是模板而只是一个普通的struct或者typedef的话,也是没有这个问题的。

如果有知道这个问题出现的根本原因的,请指教。

posted @ 2008-02-16 21:45 空明流转 阅读(873) | 评论 (6)编辑 收藏

2007年12月30日 #


今天把软渲器前后跑了一下,排掉了z buffer的一个很恶心的bug后,终于顺畅了。
虽然前前后后的球啊、方盒子啊、平面啊测试了不少,但是差不多像Demo的这还是头一个。
由于不支持复杂的ddx、ddy(ps仅仅支持求输入寄存器的ddx ddy),因此ps30的很多东西就没法做了。

一开始实现的时候没考虑GS,所以也就没有ps40可言。
不过对于软件渲染器来说,没有GS,以及没有DX11的TS也算不得什么硬伤。

博客的文章上,这之前还缺设计模式的最后一个话题没讲完。
等结束了尾巴话题以后,就简单的说一下软件渲染器的问题。
其实没有什么太大的难度,代码量也不大,核心库也就8K行代码。

源代码由于还比较混乱(主要是很多地方都是双向),所以还没有放出来。准备在我放假前放到sourceforge上,这也是我答应了叛兄的。
然后可能要在他的帮助下把SR规范一下后作为KlayGE的software renderer plug-in用。

这是一个勾边的Demo。原理很简单,先正面渲染一次,再沿法线拉伸一下模型,背面渲染一次。
效果图。

光摆图我也不敢放首页啊……
主要是征询一下,这段时间我做什么Demo比较好(如果有太复杂场景的就算了,因为软件渲染器速度有限,但是可以有比较复杂的效果)
还有个就是,征询一下SF上project的名字。。。
posted @ 2007-12-30 22:28 空明流转 阅读(532) | 评论 (0)编辑 收藏

2007年12月13日 #

花了一个多月终于把软渲染器的整个流水跑通了。

其实也没多少代码,就是很多小问题写的时候脑子没想的很清楚。
一切都仿照这DX10来的,除了Geometry Shader。
因为我觉得没啥必要,都是在CPU上工作,还不如让Client直接做Subdivision一类来得快。
而且GS这玩意以前就觉得不可靠,前段时间GMM也提到了这个问题。

这两天把程序重构一下就差不多了,改名字,调整一下文件的物理组织,当然还有跨平台的一些必需要写的东西。这样也就差不多了。
现在声明定义有的都搅和到一起了;Driver的接口也不怎么好用。

近期计划cube texture和ewa filter,顺便把我现在用的数学包扩充一下;

中期计划Utility部分做起来,主要是Texture Loader和Model Loader、还有Display Driver。反正类似于GLUT一类的;

然后是要修改一下现在的 Rasterizer 和 Shader,让它和硬件一样生成一个个的block容易并行也容易差分;这样就能支持 ddx 和 ddy 了;

再然后就是弄XML做一个材质脚本,shader脚本就不做了,如果要是用micro-thread的话,插件体系都基本上没戏;

然后就是把并行部分用GPGPU加速。不过估计我目前还没那个能耐,先放放。



posted @ 2007-12-13 22:55 空明流转 阅读(91) | 评论 (0)编辑 收藏

2007年11月9日 #

确实我在IE浏览器中发现了,确认是由于Minidx的留言名字和我选择的blog的风格冲突了,在IE下,由于Minidx的名字太长了所以把侧边栏涨开了,以至于把字挡住了。在此给各位带来的不便深表歉意。

所以minidx很不好意思,我只能将你的留言删除实在不好意思,真对不起,因为我不知道怎么把它在侧边栏上隐藏掉。。。

ps,minidx,你换个签名好了,反正<a></a>的标记又显示不出来。。。

附录

我删掉的minidx的评论是:

我看很正常

留言来自于《设计模式小结(一)》
posted @ 2007-11-09 21:36 空明流转 阅读(103) | 评论 (1)编辑 收藏

     摘要: 先来段前言。今天跟某vczh在群里面聊天的时候,他突然很诡秘的说要我看看他的空间连接。然后翻开一看,我靠,一连串1-7的标题。从尾到头倒读一通,才发现写的挺清楚的,比一般的教科书都要到位。不愧是要去google/msra实习的编译器狂人。(此人成天琢磨编译器)遂转发,希望对有志了解编译器工作原理的人们有所帮助。虽然这小子说不能修改,但是有的玩意贴的时候还是稍微动一下好发一点。不跟他打招呼了,嘿嘿。...  阅读全文
posted @ 2007-11-09 10:41 空明流转 阅读(678) | 评论 (13)编辑 收藏

2007年11月6日 #

     摘要:
总结了我在以往项目中使用设计模式的经验;
我阅读《设计模式》的心得;
讨论一些在阅读时产生,实践中解决的困惑,为设计模式新手提供一条可以参考的学习路线;
并希望与老手们一同探讨、交换:
设计模式在实际中使用中的经验与教训;关于拓展现有设计模式、联合使用多个设计模式的案例和思路。  阅读全文
posted @ 2007-11-06 16:42 空明流转 阅读(1018) | 评论 (2)编辑 收藏

仅列出标题  下一页