void TransformComponent::UpdateWorldPosition(corgi::EntityRef& entity, const mathfu::mat4& transform) { TransformData* transform_data = GetComponentData(entity); transform_data->world_transform = transform * transform_data->GetTransformMatrix(); for (auto iter = transform_data->children.begin(); iter != transform_data->children.end(); ++iter) { UpdateWorldPosition(iter->owner, transform_data->world_transform); } }
void TransformComponent::UpdateAllEntities(corgi::WorldTime /*delta_time*/) { for (auto iter = component_data_.begin(); iter != component_data_.end(); ++iter) { corgi::EntityRef entity = iter->entity; TransformData* transform_data = Data<TransformData>(entity); // Go through and start updating everything that has no parent: if (!transform_data->parent) { UpdateWorldPosition(entity, mathfu::mat4::Identity()); } } }
//该函数只有在Quantum(),GetBitMapRect()函数调用过后才能被调用 //计算机中新的位置可以绘制在屏幕上的部分 //该函数有可能会改变iWorldPosition 和iDrawableBitMapRect的值 void TWorldObject::CalcDrawableRect() { //先填充iWorldPoint 和 iDrawableBitMapRect GetBitMapRect(); UpdateWorldPosition(); iIsNeedDraw = ETrue; if (iWorldPosition.iTl.iY < Y_AXIS_MIN_LIMIT) { if (iWorldPosition.iBr.iY < Y_AXIS_MIN_LIMIT) { //此时表示该对象的位置已经超出了需要绘制的范围 iIsNeedDraw = EFalse; //iWorldPosition.SetRect(0, 0, 0, 0); //iDrawableBitMapRect.SetRect(0, 0, 0, 0); return; } TInt offset = Y_AXIS_MIN_LIMIT - iWorldPosition.iTl.iY; iDrawableBitMapRect.iTl.iY += offset; iWorldPosition.iTl.iY += offset; return; } if (iWorldPosition.iBr.iY > Y_AXIS_MAX_LIMIT) { if (iWorldPosition.iTl.iY > Y_AXIS_MAX_LIMIT) { //此时对象刚加入队列 还没有到达可显示的区域 //将可显示区间 设置为0 iIsNeedDraw = EFalse; //iWorldPosition.SetRect(0, 0, 0, 0); //iDrawableBitMapRect.SetRect(0, 0, 0, 0); return; } else { TInt offset = iWorldPosition.iBr.iY - Y_AXIS_MAX_LIMIT; iDrawableBitMapRect.iBr.iY -= offset; iWorldPosition.iBr.iY -= offset; } } }