void _spBoundingBoxAttachment_dispose (spAttachment* attachment) {
	spBoundingBoxAttachment* self = SUB_CAST(spBoundingBoxAttachment, attachment);

	_spAttachment_deinit(attachment);

	FREE(self->vertices);
	FREE(self);
}
Example #2
0
Attachment* Skin_getAttachment (const Skin* self, int slotIndex, const char* name) {
	const _Entry* entry = SUB_CAST(_Internal, self) ->entries;
	while (entry) {
		if (entry->slotIndex == slotIndex && strcmp(entry->name, name) == 0) return entry->attachment;
		entry = entry->next;
	}
	return 0;
}
void spSkeletonBounds_dispose (spSkeletonBounds* self) {
	int i;
	for (i = 0; i < SUB_CAST(_spSkeletonBounds, self)->capacity; ++i)
		if (self->polygons[i]) spPolygon_dispose(self->polygons[i]);
	FREE(self->polygons);
	FREE(self->boundingBoxes);
	FREE(self);
}
void SkeletonBounds_dispose (SkeletonBounds* self) {
	int i = 0;
	for (; i < SUB_CAST(_Internal, self)->capacity; ++i)
		if (self->polygons[i]) BoundingPolygon_dispose(self->polygons[i]);
	FREE(self->polygons);
	FREE(self->boundingBoxes);
	FREE(self);
}
Example #5
0
void _spPathAttachment_dispose (spAttachment* attachment) {
	spPathAttachment* self = SUB_CAST(spPathAttachment, attachment);

	_spVertexAttachment_deinit(SUPER(self));

	FREE(self->lengths);
	FREE(self);
}
void _Cocos2dxAtlasPage_dispose (AtlasPage* page) {
	Cocos2dxAtlasPage* self = SUB_CAST(Cocos2dxAtlasPage, page);
	_AtlasPage_deinit(SUPER(self));

	CC_SAFE_RELEASE_NULL(self->texture);
	CC_SAFE_RELEASE_NULL(self->atlas);

	FREE(page);
}
void _Cocos2dxRegionAttachment_draw (Attachment* attachment, Slot* slot) {
	Cocos2dxRegionAttachment* self = SUB_CAST(Cocos2dxRegionAttachment, attachment);
	Cocos2dxSkeleton* skeleton = SUB_CAST(Cocos2dxSkeleton, slot->skeleton);

	GLubyte r = SUPER(skeleton)->r * slot->r * 255;
	GLubyte g = SUPER(skeleton)->g * slot->g * 255;
	GLubyte b = SUPER(skeleton)->b * slot->b * 255;
	GLubyte a = SUPER(skeleton)->a * slot->a * 255;
	ccV3F_C4B_T2F_Quad* quad = &self->quad;
	quad->bl.colors.r = r;
	quad->bl.colors.g = g;
	quad->bl.colors.b = b;
	quad->bl.colors.a = a;
	quad->tl.colors.r = r;
	quad->tl.colors.g = g;
	quad->tl.colors.b = b;
	quad->tl.colors.a = a;
	quad->tr.colors.r = r;
	quad->tr.colors.g = g;
	quad->tr.colors.b = b;
	quad->tr.colors.a = a;
	quad->br.colors.r = r;
	quad->br.colors.g = g;
	quad->br.colors.b = b;
	quad->br.colors.a = a;

	float* offset = SUPER(self)->offset;
	quad->bl.vertices.x = offset[0] * slot->bone->m00 + offset[1] * slot->bone->m01 + slot->bone->worldX;
	quad->bl.vertices.y = offset[0] * slot->bone->m10 + offset[1] * slot->bone->m11 + slot->bone->worldY;
	quad->tl.vertices.x = offset[2] * slot->bone->m00 + offset[3] * slot->bone->m01 + slot->bone->worldX;
	quad->tl.vertices.y = offset[2] * slot->bone->m10 + offset[3] * slot->bone->m11 + slot->bone->worldY;
	quad->tr.vertices.x = offset[4] * slot->bone->m00 + offset[5] * slot->bone->m01 + slot->bone->worldX;
	quad->tr.vertices.y = offset[4] * slot->bone->m10 + offset[5] * slot->bone->m11 + slot->bone->worldY;
	quad->br.vertices.x = offset[6] * slot->bone->m00 + offset[7] * slot->bone->m01 + slot->bone->worldX;
	quad->br.vertices.y = offset[6] * slot->bone->m10 + offset[7] * slot->bone->m11 + slot->bone->worldY;

	// cocos2dx doesn't handle batching for us, so we'll just force a single texture per skeleton.
	skeleton->node->atlas = self->atlas;
	if (self->atlas->getCapacity() <= skeleton->node->quadCount) {
		if (!self->atlas->resizeCapacity(self->atlas->getCapacity() * 2)) return;
	}
	self->atlas->updateQuad(quad, skeleton->node->quadCount++);
}
Example #8
0
void _AnimationState_clearQueue (AnimationState* self) {
	_Internal* internal = SUB_CAST(_Internal, self);
	_Entry* entry = internal->queue;
	while (entry) {
		_Entry* nextEntry = entry->next;
		FREE(entry);
		entry = nextEntry;
	}
	internal->queue = 0;
}
void _spMeshAttachment_dispose (spAttachment* attachment) {
	spMeshAttachment* self = SUB_CAST(spMeshAttachment, attachment);
	_spAttachment_deinit(attachment);
	FREE(self->path);
	FREE(self->vertices);
	FREE(self->regionUVs);
	FREE(self->uvs);
	FREE(self->triangles);
	FREE(self->edges);
	FREE(self);
}
Example #10
0
void spSkin_attachAll (const spSkin* self, spSkeleton* skeleton, const spSkin* oldSkin) {
	const _Entry *entry = SUB_CAST(_spSkin, oldSkin)->entries;
	while (entry) {
		spSlot *slot = skeleton->slots[entry->slotIndex];
		if (slot->attachment == entry->attachment) {
			spAttachment *attachment = spSkin_getAttachment(self, entry->slotIndex, entry->name);
			if (attachment) spSlot_setAttachment(slot, attachment);
		}
		entry = entry->next;
	}
}
Example #11
0
void spSkin_dispose (spSkin* self) {
	_Entry* entry = SUB_CAST(_spSkin, self)->entries;
	while (entry) {
		_Entry* nextEntry = entry->next;
		_Entry_dispose(entry);
		entry = nextEntry;
	}

	FREE(self->name);
	FREE(self);
}
void _spSkinnedMeshAttachment_dispose (spAttachment* attachment) {
	spSkinnedMeshAttachment* self = SUB_CAST(spSkinnedMeshAttachment, attachment);
	_spAttachment_deinit(attachment);
	FREE(self->path);
	FREE(self->bones);
	FREE(self->weights);
	FREE(self->regionUVs);
	FREE(self->uvs);
	FREE(self->triangles);
	FREE(self->edges);
	FREE(self);
}
Example #13
0
const char* spSkin_getAttachmentName (const spSkin* self, int slotIndex, int attachmentIndex) {
	const _Entry* entry = SUB_CAST(_spSkin, self)->entries;
	int i = 0;
	while (entry) {
		if (entry->slotIndex == slotIndex) {
			if (i == attachmentIndex) return entry->name;
			i++;
		}
		entry = entry->next;
	}
	return 0;
}
Example #14
0
void _spMeshAttachment_dispose (spAttachment* attachment) {
	spMeshAttachment* self = SUB_CAST(spMeshAttachment, attachment);
	FREE(self->path);
	FREE(self->uvs);
	if (!self->parentMesh) {
		_spVertexAttachment_deinit(SUPER(self));
		FREE(self->regionUVs);
		FREE(self->triangles);
		FREE(self->edges);
	} else
		_spAttachment_deinit(attachment);
	FREE(self);
}
ccV3F_C4B_T2F_Quad* RegionAttachment_updateQuad (Attachment* attachment, Slot* slot) {
	Cocos2dxRegionAttachment* self = SUB_CAST(Cocos2dxRegionAttachment, attachment);
	Cocos2dxSkeleton* skeleton = SUB_CAST(Cocos2dxSkeleton, slot->skeleton);

	GLubyte r = SUPER(skeleton)->r * slot->r * 255;
	GLubyte g = SUPER(skeleton)->g * slot->g * 255;
	GLubyte b = SUPER(skeleton)->b * slot->b * 255;
	GLubyte a = SUPER(skeleton)->a * slot->a * 255;
	ccV3F_C4B_T2F_Quad* quad = &self->quad;
	quad->bl.colors.r = r;
	quad->bl.colors.g = g;
	quad->bl.colors.b = b;
	quad->bl.colors.a = a;
	quad->tl.colors.r = r;
	quad->tl.colors.g = g;
	quad->tl.colors.b = b;
	quad->tl.colors.a = a;
	quad->tr.colors.r = r;
	quad->tr.colors.g = g;
	quad->tr.colors.b = b;
	quad->tr.colors.a = a;
	quad->br.colors.r = r;
	quad->br.colors.g = g;
	quad->br.colors.b = b;
	quad->br.colors.a = a;

	float* offset = SUPER(self)->offset;
	quad->bl.vertices.x = offset[0] * slot->bone->m00 + offset[1] * slot->bone->m01 + slot->bone->worldX;
	quad->bl.vertices.y = offset[0] * slot->bone->m10 + offset[1] * slot->bone->m11 + slot->bone->worldY;
	quad->tl.vertices.x = offset[2] * slot->bone->m00 + offset[3] * slot->bone->m01 + slot->bone->worldX;
	quad->tl.vertices.y = offset[2] * slot->bone->m10 + offset[3] * slot->bone->m11 + slot->bone->worldY;
	quad->tr.vertices.x = offset[4] * slot->bone->m00 + offset[5] * slot->bone->m01 + slot->bone->worldX;
	quad->tr.vertices.y = offset[4] * slot->bone->m10 + offset[5] * slot->bone->m11 + slot->bone->worldY;
	quad->br.vertices.x = offset[6] * slot->bone->m00 + offset[7] * slot->bone->m01 + slot->bone->worldX;
	quad->br.vertices.y = offset[6] * slot->bone->m10 + offset[7] * slot->bone->m11 + slot->bone->worldY;

	return quad;
}
Example #16
0
void AnimationState_update (AnimationState* self, float delta) {
	_Entry* next;
	_Internal* internal = SUB_CAST(_Internal, self);

	self->time += delta;
	internal->previousTime += delta;
	internal->mixTime += delta;

	if (internal->queue && self->time >= internal->queue->delay) {
		_AnimationState_setAnimation(self, internal->queue->animation, internal->queue->loop);
		next = internal->queue->next;
		FREE(internal->queue);
		internal->queue = next;
	}
}
Attachment* _AtlasAttachmentLoader_newAttachment (AttachmentLoader* loader, Skin* skin, AttachmentType type, const char* name) {
	AtlasAttachmentLoader* self = SUB_CAST(AtlasAttachmentLoader, loader);
	switch (type) {
	case ATTACHMENT_REGION: {
		AtlasRegion* region = Atlas_findRegion(self->atlas, name);
		if (!region) {
			_AttachmentLoader_setError(loader, "Region not found: ", name);
			return 0;
		}
		return SUPER_CAST(Attachment, RegionAttachment_create(name, region)) ;
	}
	default:
		_AttachmentLoader_setUnknownTypeError(loader, type);
		return 0;
	}
}
Example #18
0
void _AnimationState_setAnimation (AnimationState* self, Animation* newAnimation, int/*bool*/loop) {
	_Internal* internal = SUB_CAST(_Internal, self);
	internal->previous = 0;
	if (newAnimation && self->animation && self->data) {
		internal->mixDuration = AnimationStateData_getMix(self->data, self->animation, newAnimation);
		if (internal->mixDuration > 0) {
			internal->mixTime = 0;
			internal->previous = self->animation;
			internal->previousTime = self->time;
			internal->previousLoop = self->loop;
		}
	}
	CONST_CAST(Animation*, self->animation) = newAnimation;
	self->loop = loop;
	self->time = 0;
}
Example #19
0
void spSkeleton_updateWorldTransform (const spSkeleton* self) {
	int i, ii, nn, last;
	_spSkeleton* internal = SUB_CAST(_spSkeleton, self);

	for (i = 0; i < self->bonesCount; ++i)
		self->bones[i]->rotationIK = self->bones[i]->rotation;

	i = 0;
	last = internal->boneCacheCount - 1;
	while (1) {
		for (ii = 0, nn = internal->boneCacheCounts[i]; ii < nn; ++ii)
			spBone_updateWorldTransform(internal->boneCache[i][ii]);
		if (i == last) break;
		spIkConstraint_apply(self->ikConstraints[i]);
		i++;
	}
}
Example #20
0
void AnimationState_apply (AnimationState* self, Skeleton* skeleton) {
	_Internal* internal;
	float alpha;

	if (!self->animation) return;
	internal = SUB_CAST(_Internal, self);
	if (internal->previous) {
		Animation_apply(internal->previous, skeleton, internal->previousTime, internal->previousLoop);
		alpha = internal->mixTime / internal->mixDuration;
		if (alpha >= 1) {
			alpha = 1;
			internal->previous = 0;
		}
		Animation_mix(self->animation, skeleton, self->time, self->loop, alpha);
	} else
		Animation_apply(self->animation, skeleton, self->time, self->loop);
}
void spSkeletonBounds_update (spSkeletonBounds* self, spSkeleton* skeleton, int/*bool*/updateAabb) {
	int i;

	_spSkeletonBounds* internal = SUB_CAST(_spSkeletonBounds, self);
	if (internal->capacity < skeleton->slotsCount) {
		spPolygon** newPolygons;

		FREE(self->boundingBoxes);
		self->boundingBoxes = MALLOC(spBoundingBoxAttachment*, skeleton->slotsCount);

		newPolygons = CALLOC(spPolygon*, skeleton->slotsCount);
		memcpy(newPolygons, self->polygons, sizeof(spPolygon*) * internal->capacity);
		FREE(self->polygons);
		self->polygons = newPolygons;

		internal->capacity = skeleton->slotsCount;
	}
void SkeletonBounds_update (SkeletonBounds* self, Skeleton* skeleton, int/*bool*/updateAabb) {
	int i;

	_Internal* internal = SUB_CAST(_Internal, self);
	if (internal->capacity < skeleton->slotCount) {
		BoundingPolygon** newPolygons;

		FREE(self->boundingBoxes);
		self->boundingBoxes = MALLOC(BoundingBoxAttachment*, skeleton->slotCount);

		newPolygons = CALLOC(BoundingPolygon*, skeleton->slotCount);
		memcpy(newPolygons, self->polygons, internal->capacity);
		FREE(self->polygons);
		self->polygons = newPolygons;

		internal->capacity = skeleton->slotCount;
	}
Example #23
0
void spSkeleton_updateWorldTransform (const spSkeleton* self) {
	int i;
	_spSkeleton* internal = SUB_CAST(_spSkeleton, self);

	for (i = 0; i < internal->updateCacheCount; ++i) {
		_spUpdate* update = internal->updateCache + i;
		switch (update->type) {
		case SP_UPDATE_BONE:
			spBone_updateWorldTransform((spBone*)update->object);
			break;
		case SP_UPDATE_IK_CONSTRAINT:
			spIkConstraint_apply((spIkConstraint*)update->object);
			break;
		case SP_UPDATE_TRANSFORM_CONSTRAINT:
			spTransformConstraint_apply((spTransformConstraint*)update->object);
			break;
		}
	}
}
Example #24
0
void spSkeleton_updateCache (const spSkeleton* self) {
	int i, ii;
	_spUpdate* update;
	_spSkeleton* internal = SUB_CAST(_spSkeleton, self);
	int capacity = self->bonesCount + self->transformConstraintsCount + self->ikConstraintsCount;

	FREE(internal->updateCache);
	internal->updateCache = MALLOC(_spUpdate, capacity);
	internal->updateCacheCount = 0;

	for (i = 0; i < self->bonesCount; ++i) {
		spBone* bone = self->bones[i];
		update = internal->updateCache + internal->updateCacheCount++;
		update->type = SP_UPDATE_BONE;
		update->object = bone;
		for (ii = 0; ii < self->ikConstraintsCount; ++ii) {
			spIkConstraint* ikConstraint = self->ikConstraints[ii];
			if (bone == ikConstraint->bones[ikConstraint->bonesCount - 1]) {
				update = internal->updateCache + internal->updateCacheCount++;
				update->type = SP_UPDATE_IK_CONSTRAINT;
				update->object = ikConstraint;
				break;
			}
		}
	}

	for (i = 0; i < self->transformConstraintsCount; ++i) {
		spTransformConstraint* transformConstraint = self->transformConstraints[i];
		for (ii = internal->updateCacheCount - 1; ii >= 0; --ii) {
			if (internal->updateCache[ii].object == transformConstraint->bone) {
				int insertIndex = ii + 1;
				update = internal->updateCache + insertIndex;
				memmove(update + 1, update, (internal->updateCacheCount - insertIndex) * sizeof(_spUpdate));
				update->type = SP_UPDATE_TRANSFORM_CONSTRAINT;
				update->object = transformConstraint;
				internal->updateCacheCount++;
				break;
			}
		}
	}
}
RegionAttachment* RegionAttachment_create (const char* name, AtlasRegion* region) {
	Cocos2dxRegionAttachment* self = NEW(Cocos2dxRegionAttachment);
	_RegionAttachment_init(SUPER(self), name);
	VTABLE(Attachment, self) ->dispose = _Cocos2dxRegionAttachment_dispose;
	VTABLE(Attachment, self) ->draw = _Cocos2dxRegionAttachment_draw;

	Cocos2dxAtlasPage* page = SUB_CAST(Cocos2dxAtlasPage, region->page);
	self->atlas = page->atlas;
	const CCSize& size = page->texture->getContentSizeInPixels();
	float u = region->x / size.width;
	float u2 = (region->x + region->width) / size.width;
	float v = region->y / size.height;
	float v2 = (region->y + region->height) / size.height;
	ccV3F_C4B_T2F_Quad* quad = &self->quad;
	if (region->rotate) {
		quad->tl.texCoords.u = u;
		quad->tl.texCoords.v = v2;
		quad->tr.texCoords.u = u;
		quad->tr.texCoords.v = v;
		quad->br.texCoords.u = u2;
		quad->br.texCoords.v = v;
		quad->bl.texCoords.u = u2;
		quad->bl.texCoords.v = v2;
	} else {
		quad->bl.texCoords.u = u;
		quad->bl.texCoords.v = v2;
		quad->tl.texCoords.u = u;
		quad->tl.texCoords.v = v;
		quad->tr.texCoords.u = u2;
		quad->tr.texCoords.v = v;
		quad->br.texCoords.u = u2;
		quad->br.texCoords.v = v2;
	}

	quad->bl.vertices.z = 0;
	quad->tl.vertices.z = 0;
	quad->tr.vertices.z = 0;
	quad->br.vertices.z = 0;

	return SUPER(self);
}
Example #26
0
void spSkeleton_dispose (spSkeleton* self) {
	int i;
	_spSkeleton* internal = SUB_CAST(_spSkeleton, self);

	for (i = 0; i < internal->boneCacheCount; ++i)
		FREE(internal->boneCache[i]);
	FREE(internal->boneCache);
	FREE(internal->boneCacheCounts);

	for (i = 0; i < self->bonesCount; ++i)
		spBone_dispose(self->bones[i]);
	FREE(self->bones);

	for (i = 0; i < self->slotsCount; ++i)
		spSlot_dispose(self->slots[i]);
	FREE(self->slots);

	for (i = 0; i < self->ikConstraintsCount; ++i)
		spIkConstraint_dispose(self->ikConstraints[i]);
	FREE(self->ikConstraints);

	FREE(self->drawOrder);
	FREE(self);
}
Example #27
0
void spSkin_addAttachment (spSkin* self, int slotIndex, const char* name, spAttachment* attachment) {
	_Entry* newEntry = _Entry_create(slotIndex, name, attachment);
	newEntry->next = SUB_CAST(_spSkin, self)->entries;
	SUB_CAST(_spSkin, self)->entries = newEntry;
}
Example #28
0
float Slot_getAttachmentTime (const Slot* self) {
	return self->skeleton->time - SUB_CAST(_Internal, self) ->attachmentTime;
}
Example #29
0
void Slot_setAttachmentTime (Slot* self, float time) {
	SUB_CAST(_Internal, self) ->attachmentTime = self->skeleton->time - time;
}
Example #30
0
void Slot_setAttachment (Slot* self, Attachment* attachment) {
	CONST_CAST(Attachment*, self->attachment) = attachment;
	SUB_CAST(_Internal, self) ->attachmentTime = self->skeleton->time;
}