public void Optmimize <VertexType>() where VertexType : struct
        {
            lock (_lock) {
                _originalObjects = _opaqueObjects.Concat(_transparentObjects).ToList();

                _opaqueObjects.Clear();
                _transparentObjects.Clear();

                // categorize objects:
                var categories = new Dictionary <ObjectCategory, List <I3DObject> >();
                foreach (var obj in _originalObjects)
                {
                    if (!obj.IsOpaque || !obj.IsOptimizable)
                    {
                        Add(obj);
                    }
                    else
                    {
                        var category = ObjectCategory.Create(obj);
                        if (category.BlendStateId == -1) // unknown/custom blendstate
                        {
                            Add(obj);
                        }
                        else
                        {
                            if (categories.ContainsKey(category))
                            {
                                categories[category].Add(obj);
                            }
                            else
                            {
                                categories.Add(category, new List <I3DObject>()
                                {
                                    obj
                                });
                            }
                        }
                    }
                }

                // morph categories of objects into a single geometry object:
                foreach (var category in categories.Keys)
                {
                    var objects = categories[category];
                    if (objects.Count == 1)
                    {
                        AddRange(objects.ToArray());
                    }
                    else
                    {
                        var morphed = new Morphed3DObject <VertexType>(objects);
                        morphed.LoadContent();
                        Add(morphed);
                    }
                }

                Optimized = true;
            }
        }