cxBool cxDBOpen(cxAny db,cxString file,cxString table,cxBool rdonly) { CX_ASSERT(file != NULL && table != NULL, "args error"); cxDBEnv env = cxDBGetEnv(db); cxDB this = db; if(rdonly){ this->flags = DB_RDONLY; }else{ this->flags = DB_CREATE; } this->ret = db_create(&this->dbptr, env->env, 0); CX_RETURN(this->ret != 0,false); this->ret = CX_METHOD_FIRE(this->ret, this->OpenBefore,db); CX_RETURN(this->ret != 0,false); cxDBTxn txn = cxStackTop(env->txn); this->ret = this->dbptr->open(this->dbptr,cxDBTxnPtr(txn),cxStringBody(file),cxStringBody(table),this->type,this->flags,0); if(this->ret != 0){ CX_ERROR("open db error %s:%s",cxStringBody(file),cxStringBody(table)); return false; } CX_RETURN(this->ret != 0,false); CX_RETAIN_SWAP(this->file, file); CX_RETAIN_SWAP(this->table, table); return CX_METHOD_FIRE(true, this->OpenAfter,db); }
void cxSpriteSetShader(cxAny pview,cxConstChars key) { CX_RETURN(key == NULL); cxShader shader = cxOpenGLShader(key); CX_RETURN(shader == NULL); cxSprite this = pview; CX_RETAIN_SWAP(this->shader, shader); }
void cxObjectRetain(cxAny ptr) { CX_RETURN(ptr == NULL); cxObject object = (cxObject)ptr; CX_ASSERT(object->cxRefcount > 0, "retain count must > 0"); object->cxRefcount ++; }
void cxEngineDraw() { CX_RETURN(isExit); cxEngine engine = cxEngineInstance(); CX_RETURN(!engine->isInit || engine->isPause); cxOpenGLClear(); cxAutoPoolBegin(); cxDouble now = cxTimestamp(); engine->frameDelta = now - engine->lastTime; CX_SIGNAL_FIRE(engine->onUpdate, CX_FUNC_TYPE(cxAny,cxFloat),CX_SLOT_OBJECT,engine->frameDelta); kmGLPushMatrix(); cxViewDraw(engine->window); kmGLPopMatrix(); engine->lastTime = now; cxAutoPoolClean(); }
void cxActionSetSplit(cxAny pav,cxInt split) { cxAction this = pav; CX_RETURN(this->split == split); this->split = split; this->splitDelta = 1.0f / (cxFloat)(split - 1); }
static cxJson jsonToAny(json_t *v) { CX_RETURN(v == NULL,NULL); cxJson rv = CX_CREATE(cxJson); rv->json = json_incref(v); return rv; }
cxAction cxActionRootAttachView(cxAny pview,cxConstChars url) { cxAny action = cxActionRootGet(url); CX_RETURN(action == NULL, NULL); cxViewAppendAction(pview, action); return action; }
static cxJson jsonToArray(json_t *v) { CX_RETURN(v == NULL,NULL); if(!json_is_array(v)){ return NULL; } return jsonToAny(v); }
static cxJson jsonToObject(json_t *v) { CX_RETURN(v == NULL,NULL); if(!json_is_object(v)){ return NULL; } return jsonToAny(v); }
void cxSpriteSetTextureURL(cxAny pview,cxConstChars url,cxBool useTexSize) { CX_RETURN(url == NULL); cxSprite this = pview; cxUrlPath path = cxUrlPathParse(url); CX_RETURN(path == NULL); cxTexture texture = cxTextureFactoryLoadFile(path->path); CX_ASSERT(texture != NULL, "texture load failed %s",path->path); cxSpriteSetTexture(this, texture); //use texture size cxBool uts = useTexSize; if(path->count > 1){ cxSpriteSetTextureKey(this, path->key, uts); }else if(uts){ cxViewSetSize(this, texture->size); } }
static cxInt64 jsonToInt64(json_t *v,cxInt64 dv) { CX_RETURN(v == NULL,dv); v = jsonParseRegisterValue(v); if(json_is_string(v)){ return atoll(json_string_value(v)); } return (cxInt64)json_integer_value(v); }
static void cxViewCheckChipmunkSupport(cxReaderAttrInfo *info) { cxBool support = cxXMLReadBoolAttr(info, "cxChipmunk.support", false); CX_RETURN(!support); cxView this = info->object; allocator->free(this->cAttr); this->cAttr = allocator->malloc(sizeof(cxChipmunkAttr)); cxChipmunkGetAttr(info, this->cAttr); }
cxAny cxEngineTypes(cxConstChars url) { CX_RETURN(url == NULL, NULL); cxEngine this = cxEngineInstance(); cxUrlPath path = cxUrlPathParse(url); CX_RETURN(path == NULL, NULL); cxHashRoot sets = cxHashGet(this->datasets, cxHashStrKey(path->path)); if(sets == NULL){ sets = cxHashRootCreate(path->path); CX_RETURN(sets == NULL, NULL); cxHashSet(this->datasets, cxHashStrKey(path->path), sets); } cxAny ret = NULL; if(path->count >= 2){ ret = cxHashGet(sets->items, cxHashStrKey(path->key)); } return ret; }
static cxDouble jsonToDouble(json_t *v,cxDouble dv) { CX_RETURN(v == NULL,dv); v = jsonParseRegisterValue(v); if(json_is_string(v)){ return atof(json_string_value(v)); } return json_number_value(v); }
static cxInt jsonToInt(json_t *v,cxInt dv) { CX_RETURN(v == NULL,dv); v = jsonParseRegisterValue(v); if(json_is_string(v)){ return atoi(json_string_value(v)); } return (cxInt)json_number_value(v); }
void cxObjectRelease(cxAny ptr) { CX_RETURN(ptr == NULL); cxObject object = (cxObject)ptr; CX_ASSERT(object->cxRefcount > 0, "retain count must > 0"); object->cxRefcount --; if(object->cxRefcount == 0) { cxObjectDestroy(ptr); } }
void cxEngineResume() { CX_RETURN(isExit); cxEngine engine = cxEngineInstance(); engine->isPause = false; CX_SIGNAL_FIRE(engine->onResume, CX_FUNC_TYPE(cxAny),CX_SLOT_OBJECT); if(engine->isInit){ cxResumeMusic(); } }
cxBool cxConstCharsIsNumber(cxConstChars s) { CX_RETURN(s == NULL, false); for(cxInt i = 0; i < strlen(s); i++){ if(!isnumber(s[i])){ return false; } } return true; }
void cxEnginePause() { CX_RETURN(isExit); cxEngine engine = cxEngineInstance(); engine->isPause = true; CX_SIGNAL_FIRE(engine->onPause, CX_FUNC_TYPE(cxAny),CX_SLOT_OBJECT); if(engine->isInit){ cxPauseMusic(); } }
void cxSpriteSetTextureAttr(cxAny pview,cxTextureAttr attr) { CX_RETURN(attr == NULL); cxSpriteSetTexture(pview, attr->texture); cxSpriteSetBoxTex(pview, attr->box); // if(cxViewZeroSize(pview)){ cxViewSetSize(pview, attr->size); } }
void cxEngineExit() { CX_RETURN(isExit); cxEngine engine = cxEngineInstance(); CX_EVENT_FIRE(engine, onExit); cxEnginePause(); cxEngineDestroy(); cxAllocatorFree(); cxEngineTerminate(); isExit = true; }
void cxSpriteDraw(cxAny pview) { cxSprite this = pview; CX_RETURN(this->texture == NULL); cxSpriteBindTexture(pview); cxOpenGLActiveAttribs(cxVertexAttribFlagPosColorTex); glVertexAttribPointer(cxVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(cxVec3f), &this->vbox); glVertexAttribPointer(cxVertexAttribTexcoord, 2, GL_FLOAT, GL_FALSE, sizeof(cxTex2f), &this->tbox); glVertexAttribPointer(cxVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(cxColor4f), &this->cbox); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }
cxAny cxAutoPoolAppend(cxAny any) { CX_RETURN(any == NULL,NULL); cxObject object = any; cxAutoPool pool = cxAutoPoolInstance(); cxArrayAppend(pool->objects, any); CX_ASSERT(object->cxRefcount > 1, "apped to auto pool object,refcount > 1"); CX_UNUSED_PARAM(object); CX_RELEASE(any); return any; }
cxXMLScript cxEngineGetXMLScript(cxConstChars file) { cxEngine this = cxEngineInstance(); CX_RETURN(file == NULL,NULL); cxXMLScript script = cxHashGet(this->scripts, cxHashStrKey(file)); if(script != NULL){ return script; } script = CX_CREATE(cxXMLScript); cxStream stream = cxAssetsStreamCreate(file); CX_RETURN(stream == NULL, NULL); CX_RETAIN_SWAP(script->bytes, cxStreamAllBytes(stream)); CX_RETURN(script->bytes == NULL, NULL); cxHashSet(this->scripts, cxHashStrKey(file), script); return script; }
void cxAtlasUpdateScale9(cxAny pview) { cxAtlas this = pview; CX_RETURN(!this->scale9.enable); CX_ASSERT(!cxViewZeroSize(pview) && this->cxSprite.texture != NULL, "must set texture and size"); cxAtlasClean(pview); cxSize2f size = cxViewSize(this); cxRect4f tr = cxBoxTex2fToRect4f(this->cxSprite.texCoord); cxSize2f tsize = cxSize2fv(this->cxSprite.texture->size.w * tr.w, this->cxSprite.texture->size.h * tr.h); cxFloat txs[]={0.0f, this->scale9.box.l/tsize.w, (tsize.w - this->scale9.box.r)/tsize.w, 1.0f}; cxFloat tys[]={0.0f, this->scale9.box.t/tsize.h, (tsize.h - this->scale9.box.b)/tsize.h, 1.0f}; for(int i=0; i < 4; i++){ txs[i] = txs[i] * tr.w + tr.x; tys[i] = tys[i] * tr.h + tr.y; } cxFloat bxs[]={0.0f, this->scale9.box.l, size.w - this->scale9.box.r, size.w}; cxFloat bys[]={0.0f, this->scale9.box.r, size.h - this->scale9.box.b, size.h}; cxFloat tx1=0,ty1=0,tx2=0,ty2=0; cxFloat bx1=0,by1=0,bx2=0,by2=0; cxFloat offx=0,offy=0; cxColor4f color =cxViewColor(this); for(int i=0; i < 9;i++){ tx1 = txs[i%3]; tx2 = txs[i%3 + 1]; ty1 = tys[i/3]; ty2 = tys[i/3 + 1]; bx1 = bxs[i%3]; bx2 = bxs[i%3 + 1]; by1 = bys[i/3]; by2 = bys[i/3 + 1]; cxFloat hw = (bx2 - bx1)/2.0f; cxFloat hh = (by2 - by1)/2.0f; if(hw == 0 || hh == 0){ continue; } offx = (bx2 - bx1)/2.0f + bx1 - size.w/2.0f; offy = (size.h - (by2 - by1))/2.0f - by1; cxBoxPoint bp; bp.lb.colors = color; bp.lt.colors = color; bp.rb.colors = color; bp.rt.colors = color; bp.lb.vertices = cxVec3fv(-hw + offx, -hh + offy, 0.0f); bp.rb.vertices = cxVec3fv( hw + offx, -hh + offy, 0.0f); bp.lt.vertices = cxVec3fv(-hw + offx, hh + offy, 0.0f); bp.rt.vertices = cxVec3fv( hw + offx, hh + offy, 0.0f); bp.lb.texcoords = cxTex2fv(tx1, ty2); bp.rb.texcoords = cxTex2fv(tx2, ty2); bp.lt.texcoords = cxTex2fv(tx1, ty1); bp.rt.texcoords = cxTex2fv(tx2, ty1); cxAtlasAppend(this, &bp); } }
cxBool cxHashRootLoadWithReader(cxHashRoot root,xmlTextReaderPtr reader) { cxBool ret = false; while(xmlTextReaderRead(reader)){ if(root->isError){ break; } if(xmlTextReaderNodeType(reader) != XML_READER_TYPE_ELEMENT){ continue; } cxConstChars temp = cxXMLReadElementName(reader); if(ELEMENT_IS_TYPE(cxHashRoot)){ ret = true; break; } } CX_RETURN(!ret,false); cxAutoPoolPush(); while(xmlTextReaderRead(reader)){ if(xmlTextReaderNodeType(reader) != XML_READER_TYPE_ELEMENT){ continue; } cxConstChars temp = cxXMLReadElementName(reader); if(ELEMENT_IS_TYPE(cxDBEnv)){ cxHashRootReadDBEnv(root,reader); continue; } cxConstChars sid = cxXMLAttr(reader, "id"); if(sid == NULL){ CX_WARN("element %s:not set id,data not save to hash table",temp); continue; } cxAny object = NULL; if(ELEMENT_IS_TYPE(cxString)){ //cxTypesString object = cxHashRootReadString(root,reader); }else if(ELEMENT_IS_TYPE(cxHash)){ //cxTypesHash object = cxHashRootReadHash(root,reader); }else if(ELEMENT_IS_TYPE(cxArray)){ //cxTypesArray object = cxHashRootReadArray(root,reader); }else{ //cxTypesNumber object = cxHashRootReadNumber(root, temp, reader); } if(object != NULL){ cxHashSet(root->items, cxHashStrKey(sid), object); } } cxAutoPoolPop(); return ret; }
static cxBool jsonToBool(json_t *v,cxBool dv) { CX_RETURN(v == NULL,dv); v = jsonParseRegisterValue(v); if(json_is_string(v)){ return strcasecmp(json_string_value(v), "true") == 0; } if(json_is_integer(v)){ return json_integer_value(v) != 0; } return json_is_true(v); }
static void cxPolygonReadAttr(cxReaderAttrInfo *info) { cxSpriteReadAttr(info); cxConstChars points = cxXMLAttr(info->reader, "cxPolygon.points"); CX_RETURN(points == NULL); cxTypes type = cxEngineTypes(points); CX_ASSERT(cxTypesIsType(type, cxTypesArray), "must is array"); cxArray list = type->any; CX_ARRAY_FOREACH(list, ele){ cxNumber bp = cxArrayObject(ele); cxPolygonAppend(info->object, cxNumberToPoint(bp)); }
CX_SETTER_DEF(cxSprite, texture) { cxConstChars texture = NULL; cxBool uts = true; if(cxJsonIsString(value)){ texture = cxJsonToConstChars(value); }else if(cxJsonIsObject(value)){ uts = cxJsonBool(value, "uts", uts); texture = cxJsonConstChars(value, "url"); } CX_RETURN(texture == NULL); cxSpriteSetTextureURL(this, texture, uts); }
void cxSpriteDraw(cxAny pview) { cxSprite this = pview; CX_RETURN(this->texture == NULL); cxOpenGLSetBlendFactor(this->sfactor, this->dfactor); cxShaderUsing(this->shader,this->texture->isAtlas); cxTextureBind(this->texture); cxOpenGLActiveAttribs(cxVertexAttribFlagPosColorTex); glVertexAttribPointer(cxVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(cxVec3f), &this->vbox); glVertexAttribPointer(cxVertexAttribTexcoord, 2, GL_FLOAT, GL_FALSE, sizeof(cxTexCoord2f), &this->tbox); glVertexAttribPointer(cxVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(cxColor4f), &this->cbox); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }