示例#1
0
static int  PubCamera_viewrect(PState state,PubFunction_t *f, int n)
{
  static lxMatrix44SIMD mat;

  Reference ref;
  int   axis;
  float dist;
  float t;
  lxVector3 rays[4];

  Camera_t *cam;
  List3DNode_t *l3dcam;
  int i;


  if (n!=3 || 3!=FunctionPublish_getArg(state,3,LUXI_CLASS_L3D_CAMERA,&ref,LUXI_CLASS_INT,&axis,LUXI_CLASS_FLOAT,&dist) ||
    !Reference_get(ref,l3dcam))
    return FunctionPublish_returnError(state,"1 l3dcamera 1 int(0-2) 1 float required.");

  cam = l3dcam->cam;

  lxVector3Set(rays[0],0,1,0);
  lxMatrix44Identity(mat);
  lxVector3Set(rays[1],cam->fov/g_Window.ratio,0,-cam->fov);
  lxMatrix44FromEulerZYXdeg(mat,rays[1]);
  lxMatrix44VectorRotate(mat,rays[0]);
  lxVector3Set(rays[1],-rays[0][0],rays[0][1], rays[0][2]);
  lxVector3Set(rays[2],-rays[0][0],rays[0][1],-rays[0][2]);
  lxVector3Set(rays[3], rays[0][0],rays[0][1],-rays[0][2]);

  // rays set, now transform
  for (i = 0; i < 4; i++)
    lxMatrix44VectorRotate(cam->finalMatrix,rays[i]);

  // hittest with plane
  for (i = 0; i < 4; i++){
    if (!rays[i][axis])
      return 0;

    // t * ray + cam.pos = axis*dist
    t = (dist - cam->pos[axis])/rays[i][axis];
    if (t < 0)
      return 0;
    lxVector3ScaledAdd(rays[i],cam->pos,t,rays[i]);
  }

  return FunctionPublish_setRet(state,12,FNPUB_FROMVECTOR3(rays[0]),FNPUB_FROMVECTOR3(rays[1]),FNPUB_FROMVECTOR3(rays[2]),FNPUB_FROMVECTOR3(rays[3]));
}
示例#2
0
List2DNode_t *List2DNode_new(const char *name)
{
  List2DNode_t *node = genzallocSIMD(sizeof(List2DNode_t));

  LUX_SIMDASSERT(((size_t)((List2DNode_t*)node)->finalMatrix) % 16 == 0);

  lxVector4Set(node->color,1,1,1,1);
  lxVector3Set(node->scale, 1, 1, 1);
  lxListNode_init(node);
  node->type = LUXI_CLASS_L2D_NODE;
  node->parent = NULL;

  if (name)
    gennewstrcpy(node->name,name);

  lxMatrix44IdentitySIMD(node->finalScaled);
  lxMatrix44IdentitySIMD(node->finalMatrix);

  return node;
}
示例#3
0
// TODO a second function using SSE
static int PubStaticFloatArray_prop_FPU(PState pstate,PubFunction_t *fn, int n)
{
  StaticArray_t *self,*a,*b;
  Reference ref;
  int i;
  int index;
  float *pOut;
  float *pPos;
  float f;
  int valint;
  lxVector4 vec4;

  switch ((StaticArrayUp_t)fn->upvalue)
  {
  case VA_VEC3:
    {
      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);
      FNPUB_CHECKOUT(pstate,n,1,LUXI_CLASS_INT,index);

      if (index<0 || index>=self->count/3)
        return FunctionPublish_returnErrorf(pstate,"index out of bounds (%i/%i)",
        index,self->count/3);

      pOut = &self->floats[3*index];

      if (n==2){
        return FunctionPublish_setRet(pstate,3,FNPUB_FROMVECTOR3(pOut));
      }
      else if (3!= FunctionPublish_getArgOffset(pstate,2,3,FNPUB_TOVECTOR3(pOut)))
        return FunctionPublish_returnError(pstate,"1 floatarray 1 index 3 floats required");
      return 0;
    }
  case VA_VEC3_ALL:
    {
      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);
      index = 0;
      valint = 0;
      i = 65536;
      if (3>FunctionPublish_getArgOffset(pstate,1,6,FNPUB_TOVECTOR3(vec4),LUXI_CLASS_INT,(void*)&index,LUXI_CLASS_INT,(void*)&i,LUXI_CLASS_INT,(void*)&valint))
        return FunctionPublish_returnError(pstate,"1 floatarray 3 floats [1 int] required");

      pOut = self->floats + index;
      pPos = LUX_MIN(self->floats + self->count,pOut+(i*(3+ valint)));

      for (;pOut < pPos; pOut+=(3+valint)){
        lxVector3Copy(pOut,vec4);
      }
      return 0;
    }
  case VA_VEC4_ALL:
    {
      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);
      index = 0;
      valint = 0;
      i = 65536;
      if (4>FunctionPublish_getArgOffset(pstate,1,7,FNPUB_TOVECTOR4(vec4),LUXI_CLASS_INT,(void*)&index,LUXI_CLASS_INT,(void*)&i,LUXI_CLASS_INT,(void*)&valint))
        return FunctionPublish_returnError(pstate,"1 floatarray 4 floats [1 int] required");

      pOut = self->floats + index;
      pPos = LUX_MIN(self->floats + self->count,pOut+(i*(4+ valint)));

      for (;pOut < pPos; pOut+=(4+valint)){
        lxVector4Copy(pOut,vec4);
      }
      return 0;
    }
  case VA_VEC4:
    {
      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);
      FNPUB_CHECKOUT(pstate,n,1,LUXI_CLASS_INT,index);

      if (index<0 || index>=self->count/4)
        return FunctionPublish_returnErrorf(pstate,"index out of bounds (%i/%i)",
        index,self->count/4);

      pOut = &self->floats[4*index];

      if (n==2){
        return FunctionPublish_setRet(pstate,4,FNPUB_FROMVECTOR4(pOut));
      }
      else if (4!= FunctionPublish_getArgOffset(pstate,2,4,FNPUB_TOVECTOR4(pOut)))
        return FunctionPublish_returnError(pstate,"1 floatarray 1 index 4 floats required");
      return 0;
    }
  case VA_LERP:
    {
      float fracc;
      float step;
      float lrp;
      int outcount;
      int incount;

      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);
      FNPUB_CHECKOUTREF(pstate,n,1,LUXI_CLASS_FLOATARRAY,ref,a);
      incount = outcount = a->count;
      FunctionPublish_getNArg(pstate,2,LUXI_CLASS_INT,(void*)&incount);
      incount = LUX_MIN(outcount,incount);
      outcount = self->count;
      if (outcount <= incount || incount < 2)
        return FunctionPublish_returnError(pstate,"not enough floats given, need at least 2");


      step = 1.0f/(float)(incount-1);
      fracc = 1.0f/(float)(outcount-1);

      pOut = self->floats;
      pPos = a->floats;
      f = 0;
      for (i = 0; i < outcount; i++, pOut++,f+=fracc){
        if (f > step){
          f-=step;
          pPos++;
        }
        lrp = f/step;
        *pOut = LUX_LERP(lrp,*pPos,*(pPos+1));
      }
      return 0;
    }
  case VA_LERP3:
    {
      float fracc;
      float step;
      float lrp;
      int outcount;
      int incount;

      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);
      FNPUB_CHECKOUTREF(pstate,n,1,LUXI_CLASS_FLOATARRAY,ref,a);
      incount = outcount = a->count/3;
      FunctionPublish_getNArg(pstate,2,LUXI_CLASS_INT,(void*)&incount);
      incount = LUX_MIN(outcount,incount);
      outcount = self->count/3;

      if (outcount <= incount || incount < 2)
        return FunctionPublish_returnError(pstate,"not enough floats given, need at least 6");


      step = 1.0f/(float)(incount-1);
      fracc = 1.0f/(float)(outcount-1);

      pOut = self->floats;
      pPos = a->floats;
      f = 0;
      for (i = 0; i < outcount; i++, pOut+=3,f+=fracc){
        if (f > step){
          f-=step;
          pPos+=3;
        }
        lrp = f/step;
        lxVector3Lerp(pOut,lrp,pPos,pPos+3);
      }
      return 0;
    }
  case VA_LERP4:
    {
      float fracc;
      float step;
      float lrp;
      int outcount;
      int incount;

      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);
      FNPUB_CHECKOUTREF(pstate,n,1,LUXI_CLASS_FLOATARRAY,ref,a);
      incount = outcount = a->count/4;
      FunctionPublish_getNArg(pstate,2,LUXI_CLASS_INT,(void*)&incount);
      incount = LUX_MIN(outcount,incount);
      outcount = self->count/4;

      if (outcount <= incount || incount < 2)
        return FunctionPublish_returnError(pstate,"not enough floats given, need at least 8");


      step = 1.0f/(float)(incount-1);
      fracc = 1.0f/(float)(outcount-1);

      pOut = self->floats;
      pPos = a->floats;
      f = 0;
      for (i = 0; i < outcount; i++, pOut+=4,f+=fracc){
        if (f > step){
          f-=step;
          pPos+=4;
        }
        lrp = f/step;
        lxVector4Lerp(pOut,lrp,pPos,pPos+4);
      }
      return 0;
    }
  case VA_SPLINE4:
    {
      lxVector4 startvec,endvec;
      float fracc;
      float step;
      float lrp;
      float *endpos;
      float *startpos;
      int outcount;
      int incount;

      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);
      FNPUB_CHECKOUTREF(pstate,n,1,LUXI_CLASS_FLOATARRAY,ref,a);
      incount = outcount = a->count/4;
      FunctionPublish_getNArg(pstate,2,LUXI_CLASS_INT,(void*)&incount);
      incount = LUX_MIN(outcount,incount);

      outcount = self->count/4;
      if (outcount <= incount || incount < 2)
        return FunctionPublish_returnError(pstate,"not enough vectors given, need at least 2");

      pPos = &a->floats[4];
      lxVector4Sub(startvec,pPos,pPos-4);
      lxVector4Sub(startvec,pPos-4,startvec);

      pPos = &a->floats[4*(incount-1)];
      lxVector4Sub(endvec,pPos,pPos-4);
      lxVector4Add(endvec,pPos,endvec);

      step = 1.0f/(float)(incount-1);
      fracc = 1.0f/(float)(outcount-1);

      pOut = self->floats;
      pPos = a->floats;
      index = 0;
      f = 0;
      startpos = startvec;
      endpos = (index < incount-1) ? pPos+8 : endvec;
      for (i = 0; i < outcount-1; i++, pOut+=4,f+=fracc){
        if (f > step){
          f-=step;
          pPos+=3;
          index++;
          endpos = (index < incount-2) ? pPos+8 : endvec;
          startpos = pPos-4;
        }
        lrp = f/step;
        lxVector4CatmullRom(pOut,lrp,startpos,pPos,pPos+4,endpos);
      }
      lxVector4Copy(pOut,pPos+4);
      return 0;
    }
  case VA_SPLINE3:
    {
      lxVector3 startvec,endvec;
      float fracc;
      float step;
      float lrp;
      float *endpos;
      float *startpos;
      int outcount;
      int incount;

      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);
      FNPUB_CHECKOUTREF(pstate,n,1,LUXI_CLASS_FLOATARRAY,ref,a);
      incount = outcount = a->count/3;
      FunctionPublish_getNArg(pstate,2,LUXI_CLASS_INT,(void*)&incount);
      incount = LUX_MIN(outcount,incount);

      outcount = self->count/3;
      if (outcount <= incount || incount < 2)
        return FunctionPublish_returnError(pstate,"not enough vectors given, need at least 2");

      pPos = &a->floats[3];
      lxVector3Sub(startvec,pPos,pPos-3);
      lxVector3Sub(startvec,pPos-3,startvec);

      pPos = &a->floats[3*(incount-1)];
      lxVector3Sub(endvec,pPos,pPos-3);
      lxVector3Add(endvec,pPos,endvec);

      step = 1.0f/(float)(incount-1);
      fracc = 1.0f/(float)(outcount-1);

      pOut = self->floats;
      pPos = a->floats;
      index = 0;
      f = 0;
      startpos = startvec;
      endpos = (index < incount-1) ? pPos+6 : endvec;
      for (i = 0; i < outcount-1; i++, pOut+=3,f+=fracc){
        if (f > step){
          f-=step;
          pPos+=3;
          index++;
          endpos = (index < incount-2) ? pPos+6 : endvec;
          startpos = pPos-3;
        }
        lrp = f/step;
        lxVector3CatmullRom(pOut,lrp,startpos,pPos,pPos+3,endpos);
      }
      lxVector3Copy(pOut,pPos+3);
      return 0;
    }
  case VA_TONEXT3:
    {
      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);
      index = self->count/3;
      pOut = self->floats;
      for (i = 0; i < index-1; i++,pOut+=3)
      {
        lxVector3Sub(pOut,pOut+3,pOut);
      }
      lxVector3Set(pOut,0,0,0);
      return 0;
    }
  case VA_OPLIT:
    {
      float *pNormal;
      lxVector3 latt;
      lxVector3 lambi;
      lxVector3 lpos;
      lxVector3 ldiff;

      lxVector3 intens;
      lxVector3 ldir;
      lxVector3 dist;
      float dot;
      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);
      i = self->count/4;
      pOut = self->floats;
      FNPUB_CHECKOUTREF(pstate,n,1,LUXI_CLASS_FLOATARRAY,ref,self);
      if (i != self->count/3)
        return FunctionPublish_returnError(pstate,"position array does not match size");
      pPos = self->floats;
      FNPUB_CHECKOUTREF(pstate,n,2,LUXI_CLASS_FLOATARRAY,ref,self);
      if (i != self->count/3)
        return FunctionPublish_returnError(pstate,"normal array does not match size");
      pNormal = self->floats;
      if (n < 15 || 12>FunctionPublish_getArgOffset(pstate,3,12,FNPUB_TOVECTOR3(lpos),FNPUB_TOVECTOR3(ldiff),FNPUB_TOVECTOR3(lambi),FNPUB_TOVECTOR3(latt)))
        return FunctionPublish_returnError(pstate,"3 floatarrays 12 floats required.");

      dist[0] = 1.0f;
      for (i = 0; i < self->count/3; i++,pOut+=4,pPos+=3,pNormal+=3)
      { // compute per vertex lighting
        // pos 2 light
        lxVector3Sub(ldir,lpos,pPos);
        dist[1] = lxVector3Normalized(ldir);
        dist[2] = dist[1]*dist[1];
        // N.L
        dot = LUX_MAX(0,lxVector3Dot(ldir,pNormal));
        // lightintesities
        lxVector3ScaledAdd(intens,lambi,dot,ldiff);
        // attenuate
        dot = 1.0f/(lxVector3Dot(dist,latt));
        lxVector3Scale(pOut,intens,dot);
        pOut[3] = 1.0f;
      }
      return 0;
    }
  case VA_OPSET:
  case VA_OPSUB:
  case VA_OPMUL:
  case VA_OPADD:
  case VA_OPDIV:
  case VA_OPMIN:
  case VA_OPMAX:
    {

      FNPUB_CHECKOUTREF(pstate,n,0,LUXI_CLASS_FLOATARRAY,ref,self);


      if (n==2 && FunctionPublish_getNArg(pstate,1,LUXI_CLASS_FLOAT,(void*)&f)==1) {

        switch ((StaticArrayUp_t)fn->upvalue) {
          case VA_OPSET: for (i=0;i<self->count;i++) self->floats[i] = f; break;
          case VA_OPSUB: for (i=0;i<self->count;i++) self->floats[i] -= f; break;
          case VA_OPDIV: for (i=0;i<self->count;i++) self->floats[i] /= f; break;
          case VA_OPMUL: for (i=0;i<self->count;i++) self->floats[i] *= f; break;
          case VA_OPADD: for (i=0;i<self->count;i++) self->floats[i] += f; break;
          case VA_OPMIN:
            for (i=0;i<self->count;i++) self->floats[i] = LUX_MIN(self->floats[i],f); break;
          case VA_OPMAX:
            for (i=0;i<self->count;i++) self->floats[i] = LUX_MAX(self->floats[i],f); break;
          default:
            return 0;
          }
        }
        return 0;
      }


      FNPUB_CHECKOUTREF(pstate,n,1,LUXI_CLASS_FLOATARRAY,ref,a);
      if (n>=3){
        FNPUB_CHECKOUTREF(pstate,n,2,LUXI_CLASS_FLOATARRAY,ref,b)
      }
      else {
        b = a;
        a = self;
      }

      if (self->count>a->count || self->count>b->count)
        return FunctionPublish_returnError(pstate,"the arrays must be larger then destination");

      switch ((StaticArrayUp_t)fn->upvalue) {
      case VA_OPSET:
        if (n==3) return FunctionPublish_returnError(pstate,"accepts only 2 arguments");
        for (i=0;i<self->count;i++) self->floats[i] = a->floats[i];
        break;
      case VA_OPSUB:
        for (i=0;i<self->count;i++) self->floats[i] = a->floats[i]-b->floats[i];
        break;
      case VA_OPMUL:
        for (i=0;i<self->count;i++) self->floats[i] = a->floats[i]*b->floats[i];
        break;
      case VA_OPADD:
        for (i=0;i<self->count;i++) self->floats[i] = a->floats[i]+b->floats[i];
        break;
      case VA_OPDIV:
        for (i=0;i<self->count;i++) self->floats[i] = a->floats[i]/b->floats[i];
        break;
      case VA_OPMIN:
        for (i=0;i<self->count;i++) self->floats[i] = LUX_MIN(a->floats[i],b->floats[i]);
        break;
      case VA_OPMAX:
        for (i=0;i<self->count;i++) self->floats[i] = LUX_MAX(a->floats[i],b->floats[i]);
        break;
      }

      return 0;
  }
  return 0;
}
示例#4
0
文件: f3d.c 项目: MSylvia/luxinia1
static void fileLoadF3DMesh(uint type, uint count, uint offset)
{
  lxFSFile_t      *file = l_F3DData.file;
  Bone_t        *bone;
  MeshObject_t    *meshobj;
  Mesh_t        *mesh;
  lxVertex64_t      *vert64;
  lxVertex32_t      *vert32;
  float       buffer[16];

  char    name[4096];
  char    *curname;

  uint  i;
  uint  n;
  uint  len;

  uint  uintCnt;
  ushort  ushortCnt;
  ushort  ushort1;
  uchar uchar;

  /*
  <[2] Eltern ID>
  <[2] String länge > [<[1] Name des Objekts>]
  <[4 * 16] 4*4 Float Matrix44, relativ zum Elternteil>
  <[12] RefPose(x,y,z)> <[16] RefRot(x,y,z,w)> <[12] RefScale (x,y,z)>
   */

  for (n = 0; n < count; n++){
    // Generic Info
    // id
    bone = (type != IMESH_INST_SHRD_VERT_PARENT_MAT) ? &l_F3DData.model->bonesys.bones[l_F3DData.curbone++] : NULL;
    meshobj = (type != IMESH_HELPER) ? &l_F3DData.model->meshObjects[n+offset] : NULL;

    lxFS_read(&ushort1,sizeof(ushort),1,file);
    if (bone)
      bone->parentID = f3dFixBoneID(ushort1);

    // name
    lxFS_read(&ushort1,sizeof(ushort),1,file);
    lxFS_read(&name,sizeof(uchar),ushort1,file);
    LUX_ASSERT(ushort1 < 4096);
    name[ushort1]=0;

    resnewstrcpy(curname,name);
    if (meshobj){
      meshobj->name = curname;
      meshobj->bone = bone;
      meshobj->skinID = -1;
    }
    if (bone)
      bone->name = curname;

    // matrix
    lxFS_read(buffer,sizeof(float),16,file);
    if (bone){
      lxMatrix44Copy(bone->refMatrix,buffer);
    }

    // Ref Pos, Rot, Scale
    lxFS_read(buffer,sizeof(float),3,file);
    if (bone){
      lxVector3Copy(bone->refPRS.pos,buffer);
    }
    lxFS_read(buffer,sizeof(float),4,file);
    if (bone){
      lxVector4Copy(bone->refPRS.rot,buffer);
    }
    lxFS_read(buffer,sizeof(float),3,file);
    if (bone){
      lxVector3Copy(bone->refPRS.scale,buffer);

      if (bone->refPRS.scale[0] && bone->refPRS.scale[1] && bone->refPRS.scale[2] &&
        bone->refPRS.scale[0]!=1.0f && bone->refPRS.scale[1]!=1.0f && bone->refPRS.scale[2]!=1.0f){
        bone->refInvScale[0] = 1.0f/bone->refPRS.scale[0];
        bone->refInvScale[1] = 1.0f/bone->refPRS.scale[1];
        bone->refInvScale[2] = 1.0f/bone->refPRS.scale[2];

        // rebuild matrix without scale
        // rot
        lxQuatToMatrixIdentity(bone->refPRS.rot,bone->refMatrix);
        //pos
        lxMatrix44SetTranslation(bone->refMatrix,bone->refPRS.pos);
      }
      else
        lxVector3Set(bone->refInvScale,1,1,1);
    }



    switch (type){
      case IMESH_HELPER:
        break;
      case IMESH_MESH:
      /*  <[2] Material ID>
        <[2] Anzahl der Punkte>
          [ <[16] tx,ty,tz,tw> <[8] (u,v)> <[4] (r,g,b,a)> <[12] (nx,ny,nz)> <[12] (x,y,z)> ]
        <1> Primitve Type
          {
          0: Points
          1: Triangle List
          2: Triangle Strip
          3: Quad List
          4: Quad Strip
          }
        <[2] Total Indices>
        <[2] Primitivelistencount>
          [
          <[2] Material ID> IGNORED
          <[2] Anzahl der Indices>  ## z.b Triangle List : indices = tris * 3, Triangle Strip indices = tris - 2
            [<[2] Vertex ID>]
          ]*/
        mesh = meshobj->mesh = reszalloc(sizeof(Mesh_t));
        mesh->instanceType = f3dInstanceType(type);
        mesh->vertextype = l_F3DData.model->vertextype;
        // material
        lxFS_read(&ushort1,sizeof(ushort),1,file);
        meshobj->texRID = ushort1;

        // number of Vertices
        uintCnt = 0;
        lxFS_read(&uintCnt,(l_F3DData.f3dversion >= F3D_VERSION_26) ? sizeof(uint) : sizeof(ushort),1,file);

        switch (l_F3DData.model->vertextype){
          case VERTEX_64_TEX4:
          case VERTEX_64_SKIN:
            vert64 = mesh->vertexData = reszallocaligned(sizeof(lxVertex64_t)*uintCnt,32);
            mesh->numAllocVertices = mesh->numVertices = uintCnt;
            switch(l_F3DData.f3dversion)
            {
            case F3D_VERSION_23:
              for (i = 0; i < uintCnt; i++){
                lxFS_read(vert64->tex2,sizeof(float),4,file);
                lxFS_read(vert64->tex,sizeof(float),2,file);
                lxFS_read(vert64->color,sizeof(uchar),4,file);
                lxFS_read(buffer,sizeof(float),3,file);
                lxVector3short_FROM_float(vert64->normal,buffer);
                lxFS_read(vert64->pos,sizeof(float),3,file);
                vert64++;
              }
              break;
            case F3D_VERSION_24:
              for (i = 0; i < uintCnt; i++){
                // tex,tex2 user4
                lxFS_read(vert64->tex,sizeof(float),8,file);
                // normal
                lxFS_read(buffer,sizeof(float),3,file);
                lxVector3short_FROM_float(vert64->normal,buffer);
                // color
                lxFS_read(vert64->color,sizeof(uchar),4,file);
                lxFS_read(vert64->pos,sizeof(float),3,file);
                // pad
                lxFS_read(buffer,sizeof(float),1,file);
                vert64++;
              }
              break;
            case F3D_VERSION_25:
            default:
              lxFS_read(vert64,sizeof(lxVertex64_t),mesh->numVertices,file);
              break;

            }
            break;
          case VERTEX_32_TEX2:
            vert32 = mesh->vertexData = reszallocaligned(sizeof(lxVertex32_t)*uintCnt,32);
            mesh->numAllocVertices = mesh->numVertices = uintCnt;
            switch(l_F3DData.f3dversion)
            {
            case F3D_VERSION_23:
              for (i = 0; i < uintCnt; i++){
                lxFS_read(vert32->tex1,sizeof(float),2,file);
                lxFS_read(buffer,sizeof(float),2,file);
                lxFS_read(vert32->tex,sizeof(float),2,file);
                lxFS_read(vert32->color,sizeof(uchar),4,file);
                lxFS_read(buffer,sizeof(float),3,file);
                lxFS_read(vert32->pos,sizeof(float),3,file);
                vert32++;
              }
              break;
            case F3D_VERSION_24:
              for (i = 0; i < uintCnt; i++){
                // tex, tex2
                lxFS_read(vert32->tex,sizeof(float),4,file);
                //FS_read(vert32->tex2,sizeof(float),2,file);
                // user4, normal
                lxFS_read(buffer,sizeof(float),7,file);
                lxFS_read(vert32->color,sizeof(uchar),4,file);
                lxFS_read(vert32->pos,sizeof(float),3,file);
                lxFS_read(buffer,sizeof(float),1,file);
                vert32++;
              }
              break;

            case F3D_VERSION_25:
            default:
              for (i = 0; i < uintCnt; i++){
                // tex, tex2
                lxFS_read(vert32->tex,sizeof(float),4,file);
                //FS_read(vert32->tex2,sizeof(float),2,file);
                // user4, normal,tangent
                lxFS_read(buffer,sizeof(float),8,file);
                lxFS_read(vert32->pos,sizeof(float),3,file);
                lxFS_read(vert32->color,sizeof(uchar),4,file);
                  vert32++;
              }
              break;
            }

            break;
          case VERTEX_32_NRM:
            vert32 = mesh->vertexData = reszallocaligned(sizeof(lxVertex32_t)*uintCnt,32);
            mesh->numAllocVertices = mesh->numVertices = uintCnt;
            switch(l_F3DData.f3dversion)
            {
            case F3D_VERSION_23:
              for (i = 0; i < uintCnt; i++){
                // user4
                lxFS_read(buffer,sizeof(float),4,file);
                lxFS_read(vert32->tex,sizeof(float),2,file);
                lxFS_read(vert32->color,sizeof(uchar),4,file);
                //normal
                lxFS_read(buffer,sizeof(float),3,file);
                lxVector3short_FROM_float(vert32->normal,buffer);
                lxFS_read(vert32->pos,sizeof(float),3,file);
                vert32++;
              }
              break;
            case F3D_VERSION_24:
              for (i = 0; i < uintCnt; i++){
                // tex
                lxFS_read(vert32->tex,sizeof(float),2,file);
                // tex2, user4
                lxFS_read(buffer,sizeof(float),6,file);
                // normal
                lxFS_read(buffer,sizeof(float),3,file);
                lxVector3short_FROM_float(vert32->normal,buffer);
                lxFS_read(vert32->color,sizeof(uchar),4,file);
                lxFS_read(vert32->pos,sizeof(float),3,file);
                lxFS_read(buffer,sizeof(float),1,file);
                vert32++;
              }
              break;
            default:
            case F3D_VERSION_25:
              for (i = 0; i < uintCnt; i++){
                // tex
                lxFS_read(vert32->tex,sizeof(float),2,file);
                // tex2, user4
                lxFS_read(buffer,sizeof(float),6,file);
                // normal
                lxFS_read(vert32->normal,sizeof(short),4,file);
                // tangent
                lxFS_read(buffer,sizeof(short),4,file);
                lxFS_read(vert32->pos,sizeof(float),3,file);
                lxFS_read(vert32->color,sizeof(uchar),4,file);
                vert32++;
              }
              break;
            }

            break;
          default:
            LUX_ASSERT(0);
            break;
        }

        // primitive type
        lxFS_read(&uchar,sizeof(uchar),1,file);
        mesh->primtype = f3dPrimType(uchar);
        // total indices count
        uintCnt = 0;
        lxFS_read(&uintCnt,(l_F3DData.f3dversion >= F3D_VERSION_26) ? sizeof(uint) : sizeof(ushort),1,file);
        mesh->index16 = mesh->numAllocVertices <= BIT_ID_FULL16;
        if (mesh->index16)
          mesh->indicesData16 = reszalloc(sizeof(ushort)*uintCnt);
        else
          mesh->indicesData32 = reszalloc(sizeof(uint)*uintCnt);
        mesh->numIndices = mesh->numAllocIndices = uintCnt;
        // group count
        lxFS_read(&ushortCnt,sizeof(ushort),1,file);
        mesh->indicesGroupLength = reszalloc(sizeof(uint)*ushortCnt);
        mesh->numGroups = ushortCnt;
        len = 0;
        for (i = 0; i < ushortCnt; i++){
          // material id (ignored)
          lxFS_read(&ushort1,sizeof(ushort),1,file);

          // indices
          uintCnt = 0;
          lxFS_read(&uintCnt,(l_F3DData.f3dversion >= F3D_VERSION_26) ? sizeof(uint) : sizeof(ushort),1,file);

          mesh->indicesGroupLength[i] = uintCnt;

          if (mesh->numAllocVertices > BIT_ID_FULL16)
            lxFS_read(&mesh->indicesData32[len],sizeof(uint),uintCnt,file);
          else
            lxFS_read(&mesh->indicesData16[len],sizeof(ushort),uintCnt,file);

          len += uintCnt;
        }
        break;
      case IMESH_INST_SHRD_VERT:
      case IMESH_INST_SHRD_VERT_PARENT_MAT:
      /*  <[2] Objekt ID als instanz>
        <[2] Material ID>
        <[2] Total Indices>
        <[2] Polygonlistencount>
          [
          <[2] Material ID>
          <[2] Anzahl der Indices>
            [<[2] Vertex ID>]*/
        mesh = meshobj->mesh = reszalloc(sizeof(Mesh_t));
        mesh->instanceType = f3dInstanceType(type);
        mesh->vertextype = l_F3DData.model->vertextype;
        // instance
        lxFS_read(&ushort1,sizeof(ushort),1,file);
        if (!ushort1){
          LUX_ASSERT(0);
        }
        else{
          mesh->instance = l_F3DData.model->meshObjects[((int)ushort1)-1].mesh;
          if (type == IMESH_INST_SHRD_VERT_PARENT_MAT){
            meshobj->bone = l_F3DData.model->meshObjects[((int)ushort1)-1].bone;
          }
        }

        uchar = (l_F3DData.model->meshObjects[ushort1-1].mesh->numAllocVertices > BIT_ID_FULL16);

        // material
        lxFS_read(&ushort1,sizeof(ushort),1,file);
        meshobj->texRID = ushort1;

        // total indices count
        uintCnt = 0;
        lxFS_read(&uintCnt,(l_F3DData.f3dversion >= F3D_VERSION_26) ? sizeof(uint) : sizeof(ushort),1,file);
        if (uchar)
          mesh->indicesData32 = reszalloc(sizeof(uint)*uintCnt);
        else
          mesh->indicesData16 = reszalloc(sizeof(ushort)*uintCnt);
        mesh->index16 = !uchar;
        mesh->numIndices = mesh->numAllocIndices = uintCnt;
        // group count
        lxFS_read(&ushortCnt,sizeof(ushort),1,file);
        mesh->indicesGroupLength = reszalloc(sizeof(uint)*ushortCnt);
        mesh->numGroups = ushortCnt;
        len = 0;
        for (i = 0; i < ushortCnt; i++){
          // material id
          lxFS_read(&ushort1,sizeof(ushort),1,file);
          // indices
          uintCnt = 0;
          lxFS_read(&uintCnt,(l_F3DData.f3dversion >= F3D_VERSION_26) ? sizeof(uint) : sizeof(ushort),1,file);

          mesh->indicesGroupLength[i] = uintCnt;
          if (uchar)
            lxFS_read(&mesh->indicesData32[len],sizeof(uint),uintCnt,file);
          else
            lxFS_read(&mesh->indicesData16[len],sizeof(ushort),uintCnt,file);

          len += uintCnt;
        }
        break;
      case IMESH_INST_SHRD_VERT_TRIS:
        mesh = meshobj->mesh = reszalloc(sizeof(Mesh_t));
        mesh->instanceType = f3dInstanceType(type);
        mesh->vertextype = l_F3DData.model->vertextype;
        // instance
        lxFS_read(&ushort1,sizeof(ushort),1,file);
        if (!ushort1){
          // ERROR
        }
        mesh->instance = l_F3DData.model->meshObjects[((int)ushort1)-1].mesh;
        mesh->index16 = mesh->instance->index16;
        // material
        lxFS_read(&ushort1,sizeof(ushort),1,file);
        meshobj->texRID = ushort1;
        break;
    }

  }
}
示例#5
0
  int onInit(int argc, const char** argv) {

    // scene
    updateGeometry(4,4,4);
    lxBoundingBox_t bbox;
    lxVector3Set(bbox.min,-1,-1,-1);
    lxVector3Set(bbox.max, 1, 1, 1);
    lxCVector3 up(0,1,0);
    m_rh.init(up);
    m_rh.cameraPerspective(&bbox, 30.0f);
    m_rh.cameraOrtho(&bbox);

    m_texture = RenderHelper::generateUVTexture(256,256);


    // context
    lxgContext_init(&m_ctx);

    // vertices
    size_t vsize = sizeof(VertexDefault) * m_box.numVertices();
    lxgBuffer_init(&m_vbo, &m_ctx, LUXGL_STATIC_DRAW, vsize, NULL);
    uint voffset = lxgBuffer_alloc(&m_vbo, vsize, sizeof(VertexDefault));
    VertexDefault* vertices = (VertexDefault*)lxgBuffer_map(&m_vbo, LUXGFX_ACCESS_WRITEDISCARDALL, NULL);
    m_box.fillVerts(vertices);
    lxgBuffer_unmap(&m_vbo);
    
    // indices
    size_t trisize  = sizeof(uint32) * m_box.numIndicesTris();
    size_t linesize = sizeof(uint32) * m_box.numIndicesLines();
    lxgBuffer_init(&m_ibo, &m_ctx, LUXGL_STATIC_DRAW, trisize + linesize, NULL);

    uint trioffset = lxgBuffer_alloc(&m_ibo, trisize, sizeof(uint32));
    uint32* indicesTris = (uint32*)lxgBuffer_mapRange(&m_ibo, trioffset, trisize,
      LUXGFX_ACCESS_WRITEDISCARDALL,0,0,NULL);
    m_box.fillIndices(LUX_MESH_INDEX_UINT32, indicesTris, voffset / sizeof(VertexDefault));
    lxgBuffer_unmap(&m_ibo);

    uint lineoffset = lxgBuffer_alloc(&m_ibo, linesize, sizeof(uint32));
    uint32* indicesLines = (uint32*)lxgBuffer_mapRange(&m_ibo, lineoffset, linesize,
      LUXGFX_ACCESS_WRITEDISCARDALL,0,0,NULL);
    m_box.fillIndices(LUX_MESH_INDEX_UINT32, indicesLines, voffset / sizeof(VertexDefault), LUX_TRUE);
    lxgBuffer_unmap(&m_ibo);

    // vertexdecl
    m_vattribs = 
      lxgVertexAttrib_bit(LUXGFX_VERTEX_ATTRIB_POS) |
      lxgVertexAttrib_bit(LUXGFX_VERTEX_ATTRIB_NORMAL) |
      lxgVertexAttrib_bit(LUXGFX_VERTEX_ATTRIB_TEXCOORD0);

    m_vdecl.available = m_vattribs;
    m_vdecl.streams = 1;
    VertexDefault* vertex = NULL;
    m_vdecl.table[LUXGFX_VERTEX_ATTRIB_POS] = 
      lxgVertexElement_set(3,LUX_SCALAR_FLOAT32,LUX_FALSE,LUX_FALSE,sizeof(VertexDefault),(size_t)&vertex->pos,0);
    m_vdecl.table[LUXGFX_VERTEX_ATTRIB_NORMAL] = 
      lxgVertexElement_set(3,LUX_SCALAR_FLOAT32,LUX_TRUE,LUX_FALSE,sizeof(VertexDefault),(size_t)&vertex->normal,0);
    m_vdecl.table[LUXGFX_VERTEX_ATTRIB_TEXCOORD0] = 
      lxgVertexElement_set(2,LUX_SCALAR_FLOAT32,LUX_FALSE,LUX_FALSE,sizeof(VertexDefault),(size_t)&vertex->uv,0);
    
    // stream
    m_stream.buffer = &m_vbo;
    m_stream.offset = 0;
    m_stream.len    = vsize;

    return 0;
  }