TGUINode * GUI_CreateNode( void ) { TGUINode * node = Memory_New( TGUINode ); node->visible = true; node->color = Vec3_Set( 1.0f, 1.0f, 1.0f ); List_Add( &gGUINodeList, node ); return node; }
void Octree_Build( TOctree * octree, TTriangle * triangles, int triangleCount, int maxTrianglesPerNode ) { // compute metrics of vertices( min, max ) and build root node octree->root = Memory_New( TOctreeNode ); octree->root->indexCount = 0; octree->root->indices = 0; octree->root->split = 0; octree->root->min = Vec3_Set( FLT_MAX, FLT_MAX, FLT_MAX ); octree->root->max = Vec3_Set( -FLT_MAX, -FLT_MAX, -FLT_MAX ); int i; for( i = 0; i < triangleCount; i++ ) { const TTriangle * triangle = triangles + i; // so much wow, so copypaste wow if( triangle->a.x < octree->root->min.x ) octree->root->min.x = triangle->a.x; if( triangle->b.x < octree->root->min.x ) octree->root->min.x = triangle->b.x; if( triangle->c.x < octree->root->min.x ) octree->root->min.x = triangle->c.x; if( triangle->a.y < octree->root->min.y ) octree->root->min.y = triangle->a.y; if( triangle->b.y < octree->root->min.y ) octree->root->min.y = triangle->b.y; if( triangle->c.y < octree->root->min.y ) octree->root->min.y = triangle->c.y; if( triangle->a.z < octree->root->min.z ) octree->root->min.z = triangle->a.z; if( triangle->b.z < octree->root->min.z ) octree->root->min.z = triangle->b.z; if( triangle->c.z < octree->root->min.z ) octree->root->min.z = triangle->c.z; if( triangle->a.x > octree->root->max.x ) octree->root->max.x = triangle->a.x; if( triangle->b.x > octree->root->max.x ) octree->root->max.x = triangle->b.x; if( triangle->c.x > octree->root->max.x ) octree->root->max.x = triangle->c.x; if( triangle->a.y > octree->root->max.y ) octree->root->max.y = triangle->a.y; if( triangle->b.y > octree->root->max.y ) octree->root->max.y = triangle->b.y; if( triangle->c.y > octree->root->max.y ) octree->root->max.y = triangle->c.y; if( triangle->a.z > octree->root->max.z ) octree->root->max.z = triangle->a.z; if( triangle->b.z > octree->root->max.z ) octree->root->max.z = triangle->b.z; if( triangle->c.z > octree->root->max.z ) octree->root->max.z = triangle->c.z; } int * indices = Memory_NewCount( triangleCount, int ); for( int i = 0; i < triangleCount; i++ ) { indices[i] = i; } int conIndSize = 10 * triangleCount; octree->containIndices = Memory_NewCount( conIndSize, int ); octree->containIndexCount = 0; // multithreaded version for( int i = 0; i < OCTREE_MAX_SIMULTANEOUS_THREADS; i++ ) { octree->containIndicesMT[i] = Memory_NewCount( conIndSize, int ); octree->containIndexCountMT[i] = 0; } Octree_BuildRecursiveInternal( octree->root, triangles, triangleCount, indices, triangleCount, maxTrianglesPerNode ); }
TGUINode * GUI_CreateRect( float x, float y, float w, float h, TTexture * tex ) { TGUINode * node = GUI_CreateNode(); node->rect = Memory_New( TGUIRect ); node->rect->tex = tex; node->rect->x = x; node->rect->y = y; node->rect->w = w; node->rect->h = h; return node; }
def(bool, Run) { unsigned int *ptr[2048]; for (size_t i = 1; i < nElems(ptr); i++) { ptr[i] = Memory_New(i * sizeof(unsigned int)); fwd(j, i) { ptr[i][j] = i + j; } }
def(void, Enqueue, void *ptr, int flags) { ref(Event) *event = Memory_New(sizeof(ref(Event))); *event = (ref(Event)) { .ptr = ptr, .flags = flags, .next = NULL }; LinkedList_Push(&this->events, event); }
TGUINode * GUI_CreateButton( float x, float y, float width, float height, TTexture * backgroundTex, TFont * font, const char * text ) { TGUINode * node = GUI_CreateNode(); node->button = Memory_New( TGUIButton ); node->button->background = GUI_CreateRect( x, y, width, height, backgroundTex ); node->button->text = GUI_CreateText( x, y, width, height, text, font ); GUI_SetTextAlign( node, GUITA_MIDDLE ); node->button->normalColor = Vec3_Set( 1.0f, 1.0f, 1.0f ); node->button->pressedColor = Vec3_Set( 0.8f, 0.8f, 0.8f ); node->button->pickedColor = Vec3_Set( 0.9f, 0.9f, 0.9f ); node->color = node->button->normalColor; return node; }
TGUINode * GUI_CreateSlider( float x, float y, float width, float height, TTexture * backgroundTex, TTexture * sliderTex, float minValue, float maxValue, TFont * font, const char * text ) { TGUINode * node = GUI_CreateNode(); node->slider = Memory_New( TGUISlider ); node->slider->minValue = minValue; node->slider->maxValue = maxValue; node->slider->value = maxValue; node->slider->background = GUI_CreateRect( x, y, width, height, backgroundTex ); node->slider->slider = GUI_CreateRect( width - 10, -4, 10, height + 8, sliderTex ); GUI_Attach( node->slider->slider, node->slider->background ); node->slider->text = GUI_CreateText( width + 10, 0, width, height, text, font ); GUI_Attach( node->slider->text, node->slider->background ); return node; }
TGUINode * GUI_CreateText( float x, float y, float fieldWidth, float fieldHeight, const char * text, TFont * font ) { TGUINode * node = GUI_CreateNode(); node->text = Memory_New( TGUIText ); node->text->text = String_Duplicate( text ); node->text->fieldWidth = fieldWidth; node->text->fieldHeight = fieldHeight; node->text->x = x; node->text->y = y; node->text->font = font; node->text->width = 0; node->text->height = font->size; int length = strlen( text ); for( int i = 0; i < length; i++ ) { node->text->width += font->charMetrics[(unsigned int)text[i]].advanceX; } return node; }
void Octree_SplitNode( TOctreeNode * node ) { TVec3 center = Vec3_Middle( node->min, node->max ); for(int i = 0; i < 8; i++) { node->childs[i] = Memory_New( TOctreeNode ); node->childs[i]->split = 0; node->childs[i]->indices = 0; node->childs[i]->indexCount = 0; } node->childs[0]->min = Vec3_Set( node->min.x, node->min.y, node->min.z ); node->childs[0]->max = Vec3_Set( center.x, center.y, center.z ); node->childs[1]->min = Vec3_Set( center.x, node->min.y, node->min.z ); node->childs[1]->max = Vec3_Set( node->max.x, center.y, center.z ); node->childs[2]->min = Vec3_Set( node->min.x, node->min.y, center.z ); node->childs[2]->max = Vec3_Set( center.x, center.y, node->max.z ); node->childs[3]->min = Vec3_Set( center.x, node->min.y, center.z ); node->childs[3]->max = Vec3_Set( node->max.x, center.y, node->max.z ); node->childs[4]->min = Vec3_Set( node->min.x, center.y, node->min.z ); node->childs[4]->max = Vec3_Set( center.x, node->max.y, center.z ); node->childs[5]->min = Vec3_Set( center.x, center.y, node->min.z ); node->childs[5]->max = Vec3_Set( node->max.x, node->max.y, center.z ); node->childs[6]->min = Vec3_Set( node->min.x, center.y, center.z ); node->childs[6]->max = Vec3_Set( center.x, node->max.y, node->max.z ); node->childs[7]->min = Vec3_Set( center.x, center.y, center.z ); node->childs[7]->max = Vec3_Set( node->max.x, node->max.y, node->max.z ); node->split = true; }
void Player_Create( ) { if( player ) { Player_Free( ); Memory_Free( player ); } player = Memory_New( TPlayer ); // create main pivot player->pivot = Entity_Create( ); // create camera player->cameraPivot = Entity_Create(); Entity_MakeCamera( player->cameraPivot ); Entity_Attach( player->cameraPivot, player->pivot ); player->cameraPivot->localPosition = Vec3_Set( 0, 0.4, 0 ); // add physical body Shape_CreateSphere( &player->shape, 1.0f ); Body_Create( &player->body, &player->shape ); Dynamics_AddBody( &player->body ); player->body.position.y = 10; player->body.elasticity = 0.05f; player->cameraOffset = Vec3_Set( 0, 0.4, 0 ); player->cameraShakeOffset = Vec3_Zero(); player->velocity = Vec3_Zero(); player->destVelocity = Vec3_Zero(); // set parameters player->speed = 4.5f; player->speedMultiplier = 1.8f; player->jumpStrength = 0.1f; player->mouseSensivity = 0.2f; player->yaw = 0.0f; player->pitch = 0.0f; player->maxPitch = M_PI / 2.0; player->pathLength = 0.0f; player->crouchRadius = 0.5f; player->standRadius = 1.0f; player->crouch = false; player->move = false; player->run = false; player->onGround = false; player->cameraShakeCoeff = 0.0f; // ================== // step sounds Player_SetSoundGroup( "data/sounds/dirt", STEP_SOIL, "data/materials/soil.mtl" ); Player_SetSoundGroup( "data/sounds/stonestep", STEP_ROCK, "data/materials/stone.mtl" ); Player_SetSoundGroup( "data/sounds/wood", STEP_WOOD, "data/materials/wood.mtl" ); Player_SetSoundGroup( "data/sounds/metal", STEP_METAL, "data/materials/metal.mtl" ); // set default step sounds player->stepSoundGroup = &player->stepSounds[STEP_SOIL]; player->weapon = Weapon_Create( WEAPON_BLASTER ); Entity_Attach( player->weapon->model, player->cameraPivot ); player->interface.font = Font_LoadFromFile( "data/fonts/font3.ttf", 16 ); player->interface.ammo = GUI_CreateText( Renderer_GetScreenResolutionWidth() - 200, Renderer_GetScreenResolutionHeight() - 200, 190, 190, "Ammo:\n", player->interface.font ); }
rsdef(self *, New, RdString title) { self *res = Memory_New(sizeof(self)); return *res = (self) { .title = title }, res;
#import "Task.h" #define self Task rsdef(self *, new, void *data, void (*destroy)(Instance $this)) { self *res = Memory_New(sizeof(self)); res->next = null; res->data = data; res->destroy = destroy; return res; } def(void, destroy) { if (this->destroy != null) { this->destroy(this->data); } Memory_Destroy(this); } #undef self #define self Tasks rsdef(self, new) { return (self) { .first = null }; }