置顶随笔

我已更换新的blog
猛击此处访问新blog
此blog的文章已全部转移
欢迎访问
o(∩_∩)o...
posted @ 2008-02-19 12:26 Felicia 阅读(1354) | 评论 (0)编辑 收藏
 
     摘要: USACO历年比赛题目,测试数据和解题报告下载

  阅读全文
posted @ 2007-12-29 14:07 Felicia 阅读(26946) | 评论 (38)编辑 收藏
 
     摘要: pku 部分动态规划题目列表

  阅读全文
posted @ 2007-08-26 11:52 Felicia 阅读(6548) | 评论 (5)编辑 收藏
 
     摘要: pku 部分计算几何题目列表

  阅读全文
posted @ 2007-08-19 16:14 Felicia 阅读(3157) | 评论 (12)编辑 收藏

2010年10月23日

前言

在C语言中,假设我们有这样的一个函数:

阅读全文(4746字)
文章来源:http://gccfeli.cn/2010/10/calling-convention.html
posted @ 2010-10-23 01:16 Felicia 阅读(324) | 评论 (0)编辑 收藏

2010年10月20日

因为原先用的代码高亮插件CoolCode不能高亮C#代码,最近尝试着使用另一个非常优秀的代码高亮插件CodeColorer来显示代码。CodeColorer使用牛X的GeSHi库作为后端,能支持上百种不同语言的高亮,的确十分强大。

阅读全文(597字)
文章来源:http://gccfeli.cn/2010/10/codecolorer-insert-code-in-wysiwyg-editor.html
posted @ 2010-10-20 07:31 Felicia 阅读(347) | 评论 (0)编辑 收藏

2010年10月17日

这两天Gravatar被墙,真是吐血,博客上所有的头像都不能显示了。BS抽风的GFW。

经测试,虽然%d.gravatar.com不能访问,但是gravatar.com还是可以访问的,因此解决方法也很简单:

将”wp-includes/pluggable.php”文件中的1649-1652行:

阅读全文(338字)
文章来源:http://gccfeli.cn/2010/10/gravatar-gfw.html
posted @ 2010-10-17 15:58 Felicia 阅读(250) | 评论 (0)编辑 收藏

2010年10月16日

Win7的80端口默认是被System进程占用的。在cmd下输入

netstat -aon | findstr 80
阅读全文(318字)
文章来源:http://gccfeli.cn/2010/10/win7-solve-80-port-occupied.html
posted @ 2010-10-16 15:40 Felicia 阅读(416) | 评论 (0)编辑 收藏

2010年10月15日

C# 3.0及以后版本提供了扩展方法这一强大工具,使得动态扩展类变得十分方便。具体使用方法是定义一个static class,然后定义static扩展方法,注意扩展方法的第一个参数必须用this关键字修饰。扩展方法能像类本身定义的方法一样被使用,而不需要修改类的代码,这样扩展原有库中的类就变得非常容易了。扩展方法同样对接口生效,更牛X的是,扩展方法中同样可以使用泛型。

下面是一个例子,展示了怎样扩展IEnumerable接口,增加一个RandomSelect的方法用于在表中随机选取元素。

阅读全文(865字)
文章来源:http://gccfeli.cn/2010/10/c-generic-extend-method.html
posted @ 2010-10-15 17:17 Felicia 阅读(565) | 评论 (0)编辑 收藏

2009年1月25日

很久没有做过逆向了,今天就玩了玩,并且玩了一整天。以下为研究成果。
Axp包其实是很简单的,结构简单,明文保存。

Axp文件格式大致上如下:
1.文件头;
2.索引表;
3.文件名表;
4.数据。
其中,文件名表以文件名为(list)的文件存在于数据当中。我想,之所以要有这么一个东西,而不和索引表合二为一,恐怕是因为文件名是变长之故吧。

Axp文件头的格式大致为:
1. 文件标示,一般为字符串“AXPK”,它占据了四个字节,占据空间为0x00-0x04;
2.索引表偏移量,为unit,它占据了四个字节,占据的空间为:0x10-0x13;
3.文件数,为unit,它占据了四个字节,占据的空间为:0x14-0x17。
文件头占据40个字节,既是在0x00-0x27的空间内。

一般来说,索引表的偏移量为:0x60028,数据区的偏移量为:0x160028.
不过还是依照以下流程获取偏移量为好:
1.获取文件头的索引表偏移量;
2.使用索引表偏移量定位到文件具体位置;
3.使用文件头获取到的文件数来读取文件数条索引;
4.根据索引查找文件。
在 这里我是很纳闷的:文件名表文件没有特殊位置,也似乎没有看到有文件头保存的偏移量指向它,如何去获取这个文件是个很令我困扰的事情。另外,表里面的文件 名顺序和资源包里面的文件排列顺序似乎是没有一个顺序对应的关系的。如何将索引表和文件名表进行关联,又是一个令人困扰的事情,或许能够解释通的大概就是 他们是读取后需要排序的,或者说还有什么特别的相关数据我没有获取到。


索引表的索引:
1.偏移量,unit;
2.文件大小,unit;
3.标志位,unit,现在似乎只有0x00000000和0x80000000两个标识,用于标示该文件是否可以被使用或者已经被删除。


到现在为止,最令我困惑的就是那两张表该如何进行关联和绑定数据。还有就是如何去获取文件名表。
posted @ 2009-01-25 10:53 Felicia 阅读(1414) | 评论 (3)编辑 收藏
 
说明:本文章纯属学习之用,如有商业之用,与本人无关。

网络游戏《天龙八部》采用的是Ogre3d作为其客户端渲染引擎,他们对之做了许多自定义的修改,在这里作为学习只用,特别说明一下其自定义的Skeleton的格式,以及如何加载的办法。

天龙八部加入了这样一个区段:
SKELETON_ANIMATION_TRACK_MULTI_KEYFRAME  0x4120 (16672)
在加入了这个区段的内容之后,其格式大概就是这样一个样子:
 enum SkeletonChunkID {
        SKELETON_HEADER            
= 0x1000,
            
// char* version           : Version number check
        SKELETON_BONE              = 0x2000,
        
// Repeating section defining each bone in the system. 
        
// Bones are assigned indexes automatically based on their order of declaration
        
// starting with 0.

            
// char* name                       : name of the bone
            
// unsigned short handle            : handle of the bone, should be contiguous & start at 0
            
// Vector3 position                 : position of this bone relative to parent 
            
// Quaternion orientation           : orientation of this bone relative to parent 
            
// Vector3 scale                    : scale of this bone relative to parent 

        SKELETON_BONE_PARENT       
= 0x3000,
        
// Record of the parent of a single bone, used to build the node tree
        
// Repeating section, listed in Bone Index order, one per Bone

            
// unsigned short handle             : child bone
            
// unsigned short parentHandle   : parent bone

        SKELETON_ANIMATION         
= 0x4000,
        
// A single animation for this skeleton

            
// char* name                       : Name of the animation
            
// float length                      : Length of the animation in seconds

            SKELETON_ANIMATION_TRACK 
= 0x4100,
            
// A single animation track (relates to a single bone)
            
// Repeating section (within SKELETON_ANIMATION)
                
                
// unsigned short boneIndex     : Index of bone to apply to

                SKELETON_ANIMATION_TRACK_KEYFRAME 
= 0x4110,
                
// A single keyframe within the track
                
// Repeating section

                    
// float time                    : The time position (seconds)
                    
// Quaternion rotate            : Rotation to apply at this keyframe
                    
// Vector3 translate            : Translation to apply at this keyframe
                    
// Vector3 scale                : Scale to apply at this keyframe

                SKELETON_ANIMATION_TRACK_MULTI_KEYFRAME 
= 0x4120,
                
// A multiple keyframe within the track
                
// Repeating section

                    
// float length                 : Length of the animation in seconds
                    
// float flags                  : Length of the animation in seconds
                        
// float time                   : The time position (seconds)
                        
// Quaternion rotate            : Rotation to apply at this keyframe
                        
// Vector3 translate            : Translation to apply at this keyframe
                
        SKELETON_ANIMATION_LINK         
= 0x5000
        
// Link to another skeleton, to re-use its animations

            
// char* skeletonName                    : name of skeleton to get animations from
            
// float scale                            : scale to apply to trans/scale keys

    };


然后我们打开OgreSkeletonSerializer.cpp找到SkeletonSerializer::readAnimationTrack的实现,然后替换为下面的代码:
void SkeletonSerializer::readAnimationTrack(DataStreamPtr& stream, Animation* anim, 
        Skeleton
* pSkel)
    {
        
// unsigned short boneIndex     : Index of bone to apply to
        unsigned short boneHandle;
        readShorts(stream, 
&boneHandle, 1);

        
// Find bone
        Bone *targetBone = pSkel->getBone(boneHandle);

        
// Create track
        NodeAnimationTrack* pTrack = anim->createNodeTrack(boneHandle, targetBone);

        
// Keep looking for nested keyframes
        if (!stream->eof())
        {
            unsigned 
short streamID = readChunk(stream);
            
while( (streamID == SKELETON_ANIMATION_TRACK_KEYFRAME || streamID == SKELETON_ANIMATION_TRACK_MULTI_KEYFRAME)
                
&& !stream->eof())
            {
                
if (streamID == SKELETON_ANIMATION_TRACK_MULTI_KEYFRAME)
                {
                    
// TLBB 新增了此部分
                    unsigned short len;
                    unsigned 
short flags;
                    readShorts(stream, 
&len, 1);
                    readShorts(stream, 
&flags, 1);

                    
int count = (mCurrentstreamLen - 4 - 4/ 4;
                    
if (len != count / 8)
                    {
                        len 
= len;
                    }
                    
float time;
                    
for (int i = 0; i < len; i += 1)
                    {
                        readFloats(stream, 
&time, 1);
                        TransformKeyFrame 
*kf = pTrack->createNodeKeyFrame(time);

                        Quaternion rot 
= Quaternion::IDENTITY;
                        
if (flags & 1)
                        {
                            readObject(stream, rot);
                        }
                        kf
->setRotation(rot);

                        Vector3 trans 
= Vector3::ZERO;
                        
if (flags & 2)
                        {
                            readObject(stream, trans);
                        }
                        kf
->setTranslate(trans);
                    }
                }
                
else
                {
                    readKeyFrame(stream, pTrack, pSkel);
                }

                
if (!stream->eof())
                {
                    
// Get next stream
                    streamID = readChunk(stream);
                }
            }
           
            
if (!stream->eof())
            {
                
// Backpedal back to start of this stream if we've found a non-keyframe
                stream->skip(-STREAM_OVERHEAD_SIZE);
            }
        }
    }
保存然后重新编译Ogre就OK了,理论上就是可以加载其骨骼动画了。
另外,其骨骼文件名,模型文件名都是用的中文,而VS2005对中文路径名的支持是有一个bug的,解决此问题参见下面这篇文章:
http://www.cppblog.com/tx7do/archive/2008/12/09/68897.html
posted @ 2009-01-25 10:36 Felicia 阅读(872) | 评论 (0)编辑 收藏

2008年2月19日

我已更换新的blog
猛击此处访问新blog
此blog的文章已全部转移
欢迎访问
o(∩_∩)o...
posted @ 2008-02-19 12:26 Felicia 阅读(1354) | 评论 (0)编辑 收藏

2008年2月7日

     摘要: Felicia的果冻秘方!

  阅读全文
posted @ 2008-02-07 00:40 Felicia 阅读(904) | 评论 (0)编辑 收藏

2008年1月30日

每次在telnet下退出珞珈山水,都会随机出现一个离版画面。
我最喜欢的是这首诗


就这样走了吗
亲爱的 Felicia

你可知道
与你相遇在这十字路口
是我的最美回忆

我知道你会回来
在这熟悉路口
不要说是否曾经相约
不去说诺言
我知道你的脚步
终会明白
这心的约定

让我静静等你再次出现

posted @ 2008-01-30 11:24 Felicia 阅读(482) | 评论 (0)编辑 收藏
仅列出标题  下一页