// // Smoke.m // Canabalt // // Copyright Semi Secret Software 2009-2010. All rights reserved. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #import "Smoke.h" #import static NSString * ImgSmoke = @"smoke.png"; @interface Smoke () - (id) initWithGLData:(SmokeGLData *)glData texture:(SemiSecretTexture *)texture; - (void) setupVertices; - (void) setupTexCoords; @end @implementation SmokeEmitter + (SmokeEmitter *) smokeEmitterWithSmokeCount:(NSUInteger)smokeCount { return [[[self alloc] initWithSmokeCount:smokeCount] autorelease]; } - (id) initWithSmokeCount:(NSUInteger)SmokeCount { if ((self = [super init])) { texture = [[FlxG addTextureWithParam1:ImgSmoke param2:NO] retain]; smokeCount = SmokeCount; glData = (SmokeGLData *)malloc(sizeof(SmokeGLData)*smokeCount); for (int i=0; i (2*10+1)/(2*256) // 21/512, 219/512 // 219/512, 219/512 // 219/512, 21/512 //TODO: why the extra *2 scale factor? CGRect r = CGRectMake(texture.offset.x + frameWidth * uOffset, texture.offset.y + frameHeight * vOffset, frameWidth * 2, frameHeight * 2); CGPoint tl = CGPointMake((2*r.origin.x+1)/(2*texture.atlasTexture.paddedSize.width), (2*r.origin.y+1)/(2*texture.atlasTexture.paddedSize.height)); CGPoint br = CGPointMake((2*r.origin.x + 1 + r.size.width - 2)/(2*texture.atlasTexture.paddedSize.width), (2*r.origin.y + 1 + r.size.height - 2)/(2*texture.atlasTexture.paddedSize.height)); glData->t1[0] = (GLshort)([FlxGLView convertToShort:tl.x]); glData->t1[1] = (GLshort)([FlxGLView convertToShort:tl.y]); glData->t2[0] = (GLshort)([FlxGLView convertToShort:br.x]); glData->t2[1] = (GLshort)([FlxGLView convertToShort:tl.y]); glData->t3[0] = (GLshort)([FlxGLView convertToShort:tl.x]); glData->t3[1] = (GLshort)([FlxGLView convertToShort:br.y]); glData->t4[0] = (GLshort)([FlxGLView convertToShort:br.x]); glData->t4[1] = (GLshort)([FlxGLView convertToShort:br.y]); } else { glData->t1[0] = uOffset*uShort; glData->t1[1] = vOffset*vShort; glData->t2[0] = (uOffset+1)*uShort; glData->t2[1] = vOffset*vShort; glData->t3[0] = uOffset*uShort; glData->t3[1] = (vOffset+1)*vShort; glData->t4[0] = (uOffset+1)*uShort; glData->t4[1] = (vOffset+1)*vShort; } } - (void) setupVertices { if (visible && exists && active) { CGPoint p = [self getScreenXY]; p.x = p.x + frameWidth/2.0; p.y = p.y + frameHeight/2.0; CGPoint p1 = CGPointMake(-(frameWidth/2.0), -(frameHeight/2.0)); CGPoint p2 = CGPointMake(frameWidth/2.0, -(frameHeight/2.0)); CGPoint p3 = CGPointMake(-(frameWidth/2.0), frameHeight/2.0); CGPoint p4 = CGPointMake(frameWidth/2.0, frameHeight/2.0); CGAffineTransform t1 = CGAffineTransformMakeRotation(angle*M_PI/180.0); p1 = CGPointApplyAffineTransform(p1, t1); p2 = CGPointApplyAffineTransform(p2, t1); p3 = CGPointApplyAffineTransform(p3, t1); p4 = CGPointApplyAffineTransform(p4, t1); glData->p1[0] = (GLshort)(p1.x + p.x); glData->p1[1] = (GLshort)(p1.y + p.y); glData->p2[0] = (GLshort)(p2.x + p.x); glData->p2[1] = (GLshort)(p2.y + p.y); glData->p3[0] = (GLshort)(p3.x + p.x); glData->p3[1] = (GLshort)(p3.y + p.y); glData->p4[0] = (GLshort)(p4.x + p.x); glData->p4[1] = (GLshort)(p4.y + p.y); glData->p0[0] = glData->p1[0]; glData->p0[1] = glData->p1[1]; glData->p5[0] = glData->p4[0]; glData->p5[1] = glData->p4[1]; } else { glData->p0[0] = 0; glData->p0[1] = 0; glData->p1[0] = 0; glData->p1[1] = 0; glData->p2[0] = 0; glData->p2[1] = 0; glData->p3[0] = 0; glData->p3[1] = 0; glData->p4[0] = 0; glData->p4[1] = 0; glData->p5[0] = 0; glData->p5[1] = 0; } } - (void) render { } @end