RID PhysicsServerSW::joint_create_cone_twist(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B) { BodySW *body_A = body_owner.get(p_body_A); ERR_FAIL_COND_V(!body_A,RID()); if (!p_body_B.is_valid()) { ERR_FAIL_COND_V(!body_A->get_space(),RID()); p_body_B=body_A->get_space()->get_static_global_body(); } BodySW *body_B = body_owner.get(p_body_B); ERR_FAIL_COND_V(!body_B,RID()); ERR_FAIL_COND_V(body_A==body_B,RID()); JointSW *joint = memnew( ConeTwistJointSW(body_A,body_B,p_local_frame_A,p_local_frame_B) ); RID rid = joint_owner.make_rid(joint); joint->set_self(rid); return rid; }
RID BulletPhysicsServer::joint_create_pin(RID p_body_A, const Vector3 &p_local_A, RID p_body_B, const Vector3 &p_local_B) { RigidBodyBullet *body_A = rigid_body_owner.get(p_body_A); ERR_FAIL_COND_V(!body_A, RID()); JointAssertSpace(body_A, "A", RID()); RigidBodyBullet *body_B = NULL; if (p_body_B.is_valid()) { body_B = rigid_body_owner.get(p_body_B); JointAssertSpace(body_B, "B", RID()); JointAssertSameSpace(body_A, body_B, RID()); } ERR_FAIL_COND_V(body_A == body_B, RID()); JointBullet *joint = bulletnew(PinJointBullet(body_A, p_local_A, body_B, p_local_B)); AddJointToSpace(body_A, joint, true); CreateThenReturnRID(joint_owner, joint); }
RID PhysicsServerSW::joint_create_hinge_simple(RID p_body_A, const Vector3 &p_pivot_A, const Vector3 &p_axis_A, RID p_body_B, const Vector3 &p_pivot_B, const Vector3 &p_axis_B) { BodySW *body_A = body_owner.get(p_body_A); ERR_FAIL_COND_V(!body_A, RID()); if (!p_body_B.is_valid()) { ERR_FAIL_COND_V(!body_A->get_space(), RID()); p_body_B = body_A->get_space()->get_static_global_body(); } BodySW *body_B = body_owner.get(p_body_B); ERR_FAIL_COND_V(!body_B, RID()); ERR_FAIL_COND_V(body_A == body_B, RID()); JointSW *joint = memnew(HingeJointSW(body_A, body_B, p_pivot_A, p_pivot_B, p_axis_A, p_axis_B)); RID rid = joint_owner.make_rid(joint); joint->set_self(rid); return rid; }
void PhysicsServerSW::free(RID p_rid) { if (shape_owner.owns(p_rid)) { ShapeSW *shape = shape_owner.get(p_rid); while(shape->get_owners().size()) { ShapeOwnerSW *so=shape->get_owners().front()->key(); so->remove_shape(shape); } shape_owner.free(p_rid); memdelete(shape); } else if (body_owner.owns(p_rid)) { BodySW *body = body_owner.get(p_rid); // if (body->get_state_query()) // _clear_query(body->get_state_query()); // if (body->get_direct_state_query()) // _clear_query(body->get_direct_state_query()); body->set_space(NULL); while( body->get_shape_count() ) { body->remove_shape(0); } while (body->get_constraint_map().size()) { RID self = body->get_constraint_map().front()->key()->get_self(); ERR_FAIL_COND(!self.is_valid()); free(self); } body_owner.free(p_rid); memdelete(body); } else if (area_owner.owns(p_rid)) { AreaSW *area = area_owner.get(p_rid); // if (area->get_monitor_query()) // _clear_query(area->get_monitor_query()); area->set_space(NULL); while( area->get_shape_count() ) { area->remove_shape(0); } area_owner.free(p_rid); memdelete(area); } else if (space_owner.owns(p_rid)) { SpaceSW *space = space_owner.get(p_rid); while(space->get_objects().size()) { CollisionObjectSW *co = (CollisionObjectSW *)space->get_objects().front()->get(); co->set_space(NULL); } active_spaces.erase(space); free(space->get_default_area()->get_self()); free(space->get_static_global_body()); space_owner.free(p_rid); memdelete(space); } else if (joint_owner.owns(p_rid)) { JointSW *joint = joint_owner.get(p_rid); for(int i=0;i<joint->get_body_count();i++) { joint->get_body_ptr()[i]->remove_constraint(joint); } joint_owner.free(p_rid); memdelete(joint); } else { ERR_EXPLAIN("Invalid ID"); ERR_FAIL(); } };
int RM_FileHandle::InsertRec(RID &rid, RM_Record &rec) { //这里的RID是插入后返回一个RID,其余成员函数都是需要一个RID int first_index; BufType first_head = bpm->getPage(fileid, 0, first_index); int empty_rid_offset = EMPTY_RID_OFFSET_BYTE; //获取下一可插入项的偏移 int next_page_offset = NEXT_EMPTY_PAGE_BYTE; //获取下一个含空项页页码的偏移 int slots_offset = SLOT_OFFSET_BYTE; //获取slot偏移位置 if (*(int*)(first_head + EMPTY_PAGE_OFFSET_4BYTE) != -1) { //存在下一个空记录 int insert_page_index; Bytes insert_page_head = (Bytes)bpm->getPage(fileid, first_head[EMPTY_PAGE_OFFSET_4BYTE], insert_page_index); bpm->markDirty(insert_page_index); //肯定要修改,所以提前标记为脏页 RID* current_empty_rid = (RID*)(insert_page_head + empty_rid_offset); //下一可插入项 int next_page = *(int*)(insert_page_head + next_page_offset); //下一个含空项页页码 Bits* slots = new Bits(insert_page_head + slots_offset, pernum); //slots int offset = PAGE_HEAD_BYTE; offset = offset + recordsize * current_empty_rid->GetSlotid(); Bytes rlocation = insert_page_head + offset; //获取相应偏移后的地址 memcpy(rlocation, rec.GetRdata(), rec.GetSize()); //插入该记录 slots->bit_setone(current_empty_rid->GetSlotid()); //slot相应位子置1 rid = *current_empty_rid; //rid返回 bool isfull = true; //标记用,true表示当前页满 for (int current_slot = current_empty_rid->GetSlotid() + 1; current_slot < pernum; current_slot++) { if (!slots->bit_get(current_slot)) { //寻找下一个current_empty_rid,当slots[i]为0时说明该位为空 isfull = false; current_empty_rid->SetSlotid(current_slot); //修改下一个空项的位置 break; } } if (isfull) { //如果页满了 first_head[EMPTY_PAGE_OFFSET_4BYTE] = next_page; //当前数据页的下一页给第一页的含空项页 bpm->markDirty(first_index); //标记脏页 current_empty_rid->SetSlotid(-1); //slotid为-1表示没有下一项 *(int*)(insert_page_head + next_page_offset) = -1; //下一个含空项页页码表示当前页为满页 } } else { //均为满页,新建一页 pagesum++; //总页数新增一页 first_head[PSIZE_OFFSET_4BYTE] = pagesum; //修改总页数 bpm->markDirty(first_index); //标记为脏页 int new_index; //新建一个页,并将slot清零 Bytes new_head = (Bytes)bpm->getPage(fileid, pagesum - 1, new_index); Bits* new_slots = new Bits(new_head + slots_offset, pernum); new_slots->all_zero(); int new_offset = PAGE_HEAD_BYTE; //slot[0]即为第一条记录,存储insert的记录 Bytes rlocation = new_head + new_offset; memcpy(rlocation, rec.GetRdata(), rec.GetSize()); new_slots->bit_setone(0); bpm->markDirty(new_index); //标记为脏页 RID new_rid; new_rid.SetFileid(-1); new_rid.SetPageid(pagesum - 1); new_rid.SetSlotid(1); *(RID*)(new_head + empty_rid_offset) = new_rid; //下一可插入项更新为第1项 rid = new_rid; rid.SetSlotid(0); first_head[EMPTY_PAGE_OFFSET_4BYTE] = pagesum - 1; //第一页的含空项页设为当下的新增页 *(int*)(new_head + next_page_offset) = -1; //由于之前都是满页,这页显然没有后继页面,设为-1 } return 0; }
int RM_FileScan::NextRec(RM_Record &rec, RID &rid) { if (isclose) { //cout << "[RM_FileScan]GetNextRec error: This filescan has been closed!" << endl; return 2; } //NULL1:当comparevalue为NULL且op为大小于中的一个时为用假,返回为空 if(op <= GE && op >= LT && comparevalue == NULL) return 1; bool get_flag = false; int index; Bytes head = (Bytes)filehandle->bpm->getPage(currentRid->GetFileid(), currentRid->GetPageid(), index); Bits* slots = new Bits(head, filehandle->GetPnum()); Bytes record_head; int current_slotid = currentRid->GetSlotid(); int current_pageid = currentRid->GetPageid(); int offset = PAGE_HEAD_BYTE; while (!get_flag) { // cout << "fuck1" << endl; while ( current_slotid < filehandle->GetPnum() && slots->bit_get(current_slotid) == false) { current_slotid++; } // cout << "fuck2" << endl; if (current_slotid == filehandle->GetPnum()) { //该页记录已全部遍历 current_pageid++; current_slotid = 0; if (current_pageid == filehandle->GetPsum()) { //说明该文件下所有页的所有记录都已遍历过.此时返回0表示已遍历完 currentRid->SetPageid(current_pageid); currentRid->SetSlotid(current_slotid); return 1; } head = (Bytes)filehandle->bpm->getPage(currentRid->GetFileid(), current_pageid, index); slots->setData(head); offset = PAGE_HEAD_BYTE; } else { //得到一个记录 // cout << "fuck3" << endl; offset = PAGE_HEAD_BYTE; offset = offset + filehandle->GetRsize() * current_slotid; record_head = head + offset; int nullbits_offset = RECORD_NULLBITS_OFFSET_BYTE; Bits* nullbits = new Bits(record_head + nullbits_offset, attrcol+1); //获取相应记录的null位图(一定长度) //NULL2.1:左边NULL且需要判等(不等),则直接通过null位图来判别 //NULL2.2:左边NULL且op为大小于,直接返回true // cout << "fuck3.1" << endl; if(nullbits->bit_get(attrcol) == 0) {//左边为NULL if(op == NO) { get_flag = true; } if(op <= GE && op >= LT) { //为理解方便写出来,实际没什么用 get_flag = false; } if(op == EQ) { get_flag = (comparevalue == NULL); } if(op == NE) { get_flag = !(comparevalue == NULL); } } else /*if (comparevalue != 0)*/{//其他情况,进行相应比较 // cout << "fuck3.2" << endl; char* value_head = record_head + attroffset; // enum AttrType{INTEGER,FLOAT,STRING}; // enum CompOp{EQ,LT,GT,LE,GE,NE,NO}; // cout << "11" << endl; const char* cmp1 = value_head; const char* cmp2 = (char*)comparevalue; const CompOp cmpop = op; const AttrType cmptype = type; // cout << "22" << endl; if (comparevalue != 0 || op == NO){ // cout << "33" << endl; get_flag = compareData(cmp1, cmpop, cmp2, cmptype); } else get_flag = false; } // cout << "fuck4" << endl; if (get_flag) { rec.SetSize(filehandle->GetRsize()); // cout << "get_data: " << &get_data << " " << "head: " << &record_head << endl; rec.SetData(record_head); } else { current_slotid++; } // cout << "fuck5" << endl; } } //设置RID rid.SetFileid(-1); rid.SetPageid(current_pageid); rid.SetSlotid(current_slotid); //设置下一条记录的位置 currentRid->SetPageid(current_pageid); currentRid->SetSlotid(current_slotid + 1); return 0; }
bool RMFileHandle::isValidRID(const RID& rid) const { Slot slot = rid.slot(); return isValidPage(rid.page()) && slot >= 0; }
RC RM_FileScan::GetNextRec(RM_Record &rec) { if (!bInScan) return RM_ERR_NOTINSCAN; RC rc; RID rid; RM_Record tmpRec; while (1) { //std::cout <<"start next : "<< nowPage <<" "<<nowSlot<<"\n"; if (bNextPage) { //std::cout << "before next page:" << nowPage<<"\n"; if (PF_ERR_EOF == fileHandle.pfh.GetNextPage(nowPage, nowPH)) { bInScan = false; return RM_ERR_EOF; } if (rc = nowPH.GetPageNum(nowPage)) return rc; //std::cout << "after next page:" << nowPage<<"\n"; bNextPage = false; nowSlot = -1; continue; } char *pData; if (rc = nowPH.GetData(pData)) return rc; BitMap bitmap; if (rc = fileHandle.GetBitMapFromData(pData, bitmap)) return rc; //bitmap.print(); int nextBit; if (RM_ENDOFPAGE == bitmap.GetNextBit(nowSlot, nextBit)) { if (rc = fileHandle.pfh.UnpinPage(nowPage)) return rc; bNextPage = true; continue; } //std::cout << "nextbit: " << nextBit <<"\n"; nowSlot = nextBit; RID rid; rid.SetPageNum(nowPage); rid.SetSlotNum(nowSlot); // std::cout << "find slot: pageNum:"<<nowPage<<" slotNum:"<<nowSlot<<"\n"; //std::cout << "recordSize:" << fileHandle.header.recordSize<<"\n"; //std::cout << "firstFree :" << fileHandle.header.firstFree <<"\n"; //std::cout << "bitmapOffset :" << fileHandle.header.bitmapOffset <<"\n"; //std::cout << "bitmapSize : " << fileHandle.header.bitmapSize <<"\n"; //std::cout << "numRecordsPerPage : " << fileHandle.header.numRecordsPerPage <<"\n"; //std::cout << "numPages : " << fileHandle.header.numPages <<"\n"; //std::cout << rid.pageNum <<" "<<rid.slotNum<<"\n"; if (rc = fileHandle.GetRecordFromData(pData, rid, tmpRec)) return rc; //for (int i = 0; i < fileHandle.header.recordSize; i++) // std::cout << (int)tmpRec.pData[i] <<" "; //std::cout <<"\n"; //std::cout << "recdata: " << (int)tmpRec.pData[3]<<"\n"; //std::cout << "offset:"<<attrOffset<<" "<<" len:"<<attrLength<<" type:"<<attrType<<"\n"; //std::cout << "compop:"<<this->compOp<<"\n"; char *tmpRecData; if (rc = tmpRec.GetData(tmpRecData)) return rc; if (this->compOp != NO_OP) { bool flag; if (this->compOp != IS_OP && this->compOp != IS_NOT_OP && tmpRec.IsNull(attrNumber)) flag = false; else flag = (* cmp)(tmpRecData + attrOffset, this->value, attrType, attrLength); if (flag) { rec = tmpRec; break; } } else { rec = tmpRec; break; } } return 0; }
void Camera2D::_notification(int p_what) { switch(p_what) { case NOTIFICATION_FIXED_PROCESS: { _update_scroll(); } break; case NOTIFICATION_TRANSFORM_CHANGED: { if (!is_fixed_processing()) _update_scroll(); } break; case NOTIFICATION_ENTER_TREE: { viewport = NULL; Node *n=this; while(n){ viewport = n->cast_to<Viewport>(); if (viewport) break; n=n->get_parent(); } canvas = get_canvas(); RID vp = viewport->get_viewport(); group_name = "__cameras_"+itos(vp.get_id()); canvas_group_name ="__cameras_c"+itos(canvas.get_id()); add_to_group(group_name); add_to_group(canvas_group_name); _update_scroll(); first=true; } break; case NOTIFICATION_EXIT_TREE: { if (is_current()) { if (viewport) { viewport->set_canvas_transform( Matrix32() ); } } remove_from_group(group_name); remove_from_group(canvas_group_name); viewport=NULL; } break; case NOTIFICATION_DRAW: { if (!is_inside_tree() || !get_tree()->is_editor_hint()) break; Color area_axis_color(0.5, 0.42, 0.87, 0.63); float area_axis_width = 1; if(current) area_axis_width = 3; Matrix32 inv_camera_transform = get_camera_transform().affine_inverse(); Size2 screen_size = get_viewport_rect().size; Vector2 screen_endpoints[4]= { inv_camera_transform.xform(Vector2(0, 0)), inv_camera_transform.xform(Vector2(screen_size.width,0)), inv_camera_transform.xform(Vector2(screen_size.width, screen_size.height)), inv_camera_transform.xform(Vector2(0, screen_size.height)) }; Matrix32 inv_transform = get_transform().affine_inverse(); // undo global space draw_set_transform(inv_transform.get_origin(), inv_transform.get_rotation(), inv_transform.get_scale()); for(int i=0;i<4;i++) { draw_line(screen_endpoints[i], screen_endpoints[(i+1)%4], area_axis_color, area_axis_width); } } break; } }
void Particles2D::_notification(int p_what) { switch(p_what) { case NOTIFICATION_PROCESS: { _process_particles( get_process_delta_time() ); } break; case NOTIFICATION_ENTER_TREE: { float ppt=preprocess; while(ppt>0) { _process_particles(0.1); ppt-=0.1; } } break; case NOTIFICATION_DRAW: { if (particles.size()==0 || lifetime==0) return; RID ci=get_canvas_item(); Size2 size(1,1); Point2 center; int total_frames=1; if (!texture.is_null()) { size=texture->get_size(); size.x/=h_frames; size.y/=v_frames; total_frames=h_frames*v_frames; } float time_pos=(time/lifetime); Particle *pdata=&particles[0]; int particle_count=particles.size(); RID texrid; if (texture.is_valid()) texrid = texture->get_rid(); Matrix32 invxform; if (!local_space) invxform=get_global_transform().affine_inverse(); int start_particle = (int)(time * (float)particle_count / lifetime); for (int id=0;id<particle_count;++id) { int i = start_particle + id; if (i >= particle_count) { i -= particle_count; } Particle &p=pdata[i]; if (!p.active) continue; float ptime = ((float)i / particle_count)*explosiveness; if (ptime<time_pos) ptime=time_pos-ptime; else ptime=(1.0-ptime)+time_pos; uint32_t rand_seed=p.seed*(i+1); Color color; if(color_ramp.is_valid()) { color = color_ramp->get_color_at_offset(ptime); } else { color = default_color; } { float huerand=_rand_from_seed(&rand_seed); float huerot = param[PARAM_HUE_VARIATION] + randomness[PARAM_HUE_VARIATION] * huerand; if (Math::abs(huerot) > CMP_EPSILON) { float h=color.get_h(); float s=color.get_s(); float v=color.get_v(); float a=color.a; //float preh=h; h+=huerot; h=Math::abs(Math::fposmod(h,1.0)); //print_line("rand: "+rtos(randomness[PARAM_HUE_VARIATION])+" rand: "+rtos(huerand)); //print_line(itos(i)+":hue: "+rtos(preh)+" + "+rtos(huerot)+" = "+rtos(h)); color.set_hsv(h,s,v); color.a=a; } } float initial_size = param[PARAM_INITIAL_SIZE]+param[PARAM_INITIAL_SIZE]*_rand_from_seed(&rand_seed)*randomness[PARAM_FINAL_SIZE]; float final_size = param[PARAM_FINAL_SIZE]+param[PARAM_FINAL_SIZE]*_rand_from_seed(&rand_seed)*randomness[PARAM_FINAL_SIZE]; float size_mult=initial_size*(1.0-ptime) + final_size*ptime; //Size2 rectsize=size * size_mult; //rectsize=rectsize.floor(); //Rect2 r = Rect2(Vecto,rectsize); Matrix32 xform; if (p.rot) { xform.set_rotation(p.rot); xform.translate(-size*size_mult/2.0); xform.elements[2]+=p.pos; } else { xform.elements[2]=-size*size_mult/2.0; xform.elements[2]+=p.pos; } if (!local_space) { xform = invxform * xform; } xform.scale_basis(Size2(size_mult,size_mult)); VisualServer::get_singleton()->canvas_item_add_set_transform(ci,xform); if (texrid.is_valid()) { Rect2 src_rect; src_rect.size=size; if (total_frames>1) { int frame = Math::fast_ftoi(Math::floor(p.frame*total_frames)) % total_frames; src_rect.pos.x = size.x * (frame%h_frames); src_rect.pos.y = size.y * (frame/h_frames); } texture->draw_rect_region(ci,Rect2(Point2(),size),src_rect,color); //VisualServer::get_singleton()->canvas_item_add_texture_rect(ci,r,texrid,false,color); } else { VisualServer::get_singleton()->canvas_item_add_rect(ci,Rect2(Point2(),size),color); } } } break; } }
void Camera2D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_FIXED_PROCESS: { _update_scroll(); } break; case NOTIFICATION_TRANSFORM_CHANGED: { if (!is_fixed_processing()) _update_scroll(); } break; case NOTIFICATION_ENTER_TREE: { if (custom_viewport && ObjectDB::get_instance(custom_viewport_id)) { viewport = custom_viewport; } else { viewport = get_viewport(); } canvas = get_canvas(); RID vp = viewport->get_viewport_rid(); group_name = "__cameras_" + itos(vp.get_id()); canvas_group_name = "__cameras_c" + itos(canvas.get_id()); add_to_group(group_name); add_to_group(canvas_group_name); if (Engine::get_singleton()->is_editor_hint()) { set_fixed_process(false); } _update_scroll(); first = true; } break; case NOTIFICATION_EXIT_TREE: { if (is_current()) { if (viewport && !(custom_viewport && !ObjectDB::get_instance(custom_viewport_id))) { viewport->set_canvas_transform(Transform2D()); } } remove_from_group(group_name); remove_from_group(canvas_group_name); viewport = NULL; } break; case NOTIFICATION_DRAW: { if (!is_inside_tree() || !Engine::get_singleton()->is_editor_hint()) break; if (screen_drawing_enabled) { Color area_axis_color(0.5, 0.42, 0.87, 0.63); float area_axis_width = 1; if (is_current()) { area_axis_width = 3; area_axis_color.a = 0.83; } Transform2D inv_camera_transform = get_camera_transform().affine_inverse(); Size2 screen_size = get_viewport_rect().size; Vector2 screen_endpoints[4] = { inv_camera_transform.xform(Vector2(0, 0)), inv_camera_transform.xform(Vector2(screen_size.width, 0)), inv_camera_transform.xform(Vector2(screen_size.width, screen_size.height)), inv_camera_transform.xform(Vector2(0, screen_size.height)) }; Transform2D inv_transform = get_global_transform().affine_inverse(); // undo global space for (int i = 0; i < 4; i++) { draw_line(inv_transform.xform(screen_endpoints[i]), inv_transform.xform(screen_endpoints[(i + 1) % 4]), area_axis_color, area_axis_width); } } if (limit_drawing_enabled) { Color limit_drawing_color(1, 1, 0, 0.63); float limit_drawing_width = 1; if (is_current()) { limit_drawing_color.a = 0.83; limit_drawing_width = 3; } Vector2 camera_origin = get_global_transform().get_origin(); Vector2 camera_scale = get_global_transform().get_scale().abs(); Vector2 limit_points[4] = { (Vector2(limit[MARGIN_LEFT], limit[MARGIN_TOP]) - camera_origin) / camera_scale, (Vector2(limit[MARGIN_RIGHT], limit[MARGIN_TOP]) - camera_origin) / camera_scale, (Vector2(limit[MARGIN_RIGHT], limit[MARGIN_BOTTOM]) - camera_origin) / camera_scale, (Vector2(limit[MARGIN_LEFT], limit[MARGIN_BOTTOM]) - camera_origin) / camera_scale }; for (int i = 0; i < 4; i++) { draw_line(limit_points[i], limit_points[(i + 1) % 4], limit_drawing_color, limit_drawing_width); } } if (margin_drawing_enabled) { Color margin_drawing_color(0, 1, 1, 0.63); float margin_drawing_width = 1; if (is_current()) { margin_drawing_width = 3; margin_drawing_color.a = 0.83; } Transform2D inv_camera_transform = get_camera_transform().affine_inverse(); Size2 screen_size = get_viewport_rect().size; Vector2 margin_endpoints[4] = { inv_camera_transform.xform(Vector2((screen_size.width / 2) - ((screen_size.width / 2) * drag_margin[MARGIN_LEFT]), (screen_size.height / 2) - ((screen_size.height / 2) * drag_margin[MARGIN_TOP]))), inv_camera_transform.xform(Vector2((screen_size.width / 2) + ((screen_size.width / 2) * drag_margin[MARGIN_RIGHT]), (screen_size.height / 2) - ((screen_size.height / 2) * drag_margin[MARGIN_TOP]))), inv_camera_transform.xform(Vector2((screen_size.width / 2) + ((screen_size.width / 2) * drag_margin[MARGIN_RIGHT]), (screen_size.height / 2) + ((screen_size.height / 2) * drag_margin[MARGIN_BOTTOM]))), inv_camera_transform.xform(Vector2((screen_size.width / 2) - ((screen_size.width / 2) * drag_margin[MARGIN_LEFT]), (screen_size.height / 2) + ((screen_size.height / 2) * drag_margin[MARGIN_BOTTOM]))) }; Transform2D inv_transform = get_global_transform().affine_inverse(); // undo global space for (int i = 0; i < 4; i++) { draw_line(inv_transform.xform(margin_endpoints[i]), inv_transform.xform(margin_endpoints[(i + 1) % 4]), margin_drawing_color, margin_drawing_width); } } } break; } }
void ResourceFormatSaverBinaryInstance::write_variant(const Variant& p_property,const PropertyInfo& p_hint) { switch(p_property.get_type()) { case Variant::NIL: { f->store_32(VARIANT_NIL); // don't store anything } break; case Variant::BOOL: { f->store_32(VARIANT_BOOL); bool val=p_property; f->store_32(val); } break; case Variant::INT: { f->store_32(VARIANT_INT); int val=p_property; f->store_32(val); } break; case Variant::REAL: { f->store_32(VARIANT_REAL); real_t val=p_property; f->store_real(val); } break; case Variant::STRING: { f->store_32(VARIANT_STRING); String val=p_property; save_unicode_string(val); } break; case Variant::VECTOR2: { f->store_32(VARIANT_VECTOR2); Vector2 val=p_property; f->store_real(val.x); f->store_real(val.y); } break; case Variant::RECT2: { f->store_32(VARIANT_RECT2); Rect2 val=p_property; f->store_real(val.pos.x); f->store_real(val.pos.y); f->store_real(val.size.x); f->store_real(val.size.y); } break; case Variant::VECTOR3: { f->store_32(VARIANT_VECTOR3); Vector3 val=p_property; f->store_real(val.x); f->store_real(val.y); f->store_real(val.z); } break; case Variant::PLANE: { f->store_32(VARIANT_PLANE); Plane val=p_property; f->store_real(val.normal.x); f->store_real(val.normal.y); f->store_real(val.normal.z); f->store_real(val.d); } break; case Variant::QUAT: { f->store_32(VARIANT_QUAT); Quat val=p_property; f->store_real(val.x); f->store_real(val.y); f->store_real(val.z); f->store_real(val.w); } break; case Variant::_AABB: { f->store_32(VARIANT_AABB); AABB val=p_property; f->store_real(val.pos.x); f->store_real(val.pos.y); f->store_real(val.pos.z); f->store_real(val.size.x); f->store_real(val.size.y); f->store_real(val.size.z); } break; case Variant::MATRIX32: { f->store_32(VARIANT_MATRIX32); Matrix32 val=p_property; f->store_real(val.elements[0].x); f->store_real(val.elements[0].y); f->store_real(val.elements[1].x); f->store_real(val.elements[1].y); f->store_real(val.elements[2].x); f->store_real(val.elements[2].y); } break; case Variant::MATRIX3: { f->store_32(VARIANT_MATRIX3); Matrix3 val=p_property; f->store_real(val.elements[0].x); f->store_real(val.elements[0].y); f->store_real(val.elements[0].z); f->store_real(val.elements[1].x); f->store_real(val.elements[1].y); f->store_real(val.elements[1].z); f->store_real(val.elements[2].x); f->store_real(val.elements[2].y); f->store_real(val.elements[2].z); } break; case Variant::TRANSFORM: { f->store_32(VARIANT_TRANSFORM); Transform val=p_property; f->store_real(val.basis.elements[0].x); f->store_real(val.basis.elements[0].y); f->store_real(val.basis.elements[0].z); f->store_real(val.basis.elements[1].x); f->store_real(val.basis.elements[1].y); f->store_real(val.basis.elements[1].z); f->store_real(val.basis.elements[2].x); f->store_real(val.basis.elements[2].y); f->store_real(val.basis.elements[2].z); f->store_real(val.origin.x); f->store_real(val.origin.y); f->store_real(val.origin.z); } break; case Variant::COLOR: { f->store_32(VARIANT_COLOR); Color val=p_property; f->store_real(val.r); f->store_real(val.g); f->store_real(val.b); f->store_real(val.a); } break; case Variant::IMAGE: { f->store_32(VARIANT_IMAGE); Image val =p_property; if (val.empty()) { f->store_32(IMAGE_ENCODING_EMPTY); break; } int encoding=IMAGE_ENCODING_RAW; float quality=0.7; if (val.get_format() <= Image::FORMAT_INDEXED_ALPHA) { //can only compress uncompressed stuff if (p_hint.hint==PROPERTY_HINT_IMAGE_COMPRESS_LOSSY && Image::lossy_packer) { encoding=IMAGE_ENCODING_LOSSY; float qs=p_hint.hint_string.to_double(); if (qs!=0.0) quality=qs; } else if (p_hint.hint==PROPERTY_HINT_IMAGE_COMPRESS_LOSSLESS && Image::lossless_packer) { encoding=IMAGE_ENCODING_LOSSLESS; } } f->store_32(encoding); //raw encoding if (encoding==IMAGE_ENCODING_RAW) { f->store_32(val.get_width()); f->store_32(val.get_height()); f->store_32(val.get_mipmaps()); switch(val.get_format()) { case Image::FORMAT_GRAYSCALE: f->store_32(IMAGE_FORMAT_GRAYSCALE ); break; ///< one byte per pixel: f->store_32(IMAGE_FORMAT_ ); break; 0-255 case Image::FORMAT_INTENSITY: f->store_32(IMAGE_FORMAT_INTENSITY ); break; ///< one byte per pixel: f->store_32(IMAGE_FORMAT_ ); break; 0-255 case Image::FORMAT_GRAYSCALE_ALPHA: f->store_32(IMAGE_FORMAT_GRAYSCALE_ALPHA ); break; ///< two bytes per pixel: f->store_32(IMAGE_FORMAT_ ); break; 0-255. alpha 0-255 case Image::FORMAT_RGB: f->store_32(IMAGE_FORMAT_RGB ); break; ///< one byte R: f->store_32(IMAGE_FORMAT_ ); break; one byte G: f->store_32(IMAGE_FORMAT_ ); break; one byte B case Image::FORMAT_RGBA: f->store_32(IMAGE_FORMAT_RGBA ); break; ///< one byte R: f->store_32(IMAGE_FORMAT_ ); break; one byte G: f->store_32(IMAGE_FORMAT_ ); break; one byte B: f->store_32(IMAGE_FORMAT_ ); break; one byte A case Image::FORMAT_INDEXED: f->store_32(IMAGE_FORMAT_INDEXED ); break; ///< index byte 0-256: f->store_32(IMAGE_FORMAT_ ); break; and after image end: f->store_32(IMAGE_FORMAT_ ); break; 256*3 bytes of palette case Image::FORMAT_INDEXED_ALPHA: f->store_32(IMAGE_FORMAT_INDEXED_ALPHA ); break; ///< index byte 0-256: f->store_32(IMAGE_FORMAT_ ); break; and after image end: f->store_32(IMAGE_FORMAT_ ); break; 256*4 bytes of palette (alpha) case Image::FORMAT_BC1: f->store_32(IMAGE_FORMAT_BC1 ); break; // DXT1 case Image::FORMAT_BC2: f->store_32(IMAGE_FORMAT_BC2 ); break; // DXT3 case Image::FORMAT_BC3: f->store_32(IMAGE_FORMAT_BC3 ); break; // DXT5 case Image::FORMAT_BC4: f->store_32(IMAGE_FORMAT_BC4 ); break; // ATI1 case Image::FORMAT_BC5: f->store_32(IMAGE_FORMAT_BC5 ); break; // ATI2 case Image::FORMAT_PVRTC2: f->store_32(IMAGE_FORMAT_PVRTC2 ); break; case Image::FORMAT_PVRTC2_ALPHA: f->store_32(IMAGE_FORMAT_PVRTC2_ALPHA ); break; case Image::FORMAT_PVRTC4: f->store_32(IMAGE_FORMAT_PVRTC4 ); break; case Image::FORMAT_PVRTC4_ALPHA: f->store_32(IMAGE_FORMAT_PVRTC4_ALPHA ); break; case Image::FORMAT_ETC: f->store_32(IMAGE_FORMAT_ETC); break; case Image::FORMAT_CUSTOM: f->store_32(IMAGE_FORMAT_CUSTOM ); break; default: {} } int dlen = val.get_data().size(); f->store_32(dlen); DVector<uint8_t>::Read r = val.get_data().read(); f->store_buffer(r.ptr(),dlen); _pad_buffer(dlen); } else { DVector<uint8_t> data; if (encoding==IMAGE_ENCODING_LOSSY) { data=Image::lossy_packer(val,quality); } else if (encoding==IMAGE_ENCODING_LOSSLESS) { data=Image::lossless_packer(val); } int ds=data.size(); f->store_32(ds); if (ds>0) { DVector<uint8_t>::Read r = data.read(); f->store_buffer(r.ptr(),ds); _pad_buffer(ds); } } } break; case Variant::NODE_PATH: { f->store_32(VARIANT_NODE_PATH); NodePath np=p_property; f->store_16(np.get_name_count()); uint16_t snc = np.get_subname_count(); if (np.is_absolute()) snc|=0x8000; f->store_16(snc); for(int i=0;i<np.get_name_count();i++) f->store_32(get_string_index(np.get_name(i))); for(int i=0;i<np.get_subname_count();i++) f->store_32(get_string_index(np.get_subname(i))); f->store_32(get_string_index(np.get_property())); } break; case Variant::_RID: { f->store_32(VARIANT_RID); WARN_PRINT("Can't save RIDs"); RID val = p_property; f->store_32(val.get_id()); } break; case Variant::OBJECT: { f->store_32(VARIANT_OBJECT); RES res = p_property; if (res.is_null()) { f->store_32(OBJECT_EMPTY); return; // don't save it } if (res->get_path().length() && res->get_path().find("::")==-1) { f->store_32(OBJECT_EXTERNAL_RESOURCE); save_unicode_string(res->get_save_type()); String path=relative_paths?local_path.path_to_file(res->get_path()):res->get_path(); if (no_extensions) path=path.basename()+".*"; save_unicode_string(path); } else { if (!resource_map.has(res)) { f->store_32(OBJECT_EMPTY); ERR_EXPLAIN("Resource was not pre cached for the resource section, bug?"); ERR_FAIL(); } f->store_32(OBJECT_INTERNAL_RESOURCE); f->store_32(resource_map[res]); //internal resource } } break; case Variant::INPUT_EVENT: { f->store_32(VARIANT_INPUT_EVENT); WARN_PRINT("Can't save InputEvent (maybe it could..)"); } break; case Variant::DICTIONARY: { f->store_32(VARIANT_DICTIONARY); Dictionary d = p_property; f->store_32(uint32_t(d.size())|(d.is_shared()?0x80000000:0)); List<Variant> keys; d.get_key_list(&keys); for(List<Variant>::Element *E=keys.front();E;E=E->next()) { //if (!_check_type(dict[E->get()])) // continue; write_variant(E->get()); write_variant(d[E->get()]); } } break; case Variant::ARRAY: { f->store_32(VARIANT_ARRAY); Array a=p_property; f->store_32(uint32_t(a.size())|(a.is_shared()?0x80000000:0)); for(int i=0;i<a.size();i++) { write_variant(a[i]); } } break; case Variant::RAW_ARRAY: { f->store_32(VARIANT_RAW_ARRAY); DVector<uint8_t> arr = p_property; int len=arr.size(); f->store_32(len); DVector<uint8_t>::Read r = arr.read(); f->store_buffer(r.ptr(),len); _pad_buffer(len); } break; case Variant::INT_ARRAY: { f->store_32(VARIANT_INT_ARRAY); DVector<int> arr = p_property; int len=arr.size(); f->store_32(len); DVector<int>::Read r = arr.read(); for(int i=0;i<len;i++) f->store_32(r[i]); } break; case Variant::REAL_ARRAY: { f->store_32(VARIANT_REAL_ARRAY); DVector<real_t> arr = p_property; int len=arr.size(); f->store_32(len); DVector<real_t>::Read r = arr.read(); for(int i=0;i<len;i++) { f->store_real(r[i]); } } break; case Variant::STRING_ARRAY: { f->store_32(VARIANT_STRING_ARRAY); DVector<String> arr = p_property; int len=arr.size(); f->store_32(len); DVector<String>::Read r = arr.read(); for(int i=0;i<len;i++) { save_unicode_string(r[i]); } } break; case Variant::VECTOR3_ARRAY: { f->store_32(VARIANT_VECTOR3_ARRAY); DVector<Vector3> arr = p_property; int len=arr.size(); f->store_32(len); DVector<Vector3>::Read r = arr.read(); for(int i=0;i<len;i++) { f->store_real(r[i].x); f->store_real(r[i].y); f->store_real(r[i].z); } } break; case Variant::VECTOR2_ARRAY: { f->store_32(VARIANT_VECTOR2_ARRAY); DVector<Vector2> arr = p_property; int len=arr.size(); f->store_32(len); DVector<Vector2>::Read r = arr.read(); for(int i=0;i<len;i++) { f->store_real(r[i].x); f->store_real(r[i].y); } } break; case Variant::COLOR_ARRAY: { f->store_32(VARIANT_COLOR_ARRAY); DVector<Color> arr = p_property; int len=arr.size(); f->store_32(len); DVector<Color>::Read r = arr.read(); for(int i=0;i<len;i++) { f->store_real(r[i].r); f->store_real(r[i].g); f->store_real(r[i].b); f->store_real(r[i].a); } } break; default: { ERR_EXPLAIN("Invalid variant"); ERR_FAIL(); } } }
static RC PrintTable(SM_DbHandle &db, const char *tableName) { RC rc; RM_FileHandle *pTable; if ((rc = db.FindTableHandle(tableName, pTable))) return rc; int recordSize = pTable->header.recordSize; vector<SM_ActiveAttr> *attributes; if ((rc = db.AllAttributes(tableName, attributes))) return rc; RM_FileScan allScan; if ((rc = allScan.OpenScan(*pTable, INT, 0, 0, 0, NO_OP, NULL))) return rc; RM_Record record; int recordCount = 0; printf("Table: %s\n", tableName); while ((rc = allScan.GetNextRec(record)) == 0) { RID rid; if ((rc = record.GetRid(rid))) return rc; PageNum pageNum; int slotNum; if ((rc = rid.GetPageNum(pageNum))) return rc; if ((rc = rid.GetSlotNum(slotNum))) return rc; char *data; if ((rc = record.GetData(data))) return rc; printf("RID: (%d,%d)\n", pageNum, slotNum); vector<SM_ActiveAttr>::iterator pAttr; int *pNullBitmap = (int *)(data + recordSize - sizeof(int)); for (pAttr = attributes->begin(); pAttr != attributes->end(); ++pAttr) { SM_Attribute *attr = &pAttr->record; if (*pNullBitmap & (1 << attr->number)) printf(" %s: Null\n", attr->attrName); else if (attr->attrType == INT) printf(" %s: %d\n", attr->attrName, *(int *)(data + attr->attrOffset)); else if (attr->attrType == FLOAT) printf(" %s: %f\n", attr->attrName, *(float *)(data + attr->attrOffset)); else if (attr->attrType == STRING) printf(" %s: %s\n", attr->attrName, data + attr->attrOffset); } printf("\n"); recordCount++; } if (rc != RM_ERR_EOF) return rc; if ((rc = allScan.CloseScan())) return rc; printf("\nTotal %d records.\n", recordCount); return 0; }