protected override void AddedToScene() { base.AddedToScene(); var visibleRect = VisibleBoundsWorldspace; // We will not clear the primitives after creating them // This will allow us to keep drawing the same over and over. geoBatch.AutoClearInstances = false; geoBatch.Begin(); var item = geoBatch.CreateGeometryInstance(3, 3); var vertices = item.GeometryPacket.Vertices; var windowSize = VisibleBoundsWorldspace.Size; var packet = item.GeometryPacket; packet.Texture = texture; item.GeometryPacket = packet; // Draw polygons vertices[0].Colors = CCColor4B.White; vertices[1].Colors = CCColor4B.White; vertices[2].Colors = CCColor4B.White; // Texture coordinates use a normalzed value 0 to 1 vertices[0].TexCoords.U = 0; vertices[0].TexCoords.V = 0; vertices[1].TexCoords.U = 1; vertices[1].TexCoords.V = 0; vertices[2].TexCoords.U = 1; vertices[2].TexCoords.V = 1; vertices[0].Vertices.X = 0; vertices[0].Vertices.Y = 0; vertices[1].Vertices.X = texture.PixelsWide; vertices[1].Vertices.Y = 0; vertices[2].Vertices.X = texture.PixelsWide; vertices[2].Vertices.Y = texture.PixelsHigh; item.GeometryPacket.Indicies = new int[] { 2, 1, 0 }; var rotation = CCAffineTransform.Identity; rotation.Rotation = (float)Math.PI / 4.0f; rotation.Tx = windowSize.Center.X - texture.PixelsWide / 2; rotation.Ty = windowSize.Center.Y - texture.PixelsHigh / 2; item.InstanceAttributes.AdditionalTransform = rotation; geoBatch.End(); }
protected override void Draw() { base.Draw(); var visibleRect = VisibleBoundsWorldspace; var geoBatch = new CCGeometryBatch(); geoBatch.Begin(); var item = geoBatch.CreateGeometryInstance(3, 3); var vertices = item.GeometryPacket.Vertices; var windowSize = VisibleBoundsWorldspace.Size; var packet = item.GeometryPacket; packet.Texture = texture; item.GeometryPacket = packet; // Draw polygons vertices[0].Colors = CCColor4B.White; vertices[1].Colors = CCColor4B.White; vertices[2].Colors = CCColor4B.White; // Texture coordinates use a normalzed value 0 to 1 vertices[0].TexCoords.U = 0; vertices[0].TexCoords.V = 0; vertices[1].TexCoords.U = 1; vertices[1].TexCoords.V = 0; vertices[2].TexCoords.U = 1; vertices[2].TexCoords.V = 1; vertices[0].Vertices.X = 0; vertices[0].Vertices.Y = 0; vertices[1].Vertices.X = texture.PixelsWide; vertices[1].Vertices.Y = 0; vertices[2].Vertices.X = texture.PixelsWide; vertices[2].Vertices.Y = texture.PixelsHigh; item.GeometryPacket.Indicies = new int[] { 2, 1, 0 }; var rotation = CCAffineTransform.Identity; rotation.Rotation = (float)Math.PI / 4.0f; rotation.Tx = windowSize.Center.X - texture.PixelsWide / 2; rotation.Ty = windowSize.Center.Y - texture.PixelsHigh / 2; item.InstanceAttributes.AdditionalTransform = rotation; geoBatch.End(); }
protected override void Draw() { defaultBlendState = PremultipliedAlpha ? BlendState.AlphaBlend : BlendState.NonPremultiplied; float[] vertices = this.vertices; List <Slot> drawOrder = Skeleton.DrawOrder; float x = Skeleton.X, y = Skeleton.Y; CCColor3B color3b = Color; float skeletonR = color3b.R / 255f; float skeletonG = color3b.G / 255f; float skeletonB = color3b.B / 255f; float skeletonA = Opacity / 255f; batcher.Begin(); for (int i = 0, n = drawOrder.Count; i < n; i++) { Slot slot = drawOrder[i]; Attachment attachment = slot.Attachment; if (attachment is RegionAttachment) { RegionAttachment regionAttachment = (RegionAttachment)attachment; BlendState blend = slot.Data.AdditiveBlending ? BlendState.Additive : defaultBlendState; var item = batcher.CreateGeometryInstance(4, 6); item.InstanceAttributes.BlendState = blend; item.GeometryPacket.Indicies = quadTriangles; var itemVertices = item.GeometryPacket.Vertices; AtlasRegion region = (AtlasRegion)regionAttachment.RendererObject; item.GeometryPacket.Texture = (CCTexture2D)region.page.rendererObject; CCColor4B color; float a = skeletonA * slot.A * regionAttachment.A; if (PremultipliedAlpha) { color = new CCColor4B( skeletonR * slot.R * regionAttachment.R * a, skeletonG * slot.G * regionAttachment.G * a, skeletonB * slot.B * regionAttachment.B * a, a); } else { color = new CCColor4B( skeletonR * slot.R * regionAttachment.R, skeletonG * slot.G * regionAttachment.G, skeletonB * slot.B * regionAttachment.B, a); } itemVertices[TL].Colors = color; itemVertices[BL].Colors = color; itemVertices[BR].Colors = color; itemVertices[TR].Colors = color; regionAttachment.ComputeWorldVertices(x, y, slot.Bone, vertices); itemVertices[TL].Vertices.X = vertices[RegionAttachment.X1]; itemVertices[TL].Vertices.Y = vertices[RegionAttachment.Y1]; itemVertices[TL].Vertices.Z = 0; itemVertices[BL].Vertices.X = vertices[RegionAttachment.X2]; itemVertices[BL].Vertices.Y = vertices[RegionAttachment.Y2]; itemVertices[BL].Vertices.Z = 0; itemVertices[BR].Vertices.X = vertices[RegionAttachment.X3]; itemVertices[BR].Vertices.Y = vertices[RegionAttachment.Y3]; itemVertices[BR].Vertices.Z = 0; itemVertices[TR].Vertices.X = vertices[RegionAttachment.X4]; itemVertices[TR].Vertices.Y = vertices[RegionAttachment.Y4]; itemVertices[TR].Vertices.Z = 0; float[] uvs = regionAttachment.UVs; itemVertices[TL].TexCoords.U = uvs[RegionAttachment.X1]; itemVertices[TL].TexCoords.V = uvs[RegionAttachment.Y1]; itemVertices[BL].TexCoords.U = uvs[RegionAttachment.X2]; itemVertices[BL].TexCoords.V = uvs[RegionAttachment.Y2]; itemVertices[BR].TexCoords.U = uvs[RegionAttachment.X3]; itemVertices[BR].TexCoords.V = uvs[RegionAttachment.Y3]; itemVertices[TR].TexCoords.U = uvs[RegionAttachment.X4]; itemVertices[TR].TexCoords.V = uvs[RegionAttachment.Y4]; } else if (attachment is MeshAttachment) { MeshAttachment mesh = (MeshAttachment)attachment; int vertexCount = mesh.Vertices.Length; if (vertices.Length < vertexCount) { vertices = new float[vertexCount]; } mesh.ComputeWorldVertices(x, y, slot, vertices); int[] triangles = mesh.Triangles; var item = batcher.CreateGeometryInstance(vertexCount, triangles.Length); item.GeometryPacket.Indicies = triangles; AtlasRegion region = (AtlasRegion)mesh.RendererObject; item.GeometryPacket.Texture = (CCTexture2D)region.page.rendererObject; CCColor4B color; float a = skeletonA * slot.A * mesh.A; if (PremultipliedAlpha) { color = new CCColor4B( skeletonR * slot.R * mesh.R * a, skeletonG * slot.G * mesh.G * a, skeletonB * slot.B * mesh.B * a, a); } else { color = new CCColor4B( skeletonR * slot.R * mesh.R, skeletonG * slot.G * mesh.G, skeletonB * slot.B * mesh.B, a); } float[] uvs = mesh.UVs; var itemVertices = item.GeometryPacket.Vertices; for (int ii = 0, v = 0; v < vertexCount; ii++, v += 2) { itemVertices[ii].Colors = color; itemVertices[ii].Vertices.X = vertices[v]; itemVertices[ii].Vertices.Y = vertices[v + 1]; itemVertices[ii].Vertices.Z = 0; itemVertices[ii].TexCoords.U = uvs[v]; itemVertices[ii].TexCoords.V = uvs[v + 1]; } } else if (attachment is SkinnedMeshAttachment) { SkinnedMeshAttachment mesh = (SkinnedMeshAttachment)attachment; int vertexCount = mesh.UVs.Length; if (vertices.Length < vertexCount) { vertices = new float[vertexCount]; } mesh.ComputeWorldVertices(x, y, slot, vertices); int[] triangles = mesh.Triangles; var item = batcher.CreateGeometryInstance(vertexCount, triangles.Length); item.GeometryPacket.Indicies = triangles; AtlasRegion region = (AtlasRegion)mesh.RendererObject; item.GeometryPacket.Texture = (CCTexture2D)region.page.rendererObject; CCColor4B color; float a = skeletonA * slot.A * mesh.A; if (PremultipliedAlpha) { color = new CCColor4B( skeletonR * slot.R * mesh.R * a, skeletonG * slot.G * mesh.G * a, skeletonB * slot.B * mesh.B * a, a); } else { color = new CCColor4B( skeletonR * slot.R * mesh.R, skeletonG * slot.G * mesh.G, skeletonB * slot.B * mesh.B, a); } float[] uvs = mesh.UVs; var itemVertices = item.GeometryPacket.Vertices; for (int ii = 0, v = 0; v < vertexCount; ii++, v += 2) { itemVertices[ii].Colors = color; itemVertices[ii].Vertices.X = vertices[v]; itemVertices[ii].Vertices.Y = vertices[v + 1]; itemVertices[ii].Vertices.Z = 0; itemVertices[ii].TexCoords.U = uvs[v]; itemVertices[ii].TexCoords.V = uvs[v + 1]; } } } batcher.End(); if (DebugBones || DebugSlots) { if (DebugSlots) { for (int i = 0; i < Skeleton.Slots.Count; ++i) { var slot = Skeleton.Slots[i]; if (slot.Attachment == null) { continue; } var verticesCount = 0; var worldVertices = new float[1000]; // Max number of vertices per mesh. if (slot.Attachment is RegionAttachment) { var attachment = (RegionAttachment)slot.Attachment; attachment.ComputeWorldVertices(Skeleton.X, Skeleton.Y, slot.bone, worldVertices); verticesCount = 8; } else if (slot.Attachment is MeshAttachment) { var mesh = (MeshAttachment)slot.Attachment; mesh.ComputeWorldVertices(Skeleton.X, Skeleton.Y, slot, worldVertices); verticesCount = mesh.Vertices.Length; } else if (slot.Attachment is SkinnedMeshAttachment) { var mesh = (SkinnedMeshAttachment)slot.Attachment; mesh.ComputeWorldVertices(Skeleton.X, Skeleton.Y, slot, worldVertices); verticesCount = mesh.UVs.Length; } else { continue; } CCPoint[] slotVertices = new CCPoint[verticesCount / 2]; for (int ii = 0, si = 0; ii < verticesCount; ii += 2, si++) { slotVertices[si].X = worldVertices[ii] * ScaleX; slotVertices[si].Y = worldVertices[ii + 1] * ScaleY; } CCDrawingPrimitives.Begin(); CCDrawingPrimitives.DrawPoly(slotVertices, verticesCount / 2, true, DebugSlotColor); CCDrawingPrimitives.End(); } } if (DebugBones) { // Bone lengths. for (int i = 0; i < Skeleton.Bones.Count; i++) { Bone bone = Skeleton.Bones[i]; x = bone.Data.Length * bone.M00 + bone.WorldX; y = bone.Data.Length * bone.M10 + bone.WorldY; CCDrawingPrimitives.Begin(); CCDrawingPrimitives.DrawLine(new CCPoint(bone.WorldX, bone.WorldY), new CCPoint(x, y), DebugJointColor); CCDrawingPrimitives.End(); } // Bone origins. for (int i = 0; i < Skeleton.Bones.Count; i++) { Bone bone = Skeleton.Bones[i]; CCDrawingPrimitives.Begin(); CCDrawingPrimitives.DrawPoint(new CCPoint(bone.WorldX, bone.WorldY), 4, DebugBoneColor); CCDrawingPrimitives.End(); } } } }