mirror of
https://github.com/thes3m/XNI
synced 2024-12-26 13:26:06 +01:00
Adding missing folders
git-svn-id: http://xni.googlecode.com/svn/XNI@55 ac433895-eea3-a490-d80a-17149a75e588
This commit is contained in:
parent
2adbc50363
commit
74ccf177c5
@ -0,0 +1,23 @@
|
|||||||
|
//
|
||||||
|
// FontTextureProcessor.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 20.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "ContentProcessor.h"
|
||||||
|
|
||||||
|
@interface FontTextureProcessor : ContentProcessor {
|
||||||
|
unichar firstCharacter;
|
||||||
|
BOOL premultiplyAlpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic) unichar firstCharacter;
|
||||||
|
@property (nonatomic) BOOL premultiplyAlpha;
|
||||||
|
|
||||||
|
- (unichar) getCharacterForIndex:(int)index;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,152 @@
|
|||||||
|
//
|
||||||
|
// FontTextureProcessor.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 20.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "FontTextureProcessor.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.h"
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Graphics.h"
|
||||||
|
|
||||||
|
#import "SpriteFontContent+Internal.h"
|
||||||
|
|
||||||
|
static inline BOOL IsOnCharacter(Byte *color) {
|
||||||
|
return color[0] != 255 || color[1] != 0 || color[2] != 255 || color[3] != 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline BOOL IsOnBlack(Byte *color) {
|
||||||
|
return color[0] == 0 && color[1] == 0 && color[2] == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@implementation FontTextureProcessor
|
||||||
|
|
||||||
|
- (id) init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
firstCharacter = ' ';
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize firstCharacter, premultiplyAlpha;
|
||||||
|
|
||||||
|
- (Class) inputType { return [Texture2DContent class];}
|
||||||
|
- (Class) outputType { return [SpriteFontContent class];}
|
||||||
|
|
||||||
|
- (SpriteFontContent*) process:(Texture2DContent*)input {
|
||||||
|
PixelBitmapContent *bitmap = (PixelBitmapContent*)[input.mipmaps objectAtIndex:0];
|
||||||
|
|
||||||
|
NSMutableDictionary *characterMap = [NSMutableDictionary dictionary];
|
||||||
|
NSMutableArray *incompleteCharacters = [NSMutableArray array];
|
||||||
|
|
||||||
|
BOOL usesAlpha = NO;
|
||||||
|
|
||||||
|
int lineSpacing = 0;
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
for (int y = 0; y < bitmap.height; y++) {
|
||||||
|
// Clear all incomplete characters past this line.
|
||||||
|
int i=0;
|
||||||
|
while (i<[incompleteCharacters count]) {
|
||||||
|
Rectangle *rectangle = [incompleteCharacters objectAtIndex:i];
|
||||||
|
if (y >= rectangle.y + rectangle.height) {
|
||||||
|
[incompleteCharacters removeObjectAtIndex:i];
|
||||||
|
} else {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int x = 0;
|
||||||
|
BOOL wasOnCharacter = NO;
|
||||||
|
|
||||||
|
while (x < bitmap.width) {
|
||||||
|
Byte *color = [bitmap getPixelAtX:x Y:y];
|
||||||
|
if (!usesAlpha && color[3] < 255) {
|
||||||
|
usesAlpha = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL onCharacter = IsOnCharacter(color);
|
||||||
|
|
||||||
|
if (!wasOnCharacter && onCharacter) {
|
||||||
|
// We've reached a new character, but first see if it is one of the incomplete ones.
|
||||||
|
BOOL new = YES;
|
||||||
|
for (Rectangle *rectangle in incompleteCharacters) {
|
||||||
|
if ([rectangle containsX:x y:y]) {
|
||||||
|
new = NO;
|
||||||
|
x = rectangle.x + rectangle.width - 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new) {
|
||||||
|
unichar character = [self getCharacterForIndex:index];
|
||||||
|
Rectangle *rectangle = [Rectangle rectangleWithX:x y:y width:0 height:0];
|
||||||
|
|
||||||
|
// Find first off character pixel to the right.
|
||||||
|
int right = x;
|
||||||
|
while (right < bitmap.width && IsOnCharacter([bitmap getPixelAtX:right Y:y])) {
|
||||||
|
right++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do the same for bottom.
|
||||||
|
int bottom = y;
|
||||||
|
while (bottom < bitmap.height && IsOnCharacter([bitmap getPixelAtX:x Y:bottom])) {
|
||||||
|
bottom++;
|
||||||
|
}
|
||||||
|
|
||||||
|
rectangle.width = right - x;
|
||||||
|
rectangle.height = bottom - y;
|
||||||
|
|
||||||
|
if (rectangle.height > lineSpacing) {
|
||||||
|
lineSpacing = rectangle.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
[characterMap setObject:rectangle forKey:[NSNumber numberWithChar:character]];
|
||||||
|
[incompleteCharacters addObject:rectangle];
|
||||||
|
|
||||||
|
index++;
|
||||||
|
x = right - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wasOnCharacter = onCharacter;
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int x = 0; x < bitmap.width; x++) {
|
||||||
|
for (int y = 0; y < bitmap.height; y++) {
|
||||||
|
Byte *color = [bitmap getPixelAtX:x Y:y];
|
||||||
|
|
||||||
|
if (!IsOnCharacter(color) || !usesAlpha && IsOnBlack(color)) {
|
||||||
|
// If the sprite font does not use an alpha channel we should key the black color.
|
||||||
|
// Always also key the separator color.
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
color[i]=0;
|
||||||
|
}
|
||||||
|
} else if (premultiplyAlpha) {
|
||||||
|
// Premultiply alpha for support of non-premultiplied images.
|
||||||
|
float factor = (float)color[4]/255.0f;
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
color[i] = (Byte)((float)color[i]*factor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SpriteFontContent* result = [[[SpriteFontContent alloc] initWithTexture:input
|
||||||
|
characterMap:characterMap
|
||||||
|
lineSpacing:lineSpacing] autorelease];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (unichar) getCharacterForIndex:(int)index {
|
||||||
|
return firstCharacter + index;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// MaterialProcessor.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "ContentProcessor.h"
|
||||||
|
|
||||||
|
@interface MaterialProcessor : ContentProcessor {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// MaterialProcessor.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MaterialProcessor.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Graphics.h"
|
||||||
|
|
||||||
|
@implementation MaterialProcessor
|
||||||
|
|
||||||
|
- (Class) inputType { return [MaterialContent class];}
|
||||||
|
- (Class) outputType { return [MaterialContent class];}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// ModelBoneContent+Internal.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 29.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
|
||||||
|
@interface ModelBoneContent (Internal)
|
||||||
|
|
||||||
|
- (id) initWithChildren:(NSArray*)theChildren
|
||||||
|
index:(int)theIndex
|
||||||
|
name:(NSString*)theName
|
||||||
|
transform:(Matrix*)theTransform;
|
||||||
|
|
||||||
|
- (void) setParent:(ModelBoneContent*)theParent;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,28 @@
|
|||||||
|
//
|
||||||
|
// ModelBoneContent.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 29.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.classes.h"
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.classes.h"
|
||||||
|
|
||||||
|
@interface ModelBoneContent : NSObject {
|
||||||
|
ModelBoneContentCollection *children;
|
||||||
|
int index;
|
||||||
|
NSString *name;
|
||||||
|
ModelBoneContent *parent;
|
||||||
|
Matrix *transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) ModelBoneContentCollection *children;
|
||||||
|
@property (nonatomic, readonly) int index;
|
||||||
|
@property (nonatomic, readonly) NSString *name;
|
||||||
|
@property (nonatomic, readonly) ModelBoneContent *parent;
|
||||||
|
@property (nonatomic, retain) Matrix *transform;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,46 @@
|
|||||||
|
//
|
||||||
|
// ModelBoneContent.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 29.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "ModelBoneContent.h"
|
||||||
|
#import "ModelBoneContent+Internal.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.h"
|
||||||
|
|
||||||
|
@implementation ModelBoneContent
|
||||||
|
|
||||||
|
- (id) initWithChildren:(NSArray *)theChildren
|
||||||
|
index:(int)theIndex
|
||||||
|
name:(NSString *)theName
|
||||||
|
transform:(Matrix *)theTransform
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
children = [[ModelBoneContentCollection alloc] initWithItems:theChildren];
|
||||||
|
index = theIndex;
|
||||||
|
name = [theName retain];
|
||||||
|
transform = [theTransform retain];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize children, index, name, parent, transform;
|
||||||
|
|
||||||
|
- (void) setParent:(ModelBoneContent*)theParent {
|
||||||
|
parent = theParent;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[children release];
|
||||||
|
[name release];
|
||||||
|
[transform release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// ModelBoneContentCollection.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 29.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.classes.h"
|
||||||
|
|
||||||
|
#define ReadOnlyCollection ModelBoneContentCollection
|
||||||
|
#define T ModelBoneContent*
|
||||||
|
|
||||||
|
#include "ReadOnlyCollection.h"
|
||||||
|
|
||||||
|
#undef ReadOnlyCollection
|
||||||
|
#undef T
|
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// ModelBoneContentCollection.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 29.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "ModelBoneContentCollection.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define ReadOnlyCollection ModelBoneContentCollection
|
||||||
|
#define T ModelBoneContent*
|
||||||
|
|
||||||
|
#include "ReadOnlyCollection.m.h"
|
||||||
|
|
||||||
|
#undef ReadOnlyCollection
|
||||||
|
#undef T
|
@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// ModelContent+Internal.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
#import "ModelContent.h"
|
||||||
|
|
||||||
|
@interface ModelContent (Internal)
|
||||||
|
|
||||||
|
- (id) initWithBones:(NSArray*)theBones meshes:(NSArray*)theMeshes root:(ModelBoneContent*)theRoot tag:(id)theTag;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,25 @@
|
|||||||
|
//
|
||||||
|
// ModelContent.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.classes.h"
|
||||||
|
|
||||||
|
@interface ModelContent : NSObject {
|
||||||
|
ModelBoneContentCollection *bones;
|
||||||
|
ModelMeshContentCollection *meshes;
|
||||||
|
ModelBoneContent *root;
|
||||||
|
id tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) ModelBoneContentCollection *bones;
|
||||||
|
@property (nonatomic, readonly) ModelMeshContentCollection *meshes;
|
||||||
|
@property (nonatomic, readonly) ModelBoneContent *root;
|
||||||
|
@property (nonatomic, retain) id tag;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,40 @@
|
|||||||
|
//
|
||||||
|
// ModelContent.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "ModelContent.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.h"
|
||||||
|
|
||||||
|
@implementation ModelContent
|
||||||
|
|
||||||
|
- (id) initWithBones:(NSArray*)theBones meshes:(NSArray*)theMeshes root:(ModelBoneContent*)theRoot tag:(id)theTag;
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
bones = [[ModelBoneContentCollection alloc] initWithItems:theBones];
|
||||||
|
meshes = [[ModelMeshContentCollection alloc] initWithItems:theMeshes];
|
||||||
|
root = [theRoot retain];
|
||||||
|
self.tag = theTag;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize bones, meshes, root, tag;
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[bones release];
|
||||||
|
[meshes release];
|
||||||
|
[root release];
|
||||||
|
[tag release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// ModelMeshContent+Internal.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
#import "ModelMeshContent.h"
|
||||||
|
|
||||||
|
@interface ModelMeshContent (Internal)
|
||||||
|
|
||||||
|
- (id) initWithName:(NSString*)theName parentBone:(ModelBoneContent*)theParentBone modelMeshParts:(NSArray*)theModelMeshParts tag:(id)theTag sourceMesh:(MeshContent*)theSourceMesh;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,28 @@
|
|||||||
|
//
|
||||||
|
// ModelMeshContent.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.classes.h"
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Graphics.classes.h"
|
||||||
|
|
||||||
|
@interface ModelMeshContent : NSObject {
|
||||||
|
ModelMeshPartContentCollection *meshParts;
|
||||||
|
NSString *name;
|
||||||
|
ModelBoneContent *parentBone;
|
||||||
|
id tag;
|
||||||
|
MeshContent *sourceMesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) ModelMeshPartContentCollection *meshParts;
|
||||||
|
@property (nonatomic, readonly) NSString *name;
|
||||||
|
@property (nonatomic, readonly) ModelBoneContent *parentBone;
|
||||||
|
@property (nonatomic, retain) id tag;
|
||||||
|
@property (nonatomic, readonly) MeshContent *sourceMesh;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,41 @@
|
|||||||
|
//
|
||||||
|
// ModelMeshContent.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "ModelMeshContent.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.h"
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Graphics.h"
|
||||||
|
|
||||||
|
@implementation ModelMeshContent
|
||||||
|
|
||||||
|
- (id) initWithName:(NSString *)theName parentBone:(ModelBoneContent*)theParentBone modelMeshParts:(NSArray *)theModelMeshParts tag:(id)theTag sourceMesh:(MeshContent*)theSourceMesh
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
name = [[NSString alloc] initWithString:theName];
|
||||||
|
meshParts = [[ModelMeshPartContentCollection alloc] initWithItems:theModelMeshParts];
|
||||||
|
parentBone = [theParentBone retain];
|
||||||
|
self.tag = theTag;
|
||||||
|
sourceMesh = [theSourceMesh retain];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize name, parentBone, meshParts, tag, sourceMesh;
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[sourceMesh release];
|
||||||
|
[name release];
|
||||||
|
[parentBone release];
|
||||||
|
[meshParts release];
|
||||||
|
[tag release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// ModelMeshContentCollection.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.classes.h"
|
||||||
|
|
||||||
|
#define ReadOnlyCollection ModelMeshContentCollection
|
||||||
|
#define T ModelMeshContent*
|
||||||
|
|
||||||
|
#include "ReadOnlyCollection.h"
|
||||||
|
|
||||||
|
#undef ReadOnlyCollection
|
||||||
|
#undef T
|
@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// ModelMeshContentCollection.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "ModelMeshContentCollection.h"
|
||||||
|
|
||||||
|
#define ReadOnlyCollection ModelMeshContentCollection
|
||||||
|
#define T ModelMeshContent*
|
||||||
|
|
||||||
|
#include "ReadOnlyCollection.m.h"
|
||||||
|
|
||||||
|
#undef ReadOnlyCollection
|
||||||
|
#undef T
|
@ -0,0 +1,24 @@
|
|||||||
|
//
|
||||||
|
// ModelMeshPartContent+Internal.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
#import "ModelMeshPartContent.h"
|
||||||
|
|
||||||
|
@interface ModelMeshPartContent (Internal)
|
||||||
|
|
||||||
|
- (id) initWithVertexOffset:(int)theVertexOffset
|
||||||
|
numVertices:(int)theNumVertices
|
||||||
|
startIndex:(int)theStartIndex
|
||||||
|
primitiveCount:(int)thePrimitiveCount
|
||||||
|
tag:(id)theTag
|
||||||
|
indexBuffer:(IndexCollection*)theIndexBuffer
|
||||||
|
vertexBuffer:(VertexBufferContent*)theVertexBuffer
|
||||||
|
material:(MaterialContent*)theMaterial;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,36 @@
|
|||||||
|
//
|
||||||
|
// ModelMeshPartContent.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.classes.h"
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Graphics.classes.h"
|
||||||
|
#import "Retronator.Xni.Framework.Graphics.classes.h"
|
||||||
|
|
||||||
|
@interface ModelMeshPartContent : NSObject {
|
||||||
|
MaterialContent *material;
|
||||||
|
IndexCollection *indexBuffer;
|
||||||
|
int numVertices;
|
||||||
|
int primitiveCount;
|
||||||
|
int startIndex;
|
||||||
|
id tag;
|
||||||
|
VertexBufferContent *vertexBuffer;
|
||||||
|
int vertexOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic, retain) MaterialContent *material;
|
||||||
|
@property (nonatomic, readonly) IndexCollection *indexBuffer;
|
||||||
|
@property (nonatomic, readonly) int numVertices;
|
||||||
|
@property (nonatomic, readonly) int primitiveCount;
|
||||||
|
@property (nonatomic, readonly) int startIndex;
|
||||||
|
@property (nonatomic, retain) id tag;
|
||||||
|
@property (nonatomic, readonly) VertexBufferContent *vertexBuffer;
|
||||||
|
@property (nonatomic, readonly) int vertexOffset;
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,51 @@
|
|||||||
|
//
|
||||||
|
// ModelMeshPartContent.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "ModelMeshPartContent.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.h"
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Graphics.h"
|
||||||
|
#import "Retronator.Xni.Framework.Graphics.h"
|
||||||
|
|
||||||
|
@implementation ModelMeshPartContent
|
||||||
|
|
||||||
|
- (id) initWithVertexOffset:(int)theVertexOffset
|
||||||
|
numVertices:(int)theNumVertices
|
||||||
|
startIndex:(int)theStartIndex
|
||||||
|
primitiveCount:(int)thePrimitiveCount
|
||||||
|
tag:(id)theTag
|
||||||
|
indexBuffer:(IndexCollection*)theIndexBuffer
|
||||||
|
vertexBuffer:(VertexBufferContent*)theVertexBuffer
|
||||||
|
material:(MaterialContent*)theMaterial
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
vertexOffset = theVertexOffset;
|
||||||
|
numVertices = theNumVertices;
|
||||||
|
startIndex = theStartIndex;
|
||||||
|
primitiveCount = thePrimitiveCount;
|
||||||
|
tag = [tag retain];
|
||||||
|
indexBuffer = [theIndexBuffer retain];
|
||||||
|
vertexBuffer = [theVertexBuffer retain];
|
||||||
|
material = [theMaterial retain];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize material,indexBuffer,numVertices,primitiveCount,startIndex,tag,vertexBuffer,vertexOffset;
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[indexBuffer release];
|
||||||
|
[vertexBuffer release];
|
||||||
|
[tag release];
|
||||||
|
[material release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// ModelMeshPartContentCollection.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.classes.h"
|
||||||
|
|
||||||
|
#define ReadOnlyCollection ModelMeshPartContentCollection
|
||||||
|
#define T ModelMeshPartContent*
|
||||||
|
|
||||||
|
#include "ReadOnlyCollection.h"
|
||||||
|
|
||||||
|
#undef ReadOnlyCollection
|
||||||
|
#undef T
|
||||||
|
|
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// ModelMeshPartContentCollection.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "ModelMeshPartContentCollection.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define ReadOnlyCollection ModelMeshPartContentCollection
|
||||||
|
#define T ModelMeshPartContent*
|
||||||
|
|
||||||
|
#include "ReadOnlyCollection.m.h"
|
||||||
|
|
||||||
|
#undef ReadOnlyCollection
|
||||||
|
#undef T
|
@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// ModelProcessor.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "ContentProcessor.h"
|
||||||
|
|
||||||
|
@interface ModelProcessor : ContentProcessor {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,116 @@
|
|||||||
|
//
|
||||||
|
// ModelProcessor.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "ModelProcessor.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Graphics.h"
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.h"
|
||||||
|
|
||||||
|
#import "ModelContent+Internal.h"
|
||||||
|
#import "ModelMeshContent+Internal.h"
|
||||||
|
#import "ModelMeshPartContent+Internal.h"
|
||||||
|
#import "ModelBoneContent+Internal.h"
|
||||||
|
|
||||||
|
@interface ModelProcessor ()
|
||||||
|
|
||||||
|
- (ModelBoneContent*) createMeshes:(NSMutableArray*)meshes
|
||||||
|
bones:(NSMutableArray*)bones
|
||||||
|
from:(NodeContent*)input;
|
||||||
|
|
||||||
|
- (ModelMeshContent*) createMeshFrom:(MeshContent*)input parentBone:(ModelBoneContent*)parentBone;
|
||||||
|
|
||||||
|
- (ModelMeshPartContent*) createMeshPartFrom:(GeometryContent*)input;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
@implementation ModelProcessor
|
||||||
|
|
||||||
|
- (Class) inputType { return [NodeContent class];}
|
||||||
|
- (Class) outputType { return [ModelContent class];}
|
||||||
|
|
||||||
|
- (ModelContent*) process:(NodeContent*)input {
|
||||||
|
NSMutableArray *meshes = [NSMutableArray array];
|
||||||
|
NSMutableArray *bones = [NSMutableArray array];
|
||||||
|
|
||||||
|
ModelBoneContent *root = [self createMeshes:meshes bones:bones from:input];
|
||||||
|
|
||||||
|
ModelContent* output = [[[ModelContent alloc] initWithBones:bones meshes:meshes root:root tag:nil] autorelease];
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (ModelBoneContent*) createMeshes:(NSMutableArray*)meshes
|
||||||
|
bones:(NSMutableArray*)bones
|
||||||
|
from:(NodeContent*)input {
|
||||||
|
|
||||||
|
// First create all children bones.
|
||||||
|
NSMutableArray *childrenBones = [NSMutableArray array];
|
||||||
|
|
||||||
|
for (NodeContent *node in input.children) {
|
||||||
|
// Skip meshes.
|
||||||
|
if (![node isKindOfClass:[MeshContent class]]) {
|
||||||
|
ModelBoneContent *childBone = [self createMeshes:meshes bones:bones from:node];
|
||||||
|
[childrenBones addObject:childBone];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we can create the bone for this node.
|
||||||
|
ModelBoneContent *bone = [[[ModelBoneContent alloc] initWithChildren:childrenBones
|
||||||
|
index:[bones count]
|
||||||
|
name:input.name
|
||||||
|
transform:input.transform] autorelease];
|
||||||
|
[bones addObject:bone];
|
||||||
|
|
||||||
|
// Update children's parent.
|
||||||
|
for (ModelBoneContent *child in bone.children) {
|
||||||
|
[child setParent:bone];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we can create meshes and pass them the bone as their parent.
|
||||||
|
for (NodeContent *node in input.children) {
|
||||||
|
if ([node isKindOfClass:[MeshContent class]]) {
|
||||||
|
ModelMeshContent *mesh = [self createMeshFrom:(MeshContent*)node parentBone:bone];
|
||||||
|
[meshes addObject:mesh];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the created bone.
|
||||||
|
return bone;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (ModelMeshContent*) createMeshFrom:(MeshContent*)input parentBone:(ModelBoneContent*)parentBone {
|
||||||
|
NSMutableArray *meshParts = [NSMutableArray array];
|
||||||
|
|
||||||
|
for (GeometryContent *geometry in input.geometry) {
|
||||||
|
ModelMeshPartContent *meshPart = [self createMeshPartFrom:geometry];
|
||||||
|
[meshParts addObject:meshPart];
|
||||||
|
}
|
||||||
|
|
||||||
|
ModelMeshContent *mesh = [[[ModelMeshContent alloc] initWithName:input.name
|
||||||
|
parentBone:parentBone
|
||||||
|
modelMeshParts:meshParts
|
||||||
|
tag:nil
|
||||||
|
sourceMesh:input] autorelease];
|
||||||
|
|
||||||
|
return mesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (ModelMeshPartContent *) createMeshPartFrom:(GeometryContent *)input {
|
||||||
|
ModelMeshPartContent *meshPart = [[[ModelMeshPartContent alloc] initWithVertexOffset:0
|
||||||
|
numVertices:input.vertices.vertexCount
|
||||||
|
startIndex:0
|
||||||
|
primitiveCount:input.indices.count/3
|
||||||
|
tag:nil
|
||||||
|
indexBuffer:input.indices
|
||||||
|
vertexBuffer:[input.vertices createVertexBuffer]
|
||||||
|
material:input.material] autorelease];
|
||||||
|
return meshPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,11 @@
|
|||||||
|
@class TextureProcessor, FontTextureProcessor;
|
||||||
|
@class ModelProcessor, MaterialProcessor;
|
||||||
|
@class SoundEffectProcessor, SongProcessor;
|
||||||
|
|
||||||
|
@class ModelContent, ModelMeshContentCollection, ModelMeshContent;
|
||||||
|
@class ModelMeshPartContentCollection, ModelMeshPartContent, VertexBufferContent, VertexDeclarationContent;
|
||||||
|
@class ModelBoneContent, ModelBoneContentCollection;
|
||||||
|
|
||||||
|
@class SoundEffectContent, SongContent;
|
||||||
|
|
||||||
|
@class SpriteFontContent;
|
@ -0,0 +1,24 @@
|
|||||||
|
#import "TextureProcessor.h"
|
||||||
|
#import "FontTextureProcessor.h"
|
||||||
|
|
||||||
|
#import "ModelProcessor.h"
|
||||||
|
#import "MaterialProcessor.h"
|
||||||
|
|
||||||
|
#import "SoundEffectProcessor.h"
|
||||||
|
#import "SongProcessor.h"
|
||||||
|
|
||||||
|
#import "ModelContent.h"
|
||||||
|
#import "ModelMeshContentCollection.h"
|
||||||
|
#import "ModelMeshContent.h"
|
||||||
|
#import "ModelMeshPartContentCollection.h"
|
||||||
|
#import "ModelMeshPartContent.h"
|
||||||
|
#import "VertexBufferContent.h"
|
||||||
|
#import "VertexDeclarationContent.h"
|
||||||
|
|
||||||
|
#import "ModelBoneContent.h"
|
||||||
|
#import "ModelBoneContentCollection.h"
|
||||||
|
|
||||||
|
#import "SoundEffectContent.h"
|
||||||
|
#import "SongContent.h"
|
||||||
|
|
||||||
|
#import "SpriteFontContent.h"
|
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// SongContent+Internal.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 18.1.11.
|
||||||
|
// Copyright 2011 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
|
||||||
|
@interface SongContent (Internal)
|
||||||
|
|
||||||
|
- (id) initWithFileName:(NSString*)fileName;
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) NSURL *url;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,15 @@
|
|||||||
|
//
|
||||||
|
// SongContent.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 15.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@interface SongContent : NSObject {
|
||||||
|
NSURL *url;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,34 @@
|
|||||||
|
//
|
||||||
|
// SongContent.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 15.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "SongContent.h"
|
||||||
|
#import "SongContent+Internal.h"
|
||||||
|
|
||||||
|
@implementation SongContent
|
||||||
|
|
||||||
|
- (id) initWithFileName:(NSString*)fileName
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
url = [[NSURL alloc] initFileURLWithPath:fileName];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSURL *) url {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[url release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// SongProcessor.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 15.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "ContentProcessor.h"
|
||||||
|
|
||||||
|
@interface SongProcessor : ContentProcessor {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,25 @@
|
|||||||
|
//
|
||||||
|
// SongProcessor.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 15.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "SongProcessor.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.h"
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Audio.h"
|
||||||
|
|
||||||
|
#import "SongContent+Internal.h"
|
||||||
|
|
||||||
|
@implementation SongProcessor
|
||||||
|
|
||||||
|
- (Class) inputType { return [AudioContent class];}
|
||||||
|
- (Class) outputType { return [SongContent class];}
|
||||||
|
|
||||||
|
- (SongContent*) process:(AudioContent*)input {
|
||||||
|
return [[[SongContent alloc] initWithFileName:input.fileName] autorelease];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// SoundEffectContent+Internal.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 15.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
|
||||||
|
@interface SoundEffectContent (Internal)
|
||||||
|
|
||||||
|
- (id) initWithData:(NSData*)theData format:(AudioFormat*)theFormat;
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) NSData *data;
|
||||||
|
@property (nonatomic, readonly) AudioFormat *format;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// SoundEffectContent.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 15.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Audio.classes.h"
|
||||||
|
|
||||||
|
@interface SoundEffectContent : NSObject {
|
||||||
|
@private
|
||||||
|
NSData *data;
|
||||||
|
AudioFormat *format;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,40 @@
|
|||||||
|
//
|
||||||
|
// SoundEffectContent.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 15.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "SoundEffectContent.h"
|
||||||
|
#import "SoundEffectContent+Internal.h"
|
||||||
|
|
||||||
|
@implementation SoundEffectContent
|
||||||
|
|
||||||
|
- (id) initWithData:(NSData *)theData format:(AudioFormat*)theFormat
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
data = [theData retain];
|
||||||
|
format = [theFormat retain];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSData *) data {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (AudioFormat *) format {
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[data release];
|
||||||
|
[format release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// SoundEffectProcessor.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 15.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "ContentProcessor.h"
|
||||||
|
|
||||||
|
@interface SoundEffectProcessor : ContentProcessor {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,26 @@
|
|||||||
|
//
|
||||||
|
// SoundEffectProcessor.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 15.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "SoundEffectProcessor.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.h"
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Audio.h"
|
||||||
|
|
||||||
|
#import "SoundEffectContent+Internal.h"
|
||||||
|
|
||||||
|
@implementation SoundEffectProcessor
|
||||||
|
|
||||||
|
- (Class) inputType { return [AudioContent class];}
|
||||||
|
- (Class) outputType { return [SoundEffectContent class];}
|
||||||
|
|
||||||
|
- (SoundEffectContent*) process:(AudioContent*)input {
|
||||||
|
[input convertFormatTo:ConversionFormatPcm quality:ConversionQualityBest targetFileName:nil];
|
||||||
|
return [[[SoundEffectContent alloc] initWithData:input.data format:input.format] autorelease];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// SpriteFontContent+Internal.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 20.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
#import "SpriteFontContent.h"
|
||||||
|
|
||||||
|
@interface SpriteFontContent (Internal)
|
||||||
|
|
||||||
|
- (id) initWithTexture:(Texture2DContent*)theTexture characterMap:(NSDictionary*)theCharacterMap lineSpacing:(int)theLineSpacing;
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) Texture2DContent *texture;
|
||||||
|
@property (nonatomic, readonly) NSDictionary *characterMap;
|
||||||
|
@property (nonatomic, readonly) int lineSpacing;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// SpriteFontContent.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 20.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Graphics.classes.h"
|
||||||
|
|
||||||
|
@interface SpriteFontContent : NSObject {
|
||||||
|
@private
|
||||||
|
Texture2DContent *texture;
|
||||||
|
NSDictionary *characterMap;
|
||||||
|
int lineSpacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,45 @@
|
|||||||
|
//
|
||||||
|
// SpriteFontContent.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 20.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "SpriteFontContent.h"
|
||||||
|
#import "SpriteFontContent+Internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
@implementation SpriteFontContent
|
||||||
|
|
||||||
|
- (id) initWithTexture:(Texture2DContent*)theTexture characterMap:(NSDictionary*)theCharacterMap lineSpacing:(int)theLineSpacing
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
texture = [theTexture retain];
|
||||||
|
characterMap = [theCharacterMap retain];
|
||||||
|
lineSpacing = theLineSpacing;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (Texture2DContent *) texture {
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary *) characterMap {
|
||||||
|
return characterMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (int) lineSpacing {
|
||||||
|
return lineSpacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[texture release];
|
||||||
|
[characterMap release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// TextureProcessor.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "ContentProcessor.h"
|
||||||
|
|
||||||
|
@interface TextureProcessor : ContentProcessor {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// TextureProcessor.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "TextureProcessor.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Graphics.h"
|
||||||
|
|
||||||
|
@implementation TextureProcessor
|
||||||
|
|
||||||
|
- (Class) inputType { return [TextureContent class];}
|
||||||
|
- (Class) outputType { return [TextureContent class];}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,23 @@
|
|||||||
|
//
|
||||||
|
// VertexBufferContent.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Content.Pipeline.Processors.classes.h"
|
||||||
|
|
||||||
|
#import "ContentItem.h"
|
||||||
|
|
||||||
|
@interface VertexBufferContent : ContentItem {
|
||||||
|
NSMutableData *vertexData;
|
||||||
|
VertexDeclarationContent *vertexDeclaration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) NSMutableData *vertexData;
|
||||||
|
@property (nonatomic, retain) VertexDeclarationContent *vertexDeclaration;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,32 @@
|
|||||||
|
//
|
||||||
|
// VertexBufferContent.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 22.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "VertexBufferContent.h"
|
||||||
|
|
||||||
|
|
||||||
|
@implementation VertexBufferContent
|
||||||
|
|
||||||
|
- (id) init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
vertexData = [[NSMutableData alloc] init];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize vertexData, vertexDeclaration;
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[vertexData release];
|
||||||
|
[vertexDeclaration release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// VertexDeclarationContent.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 26.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "ContentItem.h"
|
||||||
|
|
||||||
|
@interface VertexDeclarationContent : ContentItem {
|
||||||
|
NSMutableArray *vertexElements;
|
||||||
|
NSNumber *vertexStride;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) NSMutableArray *vertexElements;
|
||||||
|
@property (nonatomic, retain) NSNumber *vertexStride;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,33 @@
|
|||||||
|
//
|
||||||
|
// VertexDeclarationContent.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 26.11.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "VertexDeclarationContent.h"
|
||||||
|
|
||||||
|
|
||||||
|
@implementation VertexDeclarationContent
|
||||||
|
|
||||||
|
- (id) init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
vertexElements = [[NSMutableArray alloc] init];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize vertexElements, vertexStride;
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[vertexElements release];
|
||||||
|
[vertexStride release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// Guide+Internal.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 7.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "Guide.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.classes.h"
|
||||||
|
|
||||||
|
@interface Guide (Internal)
|
||||||
|
|
||||||
|
+ (void) initializeWithGame:(Game*)theGame;
|
||||||
|
|
||||||
|
@end
|
29
Classes/Retronator/Xni/Framework/GamerServices/Guide.h
Normal file
29
Classes/Retronator/Xni/Framework/GamerServices/Guide.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
//
|
||||||
|
// Guide.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 7.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <GameKit/GameKit.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.classes.h"
|
||||||
|
|
||||||
|
@interface Guide : NSObject {
|
||||||
|
Game *game;
|
||||||
|
BOOL isVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic) BOOL isVisible;
|
||||||
|
|
||||||
|
+ (void) showAchievements;
|
||||||
|
+ (void) showLeaderboard;
|
||||||
|
|
||||||
|
+ (Guide*) getInstance;
|
||||||
|
|
||||||
|
- (void) showAchievements;
|
||||||
|
- (void) showLeaderboard;
|
||||||
|
|
||||||
|
@end
|
59
Classes/Retronator/Xni/Framework/GamerServices/Guide.m
Normal file
59
Classes/Retronator/Xni/Framework/GamerServices/Guide.m
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
//
|
||||||
|
// Guide.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 7.12.10.
|
||||||
|
// Copyright 2010 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "Guide.h"
|
||||||
|
#import "Guide+Internal.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.h"
|
||||||
|
|
||||||
|
#import "GameWindow+Internal.h"
|
||||||
|
#import "GameViewController.h"
|
||||||
|
|
||||||
|
@implementation Guide
|
||||||
|
|
||||||
|
static Guide *instance = nil;
|
||||||
|
|
||||||
|
- (id) initWithGame:(Game*)theGame;
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
game = theGame;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void) initializeWithGame:(Game *)theGame
|
||||||
|
{
|
||||||
|
if (!instance) {
|
||||||
|
instance = [[Guide alloc] initWithGame:theGame];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize isVisible;
|
||||||
|
|
||||||
|
+ (void) showAchievements {
|
||||||
|
[instance showAchievements];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void) showLeaderboard {
|
||||||
|
[instance showLeaderboard];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (Guide*) getInstance {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) showAchievements {
|
||||||
|
[game.window.gameViewController showAchievementsView];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) showLeaderboard {
|
||||||
|
[game.window.gameViewController showLeaderboardView];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1 @@
|
|||||||
|
@class Guide;
|
@ -0,0 +1 @@
|
|||||||
|
#import "Guide.h"
|
5
Classes/Retronator/Xni/Framework/Media/MediaEnums.h
Normal file
5
Classes/Retronator/Xni/Framework/Media/MediaEnums.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
typedef enum {
|
||||||
|
MediaStatePaused,
|
||||||
|
MediaStatePlaying,
|
||||||
|
MediaStateStopped
|
||||||
|
} MediaState;
|
57
Classes/Retronator/Xni/Framework/Media/MediaPlayer.h
Normal file
57
Classes/Retronator/Xni/Framework/Media/MediaPlayer.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
//
|
||||||
|
// MediaPlayer.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 18.1.11.
|
||||||
|
// Copyright 2011 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <AVFoundation/AVFoundation.h>
|
||||||
|
|
||||||
|
#import "System.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Media.classes.h"
|
||||||
|
|
||||||
|
@interface MediaPlayer : NSObject <AVAudioPlayerDelegate> {
|
||||||
|
BOOL soloModeActivated;
|
||||||
|
BOOL isMuted;
|
||||||
|
BOOL isRepeating;
|
||||||
|
BOOL isShuffled;
|
||||||
|
MediaQueue *queue;
|
||||||
|
MediaState state;
|
||||||
|
float volume;
|
||||||
|
|
||||||
|
Event *activeSongChanged;
|
||||||
|
Event *mediaStateChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) BOOL gameHasControl;
|
||||||
|
@property (nonatomic) BOOL isMuted;
|
||||||
|
@property (nonatomic) BOOL isRepeating;
|
||||||
|
@property (nonatomic) BOOL isShuffled;
|
||||||
|
@property (nonatomic, readonly) NSTimeInterval playPosition;
|
||||||
|
@property (nonatomic, readonly) MediaQueue *queue;
|
||||||
|
@property (nonatomic, readonly) MediaState state;
|
||||||
|
@property (nonatomic) float volume;
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) Event *activeSongChanged;
|
||||||
|
@property (nonatomic, readonly) Event *mediaStateChanged;
|
||||||
|
|
||||||
|
+ (MediaPlayer*) getInstance;
|
||||||
|
|
||||||
|
+ (void) moveNext;
|
||||||
|
+ (void) movePrevious;
|
||||||
|
+ (void) pause;
|
||||||
|
+ (void) playSong:(Song*)song;
|
||||||
|
+ (void) resume;
|
||||||
|
+ (void) stop;
|
||||||
|
|
||||||
|
- (void) moveNext;
|
||||||
|
- (void) movePrevious;
|
||||||
|
- (void) pause;
|
||||||
|
- (void) playSong:(Song*)song;
|
||||||
|
- (void) resume;
|
||||||
|
- (void) stop;
|
||||||
|
|
||||||
|
@end
|
220
Classes/Retronator/Xni/Framework/Media/MediaPlayer.m
Normal file
220
Classes/Retronator/Xni/Framework/Media/MediaPlayer.m
Normal file
@ -0,0 +1,220 @@
|
|||||||
|
//
|
||||||
|
// MediaPlayer.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 18.1.11.
|
||||||
|
// Copyright 2011 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MediaPlayer.h"
|
||||||
|
|
||||||
|
#import <AudioToolbox/AudioToolbox.h>
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Media.h"
|
||||||
|
#import "MediaQueue+Internal.h"
|
||||||
|
#import "Song+Internal.h"
|
||||||
|
|
||||||
|
@interface MediaPlayer ()
|
||||||
|
|
||||||
|
- (BOOL) checkAvailability;
|
||||||
|
- (void) setMediaState:(MediaState)value;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
@implementation MediaPlayer
|
||||||
|
|
||||||
|
static MediaPlayer *instance;
|
||||||
|
|
||||||
|
+ (void) initialize {
|
||||||
|
if (!instance) {
|
||||||
|
instance = [[MediaPlayer alloc] init];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id) init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
// Start in ambient mode so we let user music play until a call to MediaPlayer play changes this.
|
||||||
|
[[AVAudioSession sharedInstance]
|
||||||
|
setCategory: AVAudioSessionCategoryAmbient
|
||||||
|
error: nil];
|
||||||
|
|
||||||
|
queue = [[MediaQueue alloc] init];
|
||||||
|
isMuted = NO;
|
||||||
|
volume = 1;
|
||||||
|
|
||||||
|
[queue.activeSongChanged subscribeDelegate:[Delegate delegateWithTarget:self Method:@selector(queueActiveSongChanged)]];
|
||||||
|
|
||||||
|
activeSongChanged = [[Event alloc] init];
|
||||||
|
mediaStateChanged = [[Event alloc] init];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) gameHasControl {
|
||||||
|
UInt32 otherAudioIsPlaying;
|
||||||
|
UInt32 propertySize = sizeof(otherAudioIsPlaying);
|
||||||
|
|
||||||
|
AudioSessionGetProperty (
|
||||||
|
kAudioSessionProperty_OtherAudioIsPlaying,
|
||||||
|
&propertySize,
|
||||||
|
&otherAudioIsPlaying
|
||||||
|
);
|
||||||
|
|
||||||
|
return !otherAudioIsPlaying;
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize isMuted;
|
||||||
|
|
||||||
|
- (void) setIsMuted:(BOOL)value {
|
||||||
|
isMuted = value;
|
||||||
|
|
||||||
|
if (isMuted) {
|
||||||
|
queue.activeSong.audioPlayer.volume = 0;
|
||||||
|
} else {
|
||||||
|
queue.activeSong.audioPlayer.volume = volume;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize isRepeating;
|
||||||
|
@synthesize isShuffled;
|
||||||
|
|
||||||
|
- (NSTimeInterval) playPosition {
|
||||||
|
return queue.activeSong.audioPlayer.currentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize volume;
|
||||||
|
|
||||||
|
- (void) setVolume:(float)value {
|
||||||
|
volume = value;
|
||||||
|
|
||||||
|
if (!isMuted) {
|
||||||
|
queue.activeSong.audioPlayer.volume = volume;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize queue, state, mediaStateChanged;
|
||||||
|
|
||||||
|
- (Event *) activeSongChanged {
|
||||||
|
return queue.activeSongChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+ (MediaPlayer*) getInstance {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void) moveNext { [instance moveNext];}
|
||||||
|
+ (void) movePrevious { [instance movePrevious];}
|
||||||
|
+ (void) pause { [instance pause];}
|
||||||
|
+ (void) playSong:(Song*)song { [instance playSong:song];}
|
||||||
|
+ (void) resume { [instance resume];}
|
||||||
|
+ (void) stop { [instance stop];}
|
||||||
|
|
||||||
|
- (void) moveNext {
|
||||||
|
if (![self checkAvailability]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isShuffled) {
|
||||||
|
queue.activeSongIndex = random() % queue.count;
|
||||||
|
} else {
|
||||||
|
queue.activeSongIndex = (queue.activeSongIndex + 1) % queue.count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) movePrevious {
|
||||||
|
if (![self checkAvailability]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isShuffled) {
|
||||||
|
queue.activeSongIndex = random() % queue.count;
|
||||||
|
} else {
|
||||||
|
queue.activeSongIndex = (queue.activeSongIndex - 1 + queue.count) % queue.count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) pause {
|
||||||
|
if (![self checkAvailability]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
[queue.activeSong.audioPlayer pause];
|
||||||
|
[self setMediaState:MediaStatePaused];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) playSong:(Song*)song {
|
||||||
|
if (![self checkAvailability]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
song.audioPlayer.delegate = self;
|
||||||
|
[queue setSong:song];
|
||||||
|
[queue.activeSong.audioPlayer play];
|
||||||
|
[self setMediaState:MediaStatePlaying];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) resume {
|
||||||
|
if (![self checkAvailability]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
[queue.activeSong.audioPlayer play];
|
||||||
|
[self setMediaState:MediaStatePlaying];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) stop {
|
||||||
|
if (![self checkAvailability]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
[queue.activeSong.audioPlayer pause];
|
||||||
|
queue.activeSong.audioPlayer.currentTime = 0;
|
||||||
|
[self setMediaState:MediaStateStopped];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) checkAvailability {
|
||||||
|
if (!self.gameHasControl) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!soloModeActivated) {
|
||||||
|
// Switch to solo mode so we silence user audio before playing our music.
|
||||||
|
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategorySoloAmbient error:nil];
|
||||||
|
soloModeActivated = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) queueActiveSongChanged {
|
||||||
|
[activeSongChanged raiseWithSender:self];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setMediaState:(MediaState)value {
|
||||||
|
if (state == value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state = value;
|
||||||
|
[mediaStateChanged raiseWithSender:self];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
|
||||||
|
[self moveNext];
|
||||||
|
[self resume];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[activeSongChanged release];
|
||||||
|
[mediaStateChanged release];
|
||||||
|
[queue release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
19
Classes/Retronator/Xni/Framework/Media/MediaQueue+Internal.h
Normal file
19
Classes/Retronator/Xni/Framework/Media/MediaQueue+Internal.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// MediaQueue+Internal.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 18.1.11.
|
||||||
|
// Copyright 2011 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
#import "MediaQueue.h"
|
||||||
|
|
||||||
|
@interface MediaQueue (Internal)
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) Event *activeSongChanged;
|
||||||
|
|
||||||
|
- (void) setSong:(Song*)song;
|
||||||
|
|
||||||
|
@end
|
28
Classes/Retronator/Xni/Framework/Media/MediaQueue.h
Normal file
28
Classes/Retronator/Xni/Framework/Media/MediaQueue.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
//
|
||||||
|
// MediaQueue.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 18.1.11.
|
||||||
|
// Copyright 2011 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "System.h"
|
||||||
|
|
||||||
|
#import "Retronator.Xni.Framework.Media.classes.h"
|
||||||
|
|
||||||
|
@interface MediaQueue : NSObject {
|
||||||
|
NSMutableArray *queue;
|
||||||
|
int activeSongIndex;
|
||||||
|
|
||||||
|
Event *activeSongChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) Song *activeSong;
|
||||||
|
@property (nonatomic) int activeSongIndex;
|
||||||
|
@property (nonatomic, readonly) int count;
|
||||||
|
|
||||||
|
- (Song*) itemAt:(int)index;
|
||||||
|
|
||||||
|
@end
|
86
Classes/Retronator/Xni/Framework/Media/MediaQueue.m
Normal file
86
Classes/Retronator/Xni/Framework/Media/MediaQueue.m
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
//
|
||||||
|
// MediaQueue.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 18.1.11.
|
||||||
|
// Copyright 2011 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MediaQueue.h"
|
||||||
|
|
||||||
|
#import <AVFoundation/AVFoundation.h>
|
||||||
|
|
||||||
|
#import "MediaQueue+Internal.h"
|
||||||
|
#import "Song+Internal.h"
|
||||||
|
|
||||||
|
@implementation MediaQueue
|
||||||
|
|
||||||
|
- (id) init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
queue = [[NSMutableArray alloc] init];
|
||||||
|
|
||||||
|
activeSongChanged = [[Event alloc] init];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@synthesize activeSongIndex;
|
||||||
|
|
||||||
|
- (Event *) activeSongChanged {
|
||||||
|
return activeSongChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setActiveSongIndex:(int)value {
|
||||||
|
if (value == activeSongIndex) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AVAudioPlayer *player = self.activeSong.audioPlayer;
|
||||||
|
BOOL playing = player.playing;
|
||||||
|
|
||||||
|
if (playing) {
|
||||||
|
// Stop playing current song.
|
||||||
|
[player pause];
|
||||||
|
player.currentTime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
activeSongIndex = value;
|
||||||
|
|
||||||
|
if (playing) {
|
||||||
|
// Start new song.
|
||||||
|
[self.activeSong.audioPlayer play];
|
||||||
|
}
|
||||||
|
|
||||||
|
[activeSongChanged raiseWithSender:self];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (Song *) activeSong {
|
||||||
|
return [queue objectAtIndex:activeSongIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (int) count {
|
||||||
|
return [queue count];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (Song *) itemAt:(int)index {
|
||||||
|
return [queue objectAtIndex:index];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setSong:(Song *)song {
|
||||||
|
[queue removeAllObjects];
|
||||||
|
[queue addObject:song];
|
||||||
|
activeSongIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[activeSongChanged release];
|
||||||
|
[queue release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,4 @@
|
|||||||
|
#import "MediaEnums.h"
|
||||||
|
|
||||||
|
@class Song;
|
||||||
|
@class MediaPlayer, MediaQueue;
|
@ -0,0 +1,6 @@
|
|||||||
|
#import "MediaEnums.h"
|
||||||
|
|
||||||
|
#import "Song.h"
|
||||||
|
|
||||||
|
#import "MediaPlayer.h"
|
||||||
|
#import "MediaQueue.h"
|
19
Classes/Retronator/Xni/Framework/Media/Song+Internal.h
Normal file
19
Classes/Retronator/Xni/Framework/Media/Song+Internal.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// Song+Internal.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 18.1.11.
|
||||||
|
// Copyright 2011 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
#import "Song.h"
|
||||||
|
|
||||||
|
@interface Song (Internal)
|
||||||
|
|
||||||
|
- (id) initWithUrl:(NSURL*)url;
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) AVAudioPlayer *audioPlayer;
|
||||||
|
|
||||||
|
@end
|
19
Classes/Retronator/Xni/Framework/Media/Song.h
Normal file
19
Classes/Retronator/Xni/Framework/Media/Song.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// Song.h
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 18.1.11.
|
||||||
|
// Copyright 2011 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import <AVFoundation/AVFoundation.h>
|
||||||
|
|
||||||
|
@interface Song : NSObject {
|
||||||
|
AVAudioPlayer *audioPlayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) NSTimeInterval duration;
|
||||||
|
|
||||||
|
@end
|
39
Classes/Retronator/Xni/Framework/Media/Song.m
Normal file
39
Classes/Retronator/Xni/Framework/Media/Song.m
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
//
|
||||||
|
// Song.m
|
||||||
|
// XNI
|
||||||
|
//
|
||||||
|
// Created by Matej Jan on 18.1.11.
|
||||||
|
// Copyright 2011 Retronator. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "Song.h"
|
||||||
|
#import "Song+Internal.h"
|
||||||
|
|
||||||
|
@implementation Song
|
||||||
|
|
||||||
|
- (id) initWithUrl:(NSURL*)url
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil) {
|
||||||
|
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
|
||||||
|
[audioPlayer prepareToPlay];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSTimeInterval) duration {
|
||||||
|
return audioPlayer.duration;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (AVAudioPlayer *) audioPlayer {
|
||||||
|
return audioPlayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) dealloc
|
||||||
|
{
|
||||||
|
[audioPlayer release];
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
Loading…
x
Reference in New Issue
Block a user